/ Hex Artifact Content
Login

Artifact 8c873e05436ca8ee0ac4c7825d35ff898abb9c89:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 32 36 31 20 32 30 30 36 2f 30 36 2f 31 33 20  .261 2006/06/13 
0220: 30 34 3a 31 31 3a 34 34 20 64 61 6e 69 65 6c 6b  04:11:44 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 41 53 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _AS ){.    retur
04e0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  n sqlite3ExprAff
04f0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
0500: 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ft);.  }.  if( o
0510: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
0520: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
0530: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0540: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Expr->pSelect->p
0550: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
0560: 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  r);.  }.#ifndef 
0570: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
0580: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41  .  if( op==TK_CA
0590: 53 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ST ){.    return
05a0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
05b0: 54 79 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b  Type(&pExpr->tok
05c0: 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  en);.  }.#endif.
05d0: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
05e0: 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a  affinity;.}../*.
05f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
0600: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
0610: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
0620: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0630: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
0640: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
0650: 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74  lation type, ret
0660: 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65  urn 0..*/.CollSe
0670: 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  q *sqlite3ExprCo
0680: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
0690: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
06a0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
06b0: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  oll = 0;.  if( p
06c0: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Expr ){.    pCol
06d0: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
06e0: 3b 0a 20 20 20 20 69 66 28 20 28 70 45 78 70 72  ;.    if( (pExpr
06f0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 7c 7c 20 70  ->op==TK_AS || p
0700: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53  Expr->op==TK_CAS
0710: 54 29 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  T) && !pColl ){.
0720: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
0730: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
0740: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
0750: 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Left);.    }.  }
0760: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
0770: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
0780: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
0790: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
07a0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
07b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
07c0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
07d0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
07e0: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
07f0: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
0800: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
0810: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
0820: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
0830: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
0840: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
0850: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
0860: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
0870: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
0880: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
0890: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
08a0: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
08b0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
08c0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08d0: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
08e0: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
08f0: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
0900: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
0910: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
0920: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
0930: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
0940: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
0950: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
0960: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
0970: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0980: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
0990: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
09a0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
09b0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
09c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
09d0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
09e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
09f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
0a00: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
0a10: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
0a20: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
0a30: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
0a40: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
0a50: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
0a60: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
0a70: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
0a80: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
0a90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
0aa0: 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NONE;.  }else{.
0ab0: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
0ac0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
0ad0: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
0ae0: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
0af0: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
0b00: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
0b10: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
0b20: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
0b30: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
0b40: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
0b50: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
0b60: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
0b70: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
0b80: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
0b90: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
0ba0: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
0bb0: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
0bc0: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
0bd0: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
0be0: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
0bf0: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
0c00: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
0c10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
0c20: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0c30: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
0c40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
0c50: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
0c60: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
0c70: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
0c80: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
0c90: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
0ca0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ->op==TK_NE );. 
0cb0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0cc0: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
0cd0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
0ce0: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
0cf0: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
0d00: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
0d10: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
0d20: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
0d30: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
0d40: 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
0d50: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
0d60: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
0d70: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
0d80: 74 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  ty(pExpr->pSelec
0d90: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
0da0: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
0db0: 0a 20 20 65 6c 73 65 20 69 66 28 20 21 61 66 66  .  else if( !aff
0dc0: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
0dd0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
0de0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
0df0: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ff;.}../*.** pEx
0e00: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
0e10: 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65  on expression, e
0e20: 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28  g. '=', '<', IN(
0e30: 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78  ...) etc..** idx
0e40: 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65  _affinity is the
0e50: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20   affinity of an 
0e60: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20  indexed column. 
0e70: 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69  Return true.** i
0e80: 66 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  f the index with
0e90: 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66   affinity idx_af
0ea0: 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73  finity may be us
0eb0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
0ec0: 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ** the compariso
0ed0: 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69  n in pExpr..*/.i
0ee0: 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  nt sqlite3IndexA
0ef0: 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a  ffinityOk(Expr *
0f00: 70 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f  pExpr, char idx_
0f10: 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61  affinity){.  cha
0f20: 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73  r aff = comparis
0f30: 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  onAffinity(pExpr
0f40: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66  );.  switch( aff
0f50: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
0f60: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20  ITE_AFF_NONE:.  
0f70: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
0f80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
0f90: 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65  F_TEXT:.      re
0fa0: 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74  turn idx_affinit
0fb0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
0fc0: 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  XT;.    default:
0fd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
0fe0: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
0ff0: 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e  finity(idx_affin
1000: 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ity);.  }.}../*.
1010: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 31  ** Return the P1
1020: 20 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75   value that shou
1030: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ld be used for a
1040: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
1050: 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50  on.** opcode (OP
1060: 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29  _Eq, OP_Ge etc.)
1070: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
1080: 20 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70   pExpr1 and pExp
1090: 72 32 2e 0a 2a 2a 20 49 66 20 6a 75 6d 70 49 66  r2..** If jumpIf
10a0: 4e 75 6c 6c 20 69 73 20 74 72 75 65 2c 20 74 68  Null is true, th
10b0: 65 6e 20 73 65 74 20 74 68 65 20 6c 6f 77 20 62  en set the low b
10c0: 79 74 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  yte of the retur
10d0: 6e 65 64 0a 2a 2a 20 50 31 20 76 61 6c 75 65 20  ned.** P1 value 
10e0: 74 6f 20 74 65 6c 6c 20 74 68 65 20 6f 70 63 6f  to tell the opco
10f0: 64 65 20 74 6f 20 6a 75 6d 70 20 69 66 20 65 69  de to jump if ei
1100: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
1110: 2a 2a 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ** evaluates to 
1120: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
1130: 69 6e 74 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  int binaryCompar
1140: 65 50 31 28 45 78 70 72 20 2a 70 45 78 70 72 31  eP1(Expr *pExpr1
1150: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20  , Expr *pExpr2, 
1160: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1170: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 73 71  .  char aff = sq
1180: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1190: 79 28 70 45 78 70 72 32 29 3b 0a 20 20 72 65 74  y(pExpr2);.  ret
11a0: 75 72 6e 20 28 28 69 6e 74 29 73 71 6c 69 74 65  urn ((int)sqlite
11b0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
11c0: 28 70 45 78 70 72 31 2c 20 61 66 66 29 29 2b 28  (pExpr1, aff))+(
11d0: 6a 75 6d 70 49 66 4e 75 6c 6c 3f 30 78 31 30 30  jumpIfNull?0x100
11e0: 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  :0);.}../*.** Re
11f0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1200: 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  o the collation 
1210: 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 73 68  sequence that sh
1220: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a  ould be used by.
1230: 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  ** a binary comp
1240: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20  arison operator 
1250: 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20  comparing pLeft 
1260: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a  and pRight..**.*
1270: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 68 61  * If the left ha
1280: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  nd expression ha
1290: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
12a0: 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65  quence type, the
12b0: 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e  n it is.** used.
12c0: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
12d0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
12e0: 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20  e for the right 
12f0: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a  hand expression.
1300: 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74  ** is used, or t
1310: 68 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41  he default (BINA
1320: 52 59 29 20 69 66 20 6e 65 69 74 68 65 72 20 65  RY) if neither e
1330: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
1340: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70  collating.** typ
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
1360: 6c 53 65 71 2a 20 62 69 6e 61 72 79 43 6f 6d 70  lSeq* binaryComp
1370: 61 72 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  areCollSeq(Parse
1380: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1390: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
13a0: 67 68 74 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ght){.  CollSeq 
13b0: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
13c0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
13d0: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 69 66  se, pLeft);.  if
13e0: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
13f0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1400: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1410: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  e, pRight);.  }.
1420: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
1430: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1440: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
1450: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
1460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1470: 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50  codeCompare(.  P
1480: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1490: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
14a0: 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61  (and code genera
14b0: 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f  ting) context */
14c0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
14d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
14e0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
14f0: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
1500: 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65  /* The right ope
1510: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  rand */.  int op
1520: 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  code,       /* T
1530: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
1540: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  code */.  int de
1550: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
1560: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
1570: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
1580: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
1590: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
15a0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
15b0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
15c0: 20 70 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p1 = binaryComp
15d0: 61 72 65 50 31 28 70 4c 65 66 74 2c 20 70 52 69  areP1(pLeft, pRi
15e0: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
15f0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 33 20  ;.  CollSeq *p3 
1600: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  = binaryCompareC
1610: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1620: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
1630: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1640: 64 62 65 4f 70 33 28 70 50 61 72 73 65 2d 3e 70  dbeOp3(pParse->p
1650: 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 70 31  Vdbe, opcode, p1
1660: 2c 20 64 65 73 74 2c 20 28 76 6f 69 64 2a 29 70  , dest, (void*)p
1670: 33 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  3, P3_COLLSEQ);.
1680: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
1690: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
16a0: 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74  ion node and ret
16b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
16c0: 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20   it.  Memory.** 
16d0: 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 69 73  for this node is
16e0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
16f0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20  qliteMalloc().  
1700: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
1710: 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
1720: 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
1730: 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20  g sure the node 
1740: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
1750: 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  freed..*/.Expr *
1760: 73 71 6c 69 74 65 33 45 78 70 72 28 69 6e 74 20  sqlite3Expr(int 
1770: 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  op, Expr *pLeft,
1780: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 63   Expr *pRight, c
1790: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
17a0: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
17b0: 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  w;.  pNew = sqli
17c0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
17d0: 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20  (Expr) );.  if( 
17e0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pNew==0 ){.    /
17f0: 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  * When malloc fa
1800: 69 6c 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66  ils, delete pLef
1810: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78  t and pRight. Ex
1820: 70 72 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64  pressions passed
1830: 20 74 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73   to .    ** this
1840: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61   function must a
1850: 6c 77 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74  lways be allocat
1860: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 45  ed with sqlite3E
1870: 78 70 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a  xpr() for this .
1880: 20 20 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a      ** reason. .
1890: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
18a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65  e3ExprDelete(pLe
18b0: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
18c0: 45 78 70 72 44 65 6c 65 74 65 28 70 52 69 67 68  ExprDelete(pRigh
18d0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
18e0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70  ;.  }.  pNew->op
18f0: 20 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70   = op;.  pNew->p
1900: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
1910: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70  pNew->pRight = p
1920: 52 69 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69  Right;.  pNew->i
1930: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Agg = -1;.  if( 
1940: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73  pToken ){.    as
1950: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
1960: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77  n==0 );.    pNew
1970: 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74  ->span = pNew->t
1980: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
1990: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66    }else if( pLef
19a0: 74 20 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20  t && pRight ){. 
19b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70     sqlite3ExprSp
19c0: 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d  an(pNew, &pLeft-
19d0: 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e  >span, &pRight->
19e0: 73 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  span);.  }.  ret
19f0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
1a00: 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** When doing a 
1a10: 6e 65 73 74 65 64 20 70 61 72 73 65 2c 20 79 6f  nested parse, yo
1a20: 75 20 63 61 6e 20 69 6e 63 6c 75 64 65 20 74 65  u can include te
1a30: 72 6d 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73  rms in an expres
1a40: 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f  sion.** that loo
1a50: 6b 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 20 23  k like this:   #
1a60: 30 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65  0 #1 #2 ...  The
1a70: 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74  se terms refer t
1a80: 6f 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e  o elements.** on
1a90: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 22 23 30   the stack.  "#0
1aa0: 22 20 6d 65 61 6e 73 20 74 68 65 20 74 6f 70 20  " means the top 
1ab0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
1ac0: 20 22 23 31 22 20 6d 65 61 6e 73 20 74 68 65 20   "#1" means the 
1ad0: 6e 65 78 74 20 64 6f 77 6e 20 6f 6e 20 74 68 65  next down on the
1ae0: 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 73 6f 20   stack.  And so 
1af0: 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  forth..**.** Thi
1b00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1b10: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1b20: 72 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6f  r to deal with o
1b30: 6e 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  n of those terms
1b40: 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61 74  ..** It immediat
1b50: 65 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ely generates co
1b60: 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
1b70: 76 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72  value in a memor
1b80: 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54  y location..** T
1b90: 68 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78  he returns an ex
1ba0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 69  pression that wi
1bb0: 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  ll code to extra
1bc0: 63 74 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ct the value fro
1bd0: 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79  m.** that memory
1be0: 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65 65   location as nee
1bf0: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ded..*/.Expr *sq
1c00: 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70  lite3RegisterExp
1c10: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1c20: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1c30: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1c40: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78  rse->pVdbe;.  Ex
1c50: 70 72 20 2a 70 3b 0a 20 20 69 6e 74 20 64 65 70  pr *p;.  int dep
1c60: 74 68 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  th;.  if( pParse
1c70: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20  ->nested==0 ){. 
1c80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c90: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72  sg(pParse, "near
1ca0: 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20   \"%T\": syntax 
1cb0: 65 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b  error", pToken);
1cc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1cd0: 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20   }.  if( v==0 ) 
1ce0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20  return 0;.  p = 
1cf0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52  sqlite3Expr(TK_R
1d00: 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20 70  EGISTER, 0, 0, p
1d10: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 3d  Token);.  if( p=
1d20: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1d30: 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66   0;  /* Malloc f
1d40: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 64  ailed */.  }.  d
1d50: 65 70 74 68 20 3d 20 61 74 6f 69 28 28 63 68 61  epth = atoi((cha
1d60: 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  r*)&pToken->z[1]
1d70: 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  );.  p->iTable =
1d80: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
1d90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1da0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64  dOp(v, OP_Dup, d
1db0: 65 70 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c 69  epth, 0);.  sqli
1dc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1dd0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d 3e  OP_MemStore, p->
1de0: 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72 65  iTable, 1);.  re
1df0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1e00: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
1e10: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
1e20: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
1e30: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
1e40: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
1e50: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1e60: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
1e70: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
1e80: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 45 78  qlite3ExprAnd(Ex
1e90: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
1ea0: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
1eb0: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
1ec0: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
1ed0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
1ee0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
1ef0: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
1f00: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
1f10: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
1f20: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
1f30: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1f40: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73  * Set the Expr.s
1f50: 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65  pan field of the
1f60: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1f70: 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a  n to span all.**
1f80: 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68   text between th
1f90: 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65  e two given toke
1fa0: 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
1fb0: 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72  te3ExprSpan(Expr
1fc0: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
1fd0: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
1fe0: 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28  ight){.  assert(
1ff0: 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
2000: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
2010: 20 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   );.  if( !sqlit
2020: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
2030: 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26 26   && pRight->z &&
2040: 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20   pLeft->z ){.   
2050: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
2060: 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74 2d  dyn==0 || pLeft-
2070: 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20  >z[pLeft->n]==0 
2080: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  );.    if( pLeft
2090: 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67  ->dyn==0 && pRig
20a0: 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20  ht->dyn==0 ){.  
20b0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
20c0: 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20  z = pLeft->z;.  
20d0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
20e0: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20  n = pRight->n + 
20f0: 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65  (pRight->z - pLe
2100: 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  ft->z);.    }els
2110: 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e{.      pExpr->
2120: 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  span.z = 0;.    
2130: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
2140: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
2150: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
2160: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69  or a function wi
2170: 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61  th multiple.** a
2180: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70  rguments..*/.Exp
2190: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75  r *sqlite3ExprFu
21a0: 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20  nction(ExprList 
21b0: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
21c0: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
21d0: 70 4e 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20  pNew;.  assert( 
21e0: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
21f0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
2200: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
2210: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
2220: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2230: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
2240: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61  t); /* Avoid lea
2250: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 77 68 65 6e  king memory when
2260: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
2270: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2280: 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20   }.  pNew->op = 
2290: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70  TK_FUNCTION;.  p
22a0: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69  New->pList = pLi
22b0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  st;.  assert( pT
22c0: 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a  oken->dyn==0 );.
22d0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
22e0: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d  *pToken;.  pNew-
22f0: 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f  >span = pNew->to
2300: 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ken;.  return pN
2310: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
2320: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
2330: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
2340: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
2350: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
2360: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
2370: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
2380: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
2390: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
23a0: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
23b0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
23c0: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
23d0: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
23e0: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
23f0: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
2400: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
2410: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
2420: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
2430: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
2440: 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f  ot too be to avo
2450: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
2460: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
2470: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
2480: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
2490: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
24a0: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
24b0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
24c0: 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61  rm ":aaa" or "$a
24d0: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
24e0: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
24f0: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
2500: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
2510: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
2520: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
2530: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
2540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
2550: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
2560: 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69  t sequenial vari
2570: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
2580: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
2590: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
25a0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
25b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
25c0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f  pr *pExpr){.  To
25d0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 69  ken *pToken;.  i
25e0: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
25f0: 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d  turn;.  pToken =
2600: 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a   &pExpr->token;.
2610: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
2620: 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ->n>=1 );.  asse
2630: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30  rt( pToken->z!=0
2640: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
2650: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b  oken->z[0]!=0 );
2660: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e  .  if( pToken->n
2670: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==1 ){.    /* Wi
2680: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
2690: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
26a0: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
26b0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
26c0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
26d0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  ++pParse->nVar;.
26e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b    }else if( pTok
26f0: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  en->z[0]=='?' ){
2700: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
2710: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
2720: 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e  nn".  Convert "n
2730: 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nn" to an intege
2740: 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65  r and.    ** use
2750: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
2760: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
2770: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78    int i;.    pEx
2780: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d  pr->iTable = i =
2790: 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54   atoi((char*)&pT
27a0: 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20  oken->z[1]);.   
27b0: 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51   if( i<1 || i>SQ
27c0: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
27d0: 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20  E_NUMBER ){.    
27e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
27f0: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
2800: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
2810: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
2820: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
2830: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
2840: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20  IABLE_NUMBER);. 
2850: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70     }.    if( i>p
2860: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
2870: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
2880: 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  r = i;.    }.  }
2890: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  else{.    /* Wil
28a0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
28b0: 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61  rm ":aaa" or "$a
28c0: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
28d0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
28e0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
28f0: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
2900: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
2910: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
2920: 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  name.    ** has 
2930: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
2940: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
2950: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
2960: 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20  umber.    */.   
2970: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e   int i, n;.    n
2980: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20   = pToken->n;.  
2990: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
29a0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69  rse->nVarExpr; i
29b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
29c0: 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28  *pE;.      if( (
29d0: 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56  pE = pParse->apV
29e0: 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20  arExpr[i])!=0.  
29f0: 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74          && pE->t
2a00: 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20  oken.n==n.      
2a10: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45      && memcmp(pE
2a20: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65  ->token.z, pToke
2a30: 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  n->z, n)==0 ){. 
2a40: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
2a50: 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c  able = pE->iTabl
2a60: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
2a70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a80: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
2a90: 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20  e->nVarExpr ){. 
2aa0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
2ab0: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
2ac0: 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Var;.      if( p
2ad0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e  Parse->nVarExpr>
2ae0: 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  =pParse->nVarExp
2af0: 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20  rAlloc-1 ){.    
2b00: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
2b10: 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61  ExprAlloc += pPa
2b20: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
2b30: 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  oc + 10;.       
2b40: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72   sqliteReallocOr
2b50: 46 72 65 65 28 28 76 6f 69 64 2a 2a 29 26 70 50  Free((void**)&pP
2b60: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c  arse->apVarExpr,
2b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b80: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
2b90: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69  nVarExprAlloc*si
2ba0: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 70 56  zeof(pParse->apV
2bb0: 61 72 45 78 70 72 5b 30 5d 29 20 29 3b 0a 20 20  arExpr[0]) );.  
2bc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2bd0: 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61  !sqlite3MallocFa
2be0: 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 20 20  iled() ){.      
2bf0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
2c00: 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20 29  ->apVarExpr!=0 )
2c10: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
2c20: 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61 72  ->apVarExpr[pPar
2c30: 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20  se->nVarExpr++] 
2c40: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  = pExpr;.      }
2c50: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f  .    }.  } .}../
2c60: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
2c70: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
2c80: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76  ssion tree..*/.v
2c90: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44  oid sqlite3ExprD
2ca0: 65 6c 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a  elete(Expr *p){.
2cb0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
2cc0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70  urn;.  if( p->sp
2cd0: 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46  an.dyn ) sqliteF
2ce0: 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70  ree((char*)p->sp
2cf0: 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e  an.z);.  if( p->
2d00: 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69  token.dyn ) sqli
2d10: 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d  teFree((char*)p-
2d20: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c  >token.z);.  sql
2d30: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
2d40: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69  ->pLeft);.  sqli
2d50: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
2d60: 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69  >pRight);.  sqli
2d70: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2d80: 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73  e(p->pList);.  s
2d90: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
2da0: 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  te(p->pSelect);.
2db0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
2dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78  .}../*.** The Ex
2dd0: 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d  pr.token field m
2de0: 69 67 68 74 20 62 65 20 61 20 73 74 72 69 6e 67  ight be a string
2df0: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73   literal that is
2e00: 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73   quoted..** If s
2e10: 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71 75  o, remove the qu
2e20: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a  otation marks..*
2e30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
2e40: 71 75 6f 74 65 45 78 70 72 28 45 78 70 72 20 2a  quoteExpr(Expr *
2e50: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
2e60: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20  sAnyProperty(p, 
2e70: 45 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a  EP_Dequoted) ){.
2e80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2e90: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
2ea0: 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64  y(p, EP_Dequoted
2eb0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
2ec0: 6e 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  n.dyn==0 ){.    
2ed0: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
2ee0: 28 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e  (&p->token, &p->
2ef0: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71  token);.  }.  sq
2f00: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28 63 68  lite3Dequote((ch
2f10: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  ar*)p->token.z);
2f20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
2f30: 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f  ollowing group o
2f40: 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20  f routines make 
2f50: 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65  deep copies of e
2f60: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65  xpressions,.** e
2f70: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c  xpression lists,
2f80: 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73   ID lists, and s
2f90: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
2fa0: 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61  .  The copies ca
2fb0: 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20  n.** be deleted 
2fc0: 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64  (by being passed
2fd0: 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63   to their respec
2fe0: 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29  tive ...Delete()
2ff0: 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69   routines).** wi
3000: 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20  thout effecting 
3010: 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a  the originals..*
3020: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
3030: 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e  ion list, ID, an
3040: 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72  d source lists r
3050: 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33  eturn by sqlite3
3060: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a  ExprListDup(),.*
3070: 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  * sqlite3IdListD
3080: 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65  up(), and sqlite
3090: 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61  3SrcListDup() ca
30a0: 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72  n not be further
30b0: 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79   expanded .** by
30c0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
30d0: 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74  s to sqlite*List
30e0: 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  Append() routine
30f0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62  s..**.** Any tab
3100: 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63  les that the Src
3110: 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74  List might point
3120: 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c   to are not dupl
3130: 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  icated..*/.Expr 
3140: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
3150: 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72  Expr *p){.  Expr
3160: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
3170: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3180: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
3190: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
31a0: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
31b0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
31c0: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20  .  memcpy(pNew, 
31d0: 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  p, sizeof(*pNew)
31e0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
31f0: 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e  n.z!=0 ){.    pN
3200: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75  ew->token.z = (u
3210: 38 2a 29 73 71 6c 69 74 65 53 74 72 4e 44 75 70  8*)sqliteStrNDup
3220: 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e  ((char*)p->token
3230: 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  .z, p->token.n);
3240: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
3250: 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  .dyn = 1;.  }els
3260: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
3270: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20  New->token.z==0 
3280: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73  );.  }.  pNew->s
3290: 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65  pan.z = 0;.  pNe
32a0: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
32b0: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 65  e3ExprDup(p->pLe
32c0: 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  ft);.  pNew->pRi
32d0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
32e0: 72 44 75 70 28 70 2d 3e 70 52 69 67 68 74 29 3b  rDup(p->pRight);
32f0: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d  .  pNew->pList =
3300: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3310: 44 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20  Dup(p->pList);. 
3320: 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d   pNew->pSelect =
3330: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
3340: 70 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  p(p->pSelect);. 
3350: 20 70 4e 65 77 2d 3e 70 54 61 62 20 3d 20 70 2d   pNew->pTab = p-
3360: 3e 70 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20  >pTab;.  return 
3370: 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  pNew;.}.void sql
3380: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 54 6f  ite3TokenCopy(To
3390: 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20  ken *pTo, Token 
33a0: 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
33b0: 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74 65  To->dyn ) sqlite
33c0: 46 72 65 65 28 28 63 68 61 72 2a 29 70 54 6f 2d  Free((char*)pTo-
33d0: 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  >z);.  if( pFrom
33e0: 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e  ->z ){.    pTo->
33f0: 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20  n = pFrom->n;.  
3400: 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29    pTo->z = (u8*)
3410: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63  sqliteStrNDup((c
3420: 68 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70  har*)pFrom->z, p
3430: 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54  From->n);.    pT
3440: 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65  o->dyn = 1;.  }e
3450: 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20  lse{.    pTo->z 
3460: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c  = 0;.  }.}.ExprL
3470: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
3480: 4c 69 73 74 44 75 70 28 45 78 70 72 4c 69 73 74  ListDup(ExprList
3490: 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74   *p){.  ExprList
34a0: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
34b0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
34c0: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
34d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
34e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
34f0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
3500: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
3510: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
3520: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
3530: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70   0;.  pNew->nExp
3540: 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  r = pNew->nAlloc
3550: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70   = p->nExpr;.  p
3560: 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d  New->a = pItem =
3570: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
3580: 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70  ->nExpr*sizeof(p
3590: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
35a0: 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20   pItem==0 ){.   
35b0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77   sqliteFree(pNew
35c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
35d0: 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d  .  } .  pOldItem
35e0: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
35f0: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
3600: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
3610: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
3620: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a  xpr *pNewExpr, *
3630: 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49  pOldExpr;.    pI
3640: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65  tem->pExpr = pNe
3650: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  wExpr = sqlite3E
3660: 78 70 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20  xprDup(pOldExpr 
3670: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70  = pOldItem->pExp
3680: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  r);.    if( pOld
3690: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  Expr->span.z!=0 
36a0: 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20  && pNewExpr ){. 
36b0: 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d       /* Always m
36c0: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
36d0: 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c  e span for top-l
36e0: 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73  evel expressions
36f0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
3700: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
3710: 2e 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20  .  The logic in 
3720: 53 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e  SELECT processin
3730: 67 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  g that determine
3740: 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  s.      ** the n
3750: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  ames of columns 
3760: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
3770: 74 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66  t needs this inf
3780: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
3790: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
37a0: 70 79 28 26 70 4e 65 77 45 78 70 72 2d 3e 73 70  py(&pNewExpr->sp
37b0: 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73  an, &pOldExpr->s
37c0: 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pan);.    }.    
37d0: 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72  assert( pNewExpr
37e0: 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d  ==0 || pNewExpr-
37f0: 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20  >span.z!=0 .    
3800: 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45          || pOldE
3810: 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 0a 20  xpr->span.z==0. 
3820: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
3830: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
3840: 64 28 29 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  d() );.    pItem
3850: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
3860: 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  StrDup(pOldItem-
3870: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  >zName);.    pIt
3880: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
3890: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
38a0: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
38b0: 69 73 41 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d  isAgg = pOldItem
38c0: 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 70 49 74  ->isAgg;.    pIt
38d0: 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20  em->done = 0;.  
38e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
38f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
3900: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
3910: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
3920: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
3930: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
3940: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
3950: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3960: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
3970: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
3980: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
3990: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
39a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
39b0: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
39c0: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
39d0: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
39e0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
39f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
3a00: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
3a10: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
3a20: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
3a30: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
3a40: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
3a50: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
3a60: 70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  p(SrcList *p){. 
3a70: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
3a80: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
3a90: 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  Byte;.  if( p==0
3aa0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
3ab0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
3ac0: 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f  ) + (p->nSrc>0 ?
3ad0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
3ae0: 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a   * (p->nSrc-1) :
3af0: 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71   0);.  pNew = sq
3b00: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
3b10: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
3b20: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
3b30: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
3b40: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
3b50: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
3b60: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
3b70: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
3b80: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
3b90: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
3ba0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
3bb0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
3bc0: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
3bd0: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
3be0: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
3bf0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
3c00: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64  qliteStrDup(pOld
3c10: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
3c20: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3c30: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
3c40: 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a  rDup(pOldItem->z
3c50: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
3c60: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
3c70: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
3c80: 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
3c90: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e    pNewItem->join
3ca0: 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  type = pOldItem-
3cb0: 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70  >jointype;.    p
3cc0: 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  NewItem->iCursor
3cd0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75   = pOldItem->iCu
3ce0: 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74  rsor;.    pNewIt
3cf0: 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20  em->isPopulated 
3d00: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f  = pOldItem->isPo
3d10: 70 75 6c 61 74 65 64 3b 0a 20 20 20 20 70 54 61  pulated;.    pTa
3d20: 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54  b = pNewItem->pT
3d30: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ab = pOldItem->p
3d40: 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
3d50: 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  b ){.      pTab-
3d60: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nRef++;.    }. 
3d70: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65     pNewItem->pSe
3d80: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
3d90: 6c 65 63 74 44 75 70 28 70 4f 6c 64 49 74 65 6d  lectDup(pOldItem
3da0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
3db0: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
3dc0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
3dd0: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  OldItem->pOn);. 
3de0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
3df0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
3e00: 69 73 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  istDup(pOldItem-
3e10: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
3e20: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
3e30: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
3e40: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
3e50: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
3e60: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
3e70: 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  up(IdList *p){. 
3e80: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
3e90: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
3ea0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3eb0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
3ec0: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
3ed0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
3ee0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
3ef0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20   0;.  pNew->nId 
3f00: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
3f10: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
3f20: 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  >a = sqliteMallo
3f30: 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73 69 7a  cRaw( p->nId*siz
3f40: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
3f50: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
3f60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
3f70: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  ee(pNew);.    re
3f80: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  turn 0;.  }.  fo
3f90: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
3fa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
3fb0: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
3fc0: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
3fd0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
3fe0: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
3ff0: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
4000: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
4010: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
4020: 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  StrDup(pOldItem-
4030: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
4040: 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c  wItem->idx = pOl
4050: 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a  dItem->idx;.  }.
4060: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
4070: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
4080: 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74  SelectDup(Select
4090: 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a   *p){.  Select *
40a0: 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pNew;.  if( p==0
40b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
40c0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
40d0: 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70  ocRaw( sizeof(*p
40e0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
40f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4100: 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63   pNew->isDistinc
4110: 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
4120: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  t;.  pNew->pELis
4130: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
4140: 69 73 74 44 75 70 28 70 2d 3e 70 45 4c 69 73 74  istDup(p->pEList
4150: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20  );.  pNew->pSrc 
4160: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
4170: 44 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20  Dup(p->pSrc);.  
4180: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73  pNew->pWhere = s
4190: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d  qlite3ExprDup(p-
41a0: 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65 77  >pWhere);.  pNew
41b0: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
41c0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
41d0: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
41e0: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
41f0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
4200: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e  ->pHaving);.  pN
4210: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
4220: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
4230: 70 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  p(p->pOrderBy);.
4240: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
4250: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  op;.  pNew->pPri
4260: 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  or = sqlite3Sele
4270: 63 74 44 75 70 28 70 2d 3e 70 50 72 69 6f 72 29  ctDup(p->pPrior)
4280: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
4290: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
42a0: 70 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  p(p->pLimit);.  
42b0: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
42c0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
42d0: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 4e  ->pOffset);.  pN
42e0: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
42f0: 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74  .  pNew->iOffset
4300: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69   = -1;.  pNew->i
4310: 73 52 65 73 6f 6c 76 65 64 20 3d 20 70 2d 3e 69  sResolved = p->i
4320: 73 52 65 73 6f 6c 76 65 64 3b 0a 20 20 70 4e 65  sResolved;.  pNe
4330: 77 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e 69 73  w->isAgg = p->is
4340: 41 67 67 3b 0a 20 20 70 4e 65 77 2d 3e 75 73 65  Agg;.  pNew->use
4350: 73 45 70 68 6d 20 3d 20 30 3b 0a 20 20 70 4e 65  sEphm = 0;.  pNe
4360: 77 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72  w->disallowOrder
4370: 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  By = 0;.  pNew->
4380: 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
4390: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
43a0: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
43b0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
43c0: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
43d0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
43e0: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  [2] = -1;.  retu
43f0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
4400: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
4410: 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74  SelectDup(Select
4420: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
4430: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
4440: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
4450: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
4460: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
4470: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
4480: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
4490: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
44a0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
44b0: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
44c0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45  ssion list..*/.E
44d0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
44e0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45  ExprListAppend(E
44f0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
4500: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
4510: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 66  en *pName){.  if
4520: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
4530: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
4540: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
4550: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
4560: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
4570: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
4580: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  m;.    }.    ass
4590: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ert( pList->nAll
45a0: 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69  oc==0 );.  }.  i
45b0: 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  f( pList->nAlloc
45c0: 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <=pList->nExpr )
45d0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
45e0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
45f0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74     int n = pList
4600: 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a  ->nAlloc*2 + 4;.
4610: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65      a = sqliteRe
4620: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
4630: 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  n*sizeof(pList->
4640: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
4650: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  a==0 ){.      go
4660: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
4670: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
4680: 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  a;.    pList->nA
4690: 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20  lloc = n;.  }.  
46a0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
46b0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78  !=0 );.  if( pEx
46c0: 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20  pr || pName ){. 
46d0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
46e0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
46f0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
4700: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20  ->nExpr++];.    
4710: 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c  memset(pItem, 0,
4720: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29   sizeof(*pItem))
4730: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
4740: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
4750: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
4760: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
4770: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a  pr = pExpr;.  }.
4780: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
4790: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
47a0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
47b0: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
47c0: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
47d0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
47e0: 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73  lete(pExpr);.  s
47f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4800: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
4810: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4820: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
4830: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  re expression li
4840: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
4850: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4860: 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  e(ExprList *pLis
4870: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
4880: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
4890: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
48a0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
48b0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
48c0: 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70  List->a!=0 || (p
48d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26  List->nExpr==0 &
48e0: 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d  & pList->nAlloc=
48f0: 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =0) );.  assert(
4900: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70   pList->nExpr<=p
4910: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a  List->nAlloc );.
4920: 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
4930: 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
4940: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
4950: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
4960: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4970: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
4980: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
4990: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  tem->zName);.  }
49a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
49b0: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
49c0: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
49d0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
49e0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
49f0: 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20   Call xFunc for 
4a00: 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65  each node visite
4a10: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
4a20: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78  urn value from x
4a30: 46 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20  Func determines 
4a40: 77 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65  whether the tree
4a50: 20 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e   walk continues.
4a60: 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74  .** 0 means cont
4a70: 69 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65  inue walking the
4a80: 20 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20   tree.  1 means 
4a90: 64 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c  do not walk chil
4aa0: 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63  dren.** of the c
4ab0: 75 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20  urrent node but 
4ac0: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69  continue with si
4ad0: 62 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73  blings.  2 means
4ae0: 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20   abandon.** the 
4af0: 74 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65  tree walk comple
4b00: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
4b10: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
4b20: 6d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  m this routine i
4b30: 73 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  s 1 to abandon t
4b40: 68 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20  he tree walk.** 
4b50: 61 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  and 0 to continu
4b60: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a  e..**.** NOTICE:
4b70: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
4b80: 6f 65 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e  oes *not* descen
4b90: 64 20 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65  d into subquerie
4ba0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
4bb0: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78   walkExprList(Ex
4bc0: 70 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a  prList *, int (*
4bd0: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
4be0: 2c 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69  , void *);.stati
4bf0: 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72  c int walkExprTr
4c00: 65 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ee(Expr *pExpr, 
4c10: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
4c20: 64 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  d*,Expr*), void 
4c30: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
4c40: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
4c50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
4c60: 63 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72  c = (*xFunc)(pAr
4c70: 67 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  g, pExpr);.  if(
4c80: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
4c90: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
4ca0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75  Expr->pLeft, xFu
4cb0: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
4cc0: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61  rn 1;.    if( wa
4cd0: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
4ce0: 2d 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c  ->pRight, xFunc,
4cf0: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
4d00: 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  1;.    if( walkE
4d10: 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
4d20: 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  List, xFunc, pAr
4d30: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
4d40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31   }.  return rc>1
4d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
4d60: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66  walkExprTree() f
4d70: 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
4d80: 69 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a  ion in list p..*
4d90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
4da0: 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  kExprList(ExprLi
4db0: 73 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75  st *p, int (*xFu
4dc0: 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72  nc)(void *, Expr
4dd0: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
4de0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
4df0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
4e00: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21   *pItem;.  if( !
4e10: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
4e20: 66 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20  for(i=p->nExpr, 
4e30: 70 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b  pItem=p->a; i>0;
4e40: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
4e50: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
4e60: 54 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  Tree(pItem->pExp
4e70: 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  r, xFunc, pArg) 
4e80: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
4e90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4ea0: 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78  *.** Call walkEx
4eb0: 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65  prTree() for eve
4ec0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
4ed0: 20 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69   Select p, not i
4ee0: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72  ncluding.** expr
4ef0: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
4f00: 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c   part of sub-sel
4f10: 65 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d  ects in any FROM
4f20: 20 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c   clause or the L
4f30: 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45  IMIT.** or OFFSE
4f40: 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a  T expressions...
4f50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
4f60: 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c  lkSelectExpr(Sel
4f70: 65 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46  ect *p, int (*xF
4f80: 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70  unc)(void *, Exp
4f90: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
4fa0: 7b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  {.  walkExprList
4fb0: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e  (p->pEList, xFun
4fc0: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
4fd0: 45 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65  ExprTree(p->pWhe
4fe0: 72 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  re, xFunc, pArg)
4ff0: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  ;.  walkExprList
5000: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46  (p->pGroupBy, xF
5010: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
5020: 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48  lkExprTree(p->pH
5030: 61 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41  aving, xFunc, pA
5040: 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c  rg);.  walkExprL
5050: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
5060: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
5070: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
5080: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5090: 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61 73  e is designed as
50a0: 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61   an xFunc for wa
50b0: 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a  lkExprTree()..**
50c0: 0a 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61 6c  .** pArg is real
50d0: 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
50e0: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20  an integer.  If 
50f0: 77 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c  we can tell by l
5100: 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78  ooking.** at pEx
5110: 70 72 20 74 68 61 74 20 74 68 65 20 65 78 70 72  pr that the expr
5120: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
5130: 61 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e 6f  ains pExpr is no
5140: 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20  t a constant.** 
5150: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
5160: 20 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30 20   set *pArg to 0 
5170: 61 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f 20  and return 2 to 
5180: 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65  abandon the tree
5190: 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78   walk..** If pEx
51a0: 70 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74  pr does does not
51b0: 20 64 69 73 71 75 61 6c 69 66 79 20 74 68 65 20   disqualify the 
51c0: 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
51d0: 62 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74  being a constant
51e0: 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  .** then do noth
51f0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ing..**.** After
5200: 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f   walking the who
5210: 6c 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e  le tree, if no n
5220: 6f 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20 74  odes are found t
5230: 68 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a 2a  hat disqualify.*
5240: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
5250: 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68   as constant, th
5260: 65 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68 65  en we assume the
5270: 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f   whole expressio
5280: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74  n.** is constant
5290: 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
52a0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 66  prIsConstant() f
52b0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
52c0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
52d0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
52e0: 65 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64  eIsConstant(void
52f0: 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45   *pArg, Expr *pE
5300: 78 70 72 29 7b 0a 20 20 73 77 69 74 63 68 28 20  xpr){.  switch( 
5310: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
5320: 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e   /* Consider fun
5330: 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e  ctions to be con
5340: 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65  stant if all the
5350: 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ir arguments are
5360: 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a   constant.    **
5370: 20 61 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a 2f   and *pArg==2 */
5380: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
5390: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
53a0: 20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 3d 3d   *((int*)pArg)==
53b0: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
53c0: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
53d0: 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
53e0: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
53f0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
5400: 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20  ase TK_DOT:.    
5410: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
5420: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
5430: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69  K_AGG_COLUMN:.#i
5440: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5450: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
5460: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
5470: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
5480: 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  S:.#endif.      
5490: 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20  *((int*)pArg) = 
54a0: 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
54b0: 32 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  2;.    case TK_I
54c0: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  N:.      if( pEx
54d0: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
54e0: 20 20 20 20 20 20 20 2a 28 28 69 6e 74 2a 29 70         *((int*)p
54f0: 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20 20 20  Arg) = 0;.      
5500: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
5510: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
5520: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
5530: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  .  }.}../*.** Wa
5540: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
5550: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
5560: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
5570: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
5580: 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e  * and 0 if it in
5590: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
55a0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
55b0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ls..**.** For th
55c0: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
55d0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
55e0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
55f0: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
5600: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
5610: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
5620: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
5630: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
5640: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
5650: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
5660: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
5670: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  t(Expr *p){.  in
5680: 74 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20  t isConst = 1;. 
5690: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c   walkExprTree(p,
56a0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
56b0: 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a  ant, &isConst);.
56c0: 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74    return isConst
56d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
56e0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
56f0: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
5700: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5710: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
5720: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
5730: 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
5740: 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
5750: 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
5760: 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
5770: 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
5780: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
5790: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
57a0: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
57b0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
57c0: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
57d0: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
57e0: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
57f0: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
5800: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
5810: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
5820: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
5830: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
5840: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
5850: 69 73 43 6f 6e 73 74 20 3d 20 32 3b 0a 20 20 77  isConst = 2;.  w
5860: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65  alkExprTree(p, e
5870: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
5880: 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20  t, &isConst);.  
5890: 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 21 3d  return isConst!=
58a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  0;.}../*.** If t
58b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
58c0: 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
58d0: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
58e0: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
58f0: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
5900: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
5910: 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
5920: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
5930: 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
5940: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
5950: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
5960: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
5970: 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
5980: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
5990: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
59a0: 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
59b0: 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
59c0: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
59d0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
59e0: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
59f0: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
5a00: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
5a10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
5a20: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66  EGER: {.      if
5a30: 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ( sqlite3GetInt3
5a40: 32 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  2((char*)p->toke
5a50: 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a  n.z, pValue) ){.
5a60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
5a70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5a80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5a90: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
5aa0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
5ab0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
5ac0: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56  ger(p->pLeft, pV
5ad0: 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alue);.    }.   
5ae0: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
5af0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
5b00: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5b10: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
5b20: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
5b30: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
5b40: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 65  = -v;.        re
5b50: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
5b60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5b70: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
5b80: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
5b90: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
5ba0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
5bb0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
5bc0: 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75  is a row-id colu
5bd0: 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  mn name..*/.int 
5be0: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63  sqlite3IsRowid(c
5bf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
5c00: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
5c10: 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
5c20: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
5c30: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
5c40: 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  rICmp(z, "ROWID"
5c50: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
5c60: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
5c70: 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d  rICmp(z, "OID")=
5c80: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
5c90: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5ca0: 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
5cb0: 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f  me of a column o
5cc0: 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a  f the form X.Y.Z
5cd0: 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20   or Y.Z or just 
5ce0: 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68  Z, look up.** th
5cf0: 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  at name in the s
5d00: 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62  et of source tab
5d10: 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  les in pSrcList 
5d20: 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78  and make the pEx
5d30: 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  pr .** expressio
5d40: 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63  n node refer bac
5d50: 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65  k to that source
5d60: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f   column.  The fo
5d70: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a  llowing changes.
5d80: 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70  ** are made to p
5d90: 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  Expr:.**.**    p
5da0: 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20  Expr->iDb       
5db0: 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64 65      Set the inde
5dc0: 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f  x in db->aDb[] o
5dd0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
5de0: 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  olding.**       
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20    the table..** 
5e10: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
5e20: 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74          Set to t
5e30: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
5e40: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f   for the table o
5e50: 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20  btained.**      
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e70: 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74     from pSrcList
5e80: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  ..**    pExpr->i
5e90: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74  Column       Set
5ea0: 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e   to the column n
5eb0: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68 65  umber within the
5ec0: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45   table..**    pE
5ed0: 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
5ee0: 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c     Set to TK_COL
5ef0: 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  UMN..**    pExpr
5f00: 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20 20  ->pLeft         
5f10: 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
5f20: 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73  his points to is
5f30: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70   deleted.**    p
5f40: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20  Expr->pRight    
5f50: 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69      Any expressi
5f60: 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  on this points t
5f70: 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  o is deleted..**
5f80: 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65 6e  .** The pDbToken
5f90: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
5fa0: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74 68  the database (th
5fb0: 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76 61  e "X").  This va
5fc0: 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55  lue may be.** NU
5fd0: 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  LL meaning that 
5fe0: 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20 66  name is of the f
5ff0: 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41  orm Y.Z or Z.  A
6000: 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74  ny available dat
6010: 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20  abase.** can be 
6020: 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62 6c  used.  The pTabl
6030: 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61  eToken is the na
6040: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6050: 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69 73  (the "Y").  This
6060: 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62 65  .** value can be
6070: 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65   NULL if pDbToke
6080: 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20  n is also NULL. 
6090: 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20   If pTableToken 
60a0: 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65  is NULL it.** me
60b0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f 72  ans that the for
60c0: 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73  m of the name is
60d0: 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75   Z and that colu
60e0: 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62  mns from any tab
60f0: 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  le.** can be use
6100: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
6110: 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  name cannot be r
6120: 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75  esolved unambigu
6130: 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20  ously, leave an 
6140: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
6150: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
6160: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  eturn non-zero. 
6170: 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20   Return zero on 
6180: 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
6190: 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d  ic int lookupNam
61a0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
61b0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se,       /* The
61c0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
61d0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62   */.  Token *pDb
61e0: 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61  Token,     /* Na
61f0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
6200: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
6210: 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ble, or NULL */.
6220: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54    Token *pTableT
6230: 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  oken,  /* Name o
6240: 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  f table containi
6250: 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55  ng column, or NU
6260: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
6270: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20  ColumnToken, /* 
6280: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
6290: 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  mn. */.  NameCon
62a0: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a  text *pNC,    /*
62b0: 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   The name contex
62c0: 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  t used to resolv
62d0: 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  e the name */.  
62e0: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
62f0: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69       /* Make thi
6300: 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e  s EXPR node poin
6310: 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65  t to the selecte
6320: 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  d column */.){. 
6330: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20   char *zDb = 0; 
6340: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
6350: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
6360: 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a  The "X" in X.Y.Z
6370: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62   */.  char *zTab
6380: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
6390: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  me of the table.
63a0: 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59    The "Y" in X.Y
63b0: 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63  .Z or Y.Z */.  c
63c0: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20  har *zCol = 0;  
63d0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
63e0: 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  he column.  The 
63f0: 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  "Z" */.  int i, 
6400: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
6410: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
6420: 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
6430: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6440: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
6450: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
6460: 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b   int cntTab = 0;
6470: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6480: 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  of matching tabl
6490: 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c  e names */.  sql
64a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
64b0: 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
64c0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74 72  atabase */.  str
64d0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
64e0: 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f   *pItem;       /
64f0: 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e  * Use for loopin
6500: 67 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  g over pSrcList 
6510: 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  items */.  struc
6520: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
6530: 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20  pMatch = 0;  /* 
6540: 54 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72  The matching pSr
6550: 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20  cList item */.  
6560: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f  NameContext *pTo
6570: 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20  pNC = pNC;      
6580: 20 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63    /* First namec
6590: 6f 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69  ontext in the li
65a0: 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
65b0: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26   pColumnToken &&
65c0: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a   pColumnToken->z
65d0: 20 29 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20   ); /* The Z in 
65e0: 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20  X.Y.Z cannot be 
65f0: 4e 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20  NULL */.  zDb = 
6600: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
6610: 6f 6b 65 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a  oken(pDbToken);.
6620: 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33    zTab = sqlite3
6630: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
6640: 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43  ableToken);.  zC
6650: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ol = sqlite3Name
6660: 46 72 6f 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d  FromToken(pColum
6670: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73  nToken);.  if( s
6680: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
6690: 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ed() ){.    goto
66a0: 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b   lookupname_end;
66b0: 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69  .  }..  pExpr->i
66c0: 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68  Table = -1;.  wh
66d0: 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d  ile( pNC && cnt=
66e0: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  =0 ){.    ExprLi
66f0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
6700: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
6710: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
6720: 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  t;..    if( pSrc
6730: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f  List ){.      fo
6740: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72  r(i=0, pItem=pSr
6750: 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63  cList->a; i<pSrc
6760: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
6770: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
6780: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
6790: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
67a0: 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  .        Column 
67b0: 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20  *pCol;.  .      
67c0: 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
67d0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73  pTab;.        as
67e0: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
67f0: 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73  .        iDb = s
6800: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
6810: 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
6820: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
6830: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
6840: 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
6850: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
6860: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
6870: 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
6880: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
6890: 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  bName = pItem->z
68a0: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
68b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
68c0: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
68d0: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
68e0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
68f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6900: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
6910: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
6920: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6930: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73  zTabName==0 || s
6940: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
6950: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
6960: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6970: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62           if( zDb
6980: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
6990: 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44  rICmp(db->aDb[iD
69a0: 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d  b].zName, zDb)!=
69b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
69c0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
69d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
69e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
69f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
6a00: 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20  (cntTab++) ){.  
6a10: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
6a20: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
6a30: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
6a40: 20 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61    pExpr->pSchema
6a50: 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61   = pTab->pSchema
6a60: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74  ;.          pMat
6a70: 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20  ch = pItem;.    
6a80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
6a90: 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(j=0, pCol=pTab
6aa0: 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e  ->aCol; j<pTab->
6ab0: 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b  nCol; j++, pCol+
6ac0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
6ad0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
6ae0: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
6af0: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
6b00: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
6b10: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e   *zColl = pTab->
6b20: 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
6b30: 20 20 20 20 20 20 20 20 20 20 20 49 64 4c 69 73             IdLis
6b40: 74 20 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20  t *pUsing;.     
6b50: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
6b60: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6b70: 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d  >iTable = pItem-
6b80: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
6b90: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
6ba0: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Item;.          
6bb0: 20 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61    pExpr->pSchema
6bc0: 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61   = pTab->pSchema
6bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;.            /*
6be0: 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20   Substitute the 
6bf0: 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31  rowid (column -1
6c00: 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45  ) for the INTEGE
6c10: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f  R PRIMARY KEY */
6c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
6c30: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d  pr->iColumn = j=
6c40: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d  =pTab->iPKey ? -
6c50: 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  1 : j;.         
6c60: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
6c70: 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ty = pTab->aCol[
6c80: 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  j].affinity;.   
6c90: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6ca0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
6cb0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
6cc0: 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31  NC(db), zColl,-1
6cd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
6ce0: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69    if( pItem->joi
6cf0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
6d00: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
6d10: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d      /* If this m
6d20: 61 74 63 68 20 6f 63 63 75 72 72 65 64 20 69 6e  atch occurred in
6d30: 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
6d40: 6f 66 20 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69  of a natural joi
6d50: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
6d60: 20 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68   ** then skip th
6d70: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f  e right table to
6d80: 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61   avoid a duplica
6d90: 74 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  te match */.    
6da0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b            pItem+
6db0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
6dc0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
6dd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
6de0: 69 66 28 20 28 70 55 73 69 6e 67 20 3d 20 70 49  if( (pUsing = pI
6df0: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 21 3d 30 20  tem->pUsing)!=0 
6e00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6e10: 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63   /* If this matc
6e20: 68 20 6f 63 63 75 72 73 20 6f 6e 20 61 20 63 6f  h occurs on a co
6e30: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e 20  lumn that is in 
6e40: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
6e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
6e60: 2a 20 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69  * of a join, ski
6e70: 70 20 74 68 65 20 73 65 61 72 63 68 20 6f 66 20  p the search of 
6e80: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
6e90: 6f 66 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20  of the join.    
6ea0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
6eb0: 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74  avoid a duplicat
6ec0: 65 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20 2a  e match there. *
6ed0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
6ee0: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
6ef0: 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
6f00: 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b  pUsing->nId; k++
6f10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6f20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
6f30: 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b  rICmp(pUsing->a[
6f40: 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  k].zName, zCol)=
6f50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6f60: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b          pItem++;
6f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6f80: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
6f90: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6fb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
6fc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
6fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
6fe0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
6ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7000: 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  }.    }..#ifndef
7010: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
7020: 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77  GGER.    /* If w
7030: 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61  e have not alrea
7040: 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20  dy resolved the 
7050: 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65  name, then maybe
7060: 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61   .    ** it is a
7070: 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
7080: 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74  trigger argument
7090: 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a   reference.    *
70a0: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30  /.    if( zDb==0
70b0: 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63   && zTab!=0 && c
70c0: 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  nt==0 && pParse-
70d0: 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29 7b  >trigStack!=0 ){
70e0: 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74  .      TriggerSt
70f0: 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61  ack *pTriggerSta
7100: 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69  ck = pParse->tri
7110: 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54 61  gStack;.      Ta
7120: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20  ble *pTab = 0;. 
7130: 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65       if( pTrigge
7140: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21  rStack->newIdx !
7150: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
7160: 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54  trICmp("new", zT
7170: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
7180: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
7190: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
71a0: 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20  k->newIdx;.     
71b0: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
71c0: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29  gerStack->pTab )
71d0: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
71e0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
71f0: 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pTab;.      }els
7200: 65 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74  e if( pTriggerSt
7210: 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d  ack->oldIdx != -
7220: 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  1 && sqlite3StrI
7230: 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29  Cmp("old", zTab)
7240: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
7250: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
7260: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c  TriggerStack->ol
7270: 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73  dIdx;.        as
7280: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74  sert( pTriggerSt
7290: 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20  ack->pTab );.   
72a0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69       pTab = pTri
72b0: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b  ggerStack->pTab;
72c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
72d0: 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20  if( pTab ){ .   
72e0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20       int iCol;. 
72f0: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70         Column *p
7300: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
7310: 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ;..        pExpr
7320: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62  ->pSchema = pTab
7330: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ->pSchema;.     
7340: 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20     cntTab++;.   
7350: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
7360: 20 69 43 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43   iCol < pTab->nC
7370: 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c  ol; iCol++, pCol
7380: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ++) {.          
7390: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
73a0: 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
73b0: 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zCol)==0 ){.    
73c0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
73d0: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62  ar *zColl = pTab
73e0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f  ->aCol[iCol].zCo
73f0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
7400: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
7410: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
7420: 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e  n = iCol==pTab->
7430: 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f  iPKey ? -1 : iCo
7440: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  l;.            p
7450: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
7460: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7470: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
7480: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
7490: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
74a0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
74b0: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c  C(db), zColl,-1,
74c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
74d0: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
74e0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Tab;.           
74f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7500: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
7510: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
7520: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
7530: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
7540: 45 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20  ER) */..    /*. 
7550: 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68     ** Perhaps th
7560: 65 20 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65  e name is a refe
7570: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57  rence to the ROW
7580: 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ID.    */.    if
7590: 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54  ( cnt==0 && cntT
75a0: 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33  ab==1 && sqlite3
75b0: 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b  IsRowid(zCol) ){
75c0: 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a  .      cnt = 1;.
75d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
75e0: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
75f0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
7600: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
7610: 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  TEGER;.    }..  
7620: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    /*.    ** If t
7630: 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20 74  he input is of t
7640: 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59  he form Z (not Y
7650: 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65  .Z or X.Y.Z) the
7660: 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20  n the name Z.   
7670: 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72 20   ** might refer 
7680: 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65 74  to an result-set
7690: 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68 61   alias.  This ha
76a0: 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
76b0: 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  le, when.    ** 
76c0: 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67  we are resolving
76d0: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48   names in the WH
76e0: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
76f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d  e following comm
7700: 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  and:.    **.    
7710: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
7720: 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c  b AS x FROM tabl
7730: 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20  e WHERE x<10;.  
7740: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63    **.    ** In c
7750: 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20  ases like this, 
7760: 72 65 70 6c 61 63 65 20 70 45 78 70 72 20 77 69  replace pExpr wi
7770: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
7780: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
7790: 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68  .    ** forms th
77a0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e 74  e result set ent
77b0: 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68 65  ry ("a+b" in the
77c0: 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72 65   example) and re
77d0: 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
77e0: 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  ..    ** Note th
77f0: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
7800: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
7810: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
7820: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20  already been.   
7830: 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79 20   ** resolved by 
7840: 74 68 65 20 74 69 6d 65 20 74 68 65 20 57 48 45  the time the WHE
7850: 52 45 20 63 6c 61 75 73 65 20 69 73 20 72 65 73  RE clause is res
7860: 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  olved..    */.  
7870: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
7880: 28 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  (pEList = pNC->p
7890: 45 4c 69 73 74 29 21 3d 30 20 26 26 20 7a 54 61  EList)!=0 && zTa
78a0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  b==0 ){.      fo
78b0: 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d  r(j=0; j<pEList-
78c0: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
78d0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20        char *zAs 
78e0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  = pEList->a[j].z
78f0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
7900: 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69  ( zAs!=0 && sqli
7910: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20  te3StrICmp(zAs, 
7920: 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zCol)==0 ){.    
7930: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
7940: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
7950: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
7960: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
7970: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53  Expr->op = TK_AS
7980: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
7990: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  r->iColumn = j;.
79a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
79b0: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
79c0: 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  ExprDup(pEList->
79d0: 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
79e0: 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a         cnt = 1;.
79f0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
7a00: 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62  ( zTab==0 && zDb
7a10: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
7a20: 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65   goto lookupname
7a30: 5f 65 6e 64 5f 32 3b 0a 20 20 20 20 20 20 20 20  _end_2;.        
7a40: 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d  }.      } .    }
7a50: 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65  ..    /* Advance
7a60: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 61 6d   to the next nam
7a70: 65 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20  e context.  The 
7a80: 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74 20 77  loop will exit w
7a90: 68 65 6e 20 65 69 74 68 65 72 0a 20 20 20 20 2a  hen either.    *
7aa0: 2a 20 77 65 20 68 61 76 65 20 61 20 6d 61 74 63  * we have a matc
7ab0: 68 20 28 63 6e 74 3e 30 29 20 6f 72 20 77 68 65  h (cnt>0) or whe
7ac0: 6e 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  n we run out of 
7ad0: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20  name contexts.. 
7ae0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
7af0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  t==0 ){.      pN
7b00: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
7b10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
7b20: 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20    ** If X and Y 
7b30: 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68  are NULL (in oth
7b40: 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79  er words if only
7b50: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
7b60: 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c   Z is.  ** suppl
7b70: 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c  ied) and the val
7b80: 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f  ue of Z is enclo
7b90: 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75  sed in double-qu
7ba0: 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  otes, then.  ** 
7bb0: 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69  Z is a string li
7bc0: 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73  teral if it does
7bd0: 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f  n't match any co
7be0: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20  lumn names.  In 
7bf0: 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20  that.  ** case, 
7c00: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72  we need to retur
7c10: 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e 64  n right away and
7c20: 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68   not make any ch
7c30: 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45  anges to.  ** pE
7c40: 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  xpr..  **.  ** B
7c50: 65 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65  ecause no refere
7c60: 6e 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20  nce was made to 
7c70: 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20  outer contexts, 
7c80: 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20  the pNC->nRef.  
7c90: 2a 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f  ** fields are no
7ca0: 74 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79  t changed in any
7cb0: 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20   context..  */. 
7cc0: 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a   if( cnt==0 && z
7cd0: 54 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d  Tab==0 && pColum
7ce0: 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22  nToken->z[0]=='"
7cf0: 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ' ){.    sqliteF
7d00: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72  ree(zCol);.    r
7d10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
7d20: 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d  /*.  ** cnt==0 m
7d30: 65 61 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e  eans there was n
7d40: 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31  ot match.  cnt>1
7d50: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65 72   means there wer
7d60: 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f  e two or.  ** mo
7d70: 72 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74  re matches.  Eit
7d80: 68 65 72 20 77 61 79 2c 20 77 65 20 68 61 76 65  her way, we have
7d90: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a   an error..  */.
7da0: 20 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a    if( cnt!=1 ){.
7db0: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b      char *z = 0;
7dc0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  .    char *zErr;
7dd0: 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d  .    zErr = cnt=
7de0: 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f  =0 ? "no such co
7df0: 6c 75 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62  lumn: %s" : "amb
7e00: 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61  iguous column na
7e10: 6d 65 3a 20 25 73 22 3b 0a 20 20 20 20 69 66 28  me: %s";.    if(
7e20: 20 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71   zDb ){.      sq
7e30: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
7e40: 7a 2c 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61  z, zDb, ".", zTa
7e50: 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63  b, ".", zCol, (c
7e60: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d 65 6c  har*)0);.    }el
7e70: 73 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20  se if( zTab ){. 
7e80: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
7e90: 74 72 69 6e 67 28 26 7a 2c 20 7a 54 61 62 2c 20  tring(&z, zTab, 
7ea0: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72  ".", zCol, (char
7eb0: 2a 29 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  *)0);.    }else{
7ec0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
7ed0: 65 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20  eStrDup(zCol);. 
7ee0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7ef0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7f00: 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73   zErr, z);.    s
7f10: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
7f20: 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b    pTopNC->nErr++
7f30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
7f40: 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74   column from a t
7f50: 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74  able in pSrcList
7f60: 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20   is referenced, 
7f70: 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a  then record.  **
7f80: 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 74 68   this fact in th
7f90: 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63  e pSrcList.a[].c
7fa0: 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20  olUsed bitmask. 
7fb0: 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73   Column 0 causes
7fc0: 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62  .  ** bit 0 to b
7fd0: 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31  e set.  Column 1
7fe0: 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e   sets bit 1.  An
7ff0: 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20  d so forth.  If 
8000: 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20  the.  ** column 
8010: 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65  number is greate
8020: 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65  r than the numbe
8030: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  r of bits in the
8040: 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68   bitmask.  ** th
8050: 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 68 2d  en set the high-
8060: 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 68 65  order bit of the
8070: 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20   bitmask..  */. 
8080: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
8090: 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68  umn>=0 && pMatch
80a0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  !=0 ){.    int n
80b0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
80c0: 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73 69  n;.    if( n>=si
80d0: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
80e0: 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 69 7a  ){.      n = siz
80f0: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31  eof(Bitmask)*8-1
8100: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
8110: 72 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72  rt( pMatch->iCur
8120: 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor==pExpr->iTab
8130: 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68  le );.    pMatch
8140: 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 31 3c 3c  ->colUsed |= 1<<
8150: 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61  n;.  }..lookupna
8160: 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43 6c 65  me_end:.  /* Cle
8170: 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
8180: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72  .  */.  sqliteFr
8190: 65 65 28 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  ee(zDb);.  sqlit
81a0: 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 73  eFree(zTab);.  s
81b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
81c0: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
81d0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
81e0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
81f0: 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70  rDelete(pExpr->p
8200: 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d  Right);.  pExpr-
8210: 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70  >pRight = 0;.  p
8220: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
8230: 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65  LUMN;.lookupname
8240: 5f 65 6e 64 5f 32 3a 0a 20 20 73 71 6c 69 74 65  _end_2:.  sqlite
8250: 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66  Free(zCol);.  if
8260: 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  ( cnt==1 ){.    
8270: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
8280: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  ;.    sqlite3Aut
8290: 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45  hRead(pParse, pE
82a0: 78 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  xpr, pNC->pSrcLi
82b0: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61  st);.    if( pMa
82c0: 74 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d 3e  tch && !pMatch->
82d0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
82e0: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
82f0: 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20  Match->pTab;.   
8300: 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d   }.    /* Increm
8310: 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c  ent the nRef val
8320: 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63  ue on all name c
8330: 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70  ontexts from Top
8340: 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20  NC up to.    ** 
8350: 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20  the point where 
8360: 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64  the name matched
8370: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29  . */.    for(;;)
8380: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
8390: 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  pTopNC!=0 );.   
83a0: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b     pTopNC->nRef+
83b0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  +;.      if( pTo
83c0: 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b  pNC==pNC ) break
83d0: 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d  ;.      pTopNC =
83e0: 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a   pTopNC->pNext;.
83f0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
8400: 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   0;.  } else {. 
8410: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
8420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8430: 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e  outine is design
8440: 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66  ed as an xFunc f
8450: 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  or walkExprTree(
8460: 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  )..**.** Resolve
8470: 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20   symbolic names 
8480: 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f  into TK_COLUMN o
8490: 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65  perators for the
84a0: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65   current.** node
84b0: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
84c0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
84d0: 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74   0 to continue t
84e0: 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a  he search down.*
84f0: 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32 20  * the tree or 2 
8500: 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72 65  to abort the tre
8510: 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  e walk..**.** Th
8520: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
8530: 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b  does error check
8540: 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73  ing and name res
8550: 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66  olution for.** f
8560: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20  unction names.  
8570: 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  The operator for
8580: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
8590: 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a  ions is changed.
85a0: 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e  ** to TK_AGG_FUN
85b0: 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  CTION..*/.static
85c0: 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76 65   int nameResolve
85d0: 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72 67  rStep(void *pArg
85e0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
85f0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
8600: 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78  NC = (NameContex
8610: 74 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65  t*)pArg;.  Parse
8620: 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28   *pParse;..  if(
8630: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
8640: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
8650: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  pNC!=0 );.  pPar
8660: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
8670: 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ;..  if( ExprHas
8680: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
8690: 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20  r, EP_Resolved) 
86a0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45 78  ) return 1;.  Ex
86b0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
86c0: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
86d0: 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
86e0: 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53 72  G.  if( pNC->pSr
86f0: 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70 53  cList && pNC->pS
8700: 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30  rcList->nAlloc>0
8710: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
8720: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
8730: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 69  >pSrcList;.    i
8740: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
8750: 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69  0; i<pNC->pSrcLi
8760: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
8770: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
8780: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
8790: 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c  rsor>=0 && pSrcL
87a0: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
87b0: 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b  r<pParse->nTab);
87c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
87d0: 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  f.  switch( pExp
87e0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
87f0: 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  Double-quoted st
8800: 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22  rings (ex: "abc"
8810: 29 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64  ) are used as id
8820: 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20  entifiers if.   
8830: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f   ** possible.  O
8840: 74 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65  therwise they re
8850: 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e  main as strings.
8860: 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a    Single-quoted.
8870: 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28      ** strings (
8880: 65 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61  ex: 'abc') are a
8890: 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74  lways string lit
88a0: 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  erals..    */.  
88b0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
88c0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
88d0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d  xpr->token.z[0]=
88e0: 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20  ='\'' ) break;. 
88f0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
8900: 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44  u into the TK_ID
8910: 20 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73   case if this is
8920: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
8930: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d   string */.    }
8940: 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69  .    /* A lone i
8950: 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65  dentifier is the
8960: 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d   name of a colum
8970: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
8980: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
8990: 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61    lookupName(pPa
89a0: 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70  rse, 0, 0, &pExp
89b0: 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70  r->token, pNC, p
89c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
89d0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  urn 1;.    }.  .
89e0: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e      /* A table n
89f0: 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ame and column n
8a00: 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20  ame:     ID.ID. 
8a10: 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62     ** Or a datab
8a20: 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63  ase, table and c
8a30: 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44  olumn:  ID.ID.ID
8a40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
8a50: 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_DOT: {.     
8a60: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b   Token *pColumn;
8a70: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  .      Token *pT
8a80: 61 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65  able;.      Toke
8a90: 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78  n *pDb;.      Ex
8aa0: 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20  pr *pRight;..   
8ab0: 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69     /* if( pSrcLi
8ac0: 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a  st==0 ) break; *
8ad0: 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  /.      pRight =
8ae0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
8af0: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
8b00: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
8b10: 20 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a         pDb = 0;.
8b20: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
8b30: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
8b40: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
8b50: 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74  Column = &pRight
8b60: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
8b70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
8b80: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70  sert( pRight->op
8b90: 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20  ==TK_DOT );.    
8ba0: 20 20 20 20 70 44 62 20 3d 20 26 70 45 78 70 72      pDb = &pExpr
8bb0: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
8bc0: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
8bd0: 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d   &pRight->pLeft-
8be0: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
8bf0: 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68  pColumn = &pRigh
8c00: 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  t->pRight->token
8c10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8c20: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73  lookupName(pPars
8c30: 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65 2c 20  e, pDb, pTable, 
8c40: 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45  pColumn, pNC, pE
8c50: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
8c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
8c70: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63   /* Resolve func
8c80: 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a  tion names.    *
8c90: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  /.    case TK_CO
8ca0: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
8cb0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
8cc0: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
8cd0: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
8ce0: 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  >pList;    /* Th
8cf0: 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20  e argument list 
8d00: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  */.      int n =
8d10: 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
8d20: 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e  nExpr : 0;  /* N
8d30: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8d40: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
8d50: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
8d60: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
8d70: 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  if no such funct
8d80: 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ion exists */.  
8d90: 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75      int wrong_nu
8da0: 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20  m_args = 0;     
8db0: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67  /* True if wrong
8dc0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
8dd0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
8de0: 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20  t is_agg = 0;   
8df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
8e00: 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65  e if is an aggre
8e10: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
8e20: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
8e30: 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20      int nId;    
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
8e60: 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74  racters in funct
8e70: 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
8e80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
8e90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
8ea0: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
8eb0: 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  me. */.      Fun
8ec0: 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
8ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
8ee0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
8ef0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
8f00: 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e      int enc = EN
8f10: 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20 20  C(pParse->db);  
8f20: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
8f30: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20  encoding */..   
8f40: 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29     zId = (char*)
8f50: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
8f60: 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70        nId = pExp
8f70: 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  r->token.n;.    
8f80: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
8f90: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
8fa0: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
8fb0: 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  d, n, enc, 0);. 
8fc0: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
8fd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
8fe0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
8ff0: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
9000: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c  b, zId, nId, -1,
9010: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
9020: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
9030: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75  .          no_su
9040: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
9050: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9060: 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f        wrong_num_
9070: 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  args = 1;.      
9080: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
9090: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
90a0: 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30  = pDef->xFunc==0
90b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
90c0: 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 70  if( is_agg && !p
90d0: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a  NC->allowAgg ){.
90e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
90f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9100: 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
9110: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e  gate function %.
9120: 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b  *s()", nId,zId);
9130: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
9140: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73  rr++;.        is
9150: 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  _agg = 0;.      
9160: 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63  }else if( no_suc
9170: 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  h_func ){.      
9180: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9190: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
91a0: 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a  ch function: %.*
91b0: 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20  s", nId, zId);. 
91c0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
91d0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
91e0: 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72  if( wrong_num_ar
91f0: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  gs ){.        sq
9200: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9210: 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62  arse,"wrong numb
9220: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
9230: 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  to function %.*s
9240: 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ()",.           
9250: 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20    nId, zId);.   
9260: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
9270: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9280: 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20  if( is_agg ){.  
9290: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
92a0: 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  = TK_AGG_FUNCTIO
92b0: 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  N;.        pNC->
92c0: 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  hasAgg = 1;.    
92d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
92e0: 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f  _agg ) pNC->allo
92f0: 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  wAgg = 0;.      
9300: 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45  for(i=0; pNC->nE
9310: 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b  rr==0 && i<n; i+
9320: 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c 6b  +){.        walk
9330: 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d 3e  ExprTree(pList->
9340: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65  a[i].pExpr, name
9350: 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e  ResolverStep, pN
9360: 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
9370: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70    if( is_agg ) p
9380: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31  NC->allowAgg = 1
9390: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d  ;.      /* FIX M
93a0: 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70  E:  Compute pExp
93b0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65  r->affinity base
93c0: 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65  d on the expecte
93d0: 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  d return.      *
93e0: 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75  * type of the fu
93f0: 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f  nction .      */
9400: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 73  .      return is
9410: 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  _agg;.    }.#ifn
9420: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9430: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
9440: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
9450: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
9460: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
9470: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
9480: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
9490: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ct ){.        in
94a0: 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52  t nRef = pNC->nR
94b0: 65 66 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ef;.#ifndef SQLI
94c0: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
94d0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69        if( pNC->i
94e0: 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20  sCheck ){.      
94f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9500: 4d 73 67 28 70 50 61 72 73 65 2c 22 73 75 62 71  Msg(pParse,"subq
9510: 75 65 72 69 65 73 20 70 72 6f 68 69 62 69 74 65  ueries prohibite
9520: 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74  d in CHECK const
9530: 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  raints");.      
9540: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
9550: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
9560: 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
9570: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
9580: 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 61 73  pNC);.        as
9590: 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e  sert( pNC->nRef>
95a0: 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20 20  =nRef );.       
95b0: 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e   if( nRef!=pNC->
95c0: 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nRef ){.        
95d0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
95e0: 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
95f0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
9600: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9610: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
9620: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9630: 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73 65 20  _CHECK.    case 
9640: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
9650: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73       if( pNC->is
9660: 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  Check ){.       
9670: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9680: 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d 65 74  (pParse,"paramet
9690: 65 72 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  ers prohibited i
96a0: 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  n CHECK constrai
96b0: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  nts");.      }. 
96c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
96d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  }.#endif.  }.  r
96e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
96f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
9700: 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69  alks an expressi
9710: 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f  on tree and reso
9720: 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20  lves references 
9730: 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75  to.** table colu
9740: 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74  mns.  Nodes of t
9750: 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72  he form ID.ID or
9760: 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f   ID resolve into
9770: 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20   an.** index to 
9780: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  the table in the
9790: 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20   table list and 
97a0: 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e  a column offset.
97b0: 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f    The .** Expr.o
97c0: 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e  pcode for such n
97d0: 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64 20  odes is changed 
97e0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54  to TK_COLUMN.  T
97f0: 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a  he Expr.iTable.*
9800: 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  * value is chang
9810: 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ed to the index 
9820: 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
9830: 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  d table in pTabL
9840: 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20  ist.** plus the 
9850: 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54  "base" value.  T
9860: 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77 69  he base value wi
9870: 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65  ll ultimately be
9880: 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45  come the.** VDBE
9890: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
98a0: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
98b0: 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
98c0: 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  o the referenced
98d0: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20  .** table.  The 
98e0: 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c  Expr.iColumn val
98f0: 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ue is changed to
9900: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
9910: 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20  e column .** of 
9920: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
9930: 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e  able.  The Expr.
9940: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f  iColumn value fo
9950: 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  r the special.**
9960: 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73   ROWID column is
9970: 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45   -1.  Any INTEGE
9980: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
9990: 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73  lumn is tried as
99a0: 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72   an.** alias for
99b0: 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c   ROWID..**.** Al
99c0: 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63 74  so resolve funct
99d0: 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63 68  ion names and ch
99e0: 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  eck the function
99f0: 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20  s for proper.** 
9a00: 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75 72  usage.  Make sur
9a10: 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e  e all function n
9a20: 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69  ames are recogni
9a30: 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63  zed and all func
9a40: 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68  tions.** have th
9a50: 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
9a60: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
9a70: 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  Leave an error m
9a80: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
9a90: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20  rse->zErrMsg if 
9aa0: 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73  anything is amis
9ab0: 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  s.  Return the n
9ac0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
9ad0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
9ae0: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
9af0: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
9b00: 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20 74  tions then set t
9b10: 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f  he EP_Agg.** pro
9b20: 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70  perty on the exp
9b30: 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ression..*/.int 
9b40: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
9b50: 76 65 4e 61 6d 65 73 28 0a 20 20 4e 61 6d 65 43  veNames(.  NameC
9b60: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
9b70: 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
9b80: 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65  to resolve expre
9b90: 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20  ssions in. */.  
9ba0: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
9bb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
9bc0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
9bd0: 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a  analyzed. */.){.
9be0: 20 20 69 6e 74 20 73 61 76 65 64 48 61 73 41 67    int savedHasAg
9bf0: 67 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  g;.  if( pExpr==
9c00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
9c10: 73 61 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e  savedHasAgg = pN
9c20: 43 2d 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43  C->hasAgg;.  pNC
9c30: 2d 3e 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20  ->hasAgg = 0;.  
9c40: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78  walkExprTree(pEx
9c50: 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72  pr, nameResolver
9c60: 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 69 66  Step, pNC);.  if
9c70: 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b  ( pNC->nErr>0 ){
9c80: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
9c90: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45  erty(pExpr, EP_E
9ca0: 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rror);.  }.  if(
9cb0: 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 29 7b 0a   pNC->hasAgg ){.
9cc0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
9cd0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67  rty(pExpr, EP_Ag
9ce0: 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  g);.  }else if( 
9cf0: 73 61 76 65 64 48 61 73 41 67 67 20 29 7b 0a 20  savedHasAgg ){. 
9d00: 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d     pNC->hasAgg =
9d10: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
9d20: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
9d30: 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72  (pExpr, EP_Error
9d40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f  );.}../*.** A po
9d50: 69 6e 74 65 72 20 69 6e 73 74 61 6e 63 65 20 6f  inter instance o
9d60: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
9d70: 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 73 73   is used to pass
9d80: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
9d90: 74 68 72 6f 75 67 68 20 77 61 6c 6b 45 78 70 72  through walkExpr
9da0: 54 72 65 65 20 69 6e 74 6f 20 63 6f 64 65 53 75  Tree into codeSu
9db0: 62 71 75 65 72 79 53 74 65 70 28 29 2e 0a 2a 2f  bqueryStep()..*/
9dc0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
9dd0: 51 75 65 72 79 43 6f 64 65 72 20 51 75 65 72 79  QueryCoder Query
9de0: 43 6f 64 65 72 3b 0a 73 74 72 75 63 74 20 51 75  Coder;.struct Qu
9df0: 65 72 79 43 6f 64 65 72 20 7b 0a 20 20 50 61 72  eryCoder {.  Par
9e00: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
9e10: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
9e20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61   context */.  Na
9e30: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20  meContext *pNC; 
9e40: 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
9e50: 6f 66 20 66 69 72 73 74 20 65 6e 63 6c 6f 73 69  of first enclosi
9e60: 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a  ng query */.};..
9e70: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9e80: 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
9e90: 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
9ea0: 61 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  as an expression
9eb0: 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65 72 61  .** and IN opera
9ec0: 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
9ed0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
9ee0: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
9ef0: 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
9f00: 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
9f10: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
9f20: 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
9f30: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
9f40: 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
9f50: 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
9f60: 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
9f70: 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
9f80: 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
9f90: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
9fa0: 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
9fb0: 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
9fc0: 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
9fd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
9fe0: 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
9ff0: 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
a000: 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
a010: 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
a020: 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
a030: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
a040: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
a050: 59 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  Y.void sqlite3Co
a060: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
a070: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
a080: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 74  *pExpr){.  int t
a090: 65 73 74 41 64 64 72 20 3d 20 30 3b 20 20 20 20  estAddr = 0;    
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0b0: 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74     /* One-time t
a0c0: 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20  est address */. 
a0d0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
a0e0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
a0f0: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
a100: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
a110: 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  is code must be 
a120: 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72  run in its entir
a130: 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69  ety every time i
a140: 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
a150: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20  .  ** if any of 
a160: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
a170: 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
a180: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
a190: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
a1a0: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
a1b0: 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
a1c0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
a1d0: 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
a1e0: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
a1f0: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
a200: 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
a210: 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
a220: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
a230: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
a240: 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
a250: 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
a260: 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
a270: 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
a280: 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
a290: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
a2a0: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
a2b0: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
a2c0: 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79   if( !ExprHasAny
a2d0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
a2e0: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26  EP_VarSelect) &&
a2f0: 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   !pParse->trigSt
a300: 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  ack ){.    int m
a310: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
a320: 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  m++;.    sqlite3
a330: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a340: 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 2c 20 30 29  MemLoad, mem, 0)
a350: 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d  ;.    testAddr =
a360: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a370: 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 30  p(v, OP_If, 0, 0
a380: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 74  );.    assert( t
a390: 65 73 74 41 64 64 72 3e 30 20 7c 7c 20 73 71 6c  estAddr>0 || sql
a3a0: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
a3b0: 28 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  () );.    sqlite
a3c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a3d0: 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 6d 65 6d 29  _MemInt, 1, mem)
a3e0: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
a3f0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
a400: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
a410: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
a420: 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  ity;.      KeyIn
a430: 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  fo keyInfo;.    
a440: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
a450: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
a460: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
a470: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
a480: 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79  ..      affinity
a490: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
a4a0: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c  finity(pExpr->pL
a4b0: 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  eft);..      /* 
a4c0: 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
a4d0: 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
a4e0: 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
a4f0: 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
a500: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
a510: 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
a520: 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20  the same way. A 
a530: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73  virtual table is
a540: 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
a550: 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69  d with single-fi
a560: 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72  eld index keys r
a570: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
a580: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
a590: 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
a5a0: 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73   or the <exprlis
a5b0: 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  t>..      **.   
a5c0: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27     ** If the 'x'
a5d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
a5e0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f   column value, o
a5f0: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a  r the SELECT....
a600: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
a610: 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c  nt returns a col
a620: 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  umn value, then 
a630: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
a640: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  that.      ** co
a650: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20  lumn is used to 
a660: 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20  build the index 
a670: 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78  keys. If both 'x
a680: 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  ' and the.      
a690: 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
a6a0: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
a6b0: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
a6c0: 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
a6d0: 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69  d.      ** if ei
a6e0: 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
a6f0: 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
a700: 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
a710: 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  neither.      **
a720: 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
a730: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
a740: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
a750: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
a760: 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ity.      ** is 
a770: 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  used..      */. 
a780: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
a790: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
a7a0: 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20  b++;.      addr 
a7b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
a7c0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  Op(v, OP_OpenEph
a7d0: 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
a7e0: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
a7f0: 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f   memset(&keyInfo
a800: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49  , 0, sizeof(keyI
a810: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79  nfo));.      key
a820: 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b  Info.nField = 1;
a830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a840: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
a850: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78  tNumColumns, pEx
a860: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a  pr->iTable, 1);.
a870: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
a880: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
a890: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20       /* Case 1: 
a8a0: 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
a8b0: 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20  ECT ...).       
a8c0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47   **.        ** G
a8d0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
a8e0: 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  write the result
a8f0: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  s of the select 
a900: 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  into the tempora
a910: 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ry.        ** ta
a920: 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  ble allocated an
a930: 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a  d opened above..
a940: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a950: 20 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70     int iParm = p
a960: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20  Expr->iTable +  
a970: 28 28 28 69 6e 74 29 61 66 66 69 6e 69 74 79 29  (((int)affinity)
a980: 3c 3c 31 36 29 3b 0a 20 20 20 20 20 20 20 20 45  <<16);.        E
a990: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
a9a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a9b0: 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26   (pExpr->iTable&
a9c0: 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78  0x0000FFFF)==pEx
a9d0: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
a9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
a9f0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
aa00: 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  r->pSelect, SRT_
aa10: 53 65 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  Set, iParm, 0, 0
aa20: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
aa30: 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
aa40: 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  >pSelect->pEList
aa50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
aa60: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
aa70: 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20  nExpr>0 ){ .    
aa80: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43        keyInfo.aC
aa90: 6f 6c 6c 5b 30 5d 20 3d 20 62 69 6e 61 72 79 43  oll[0] = binaryC
aaa0: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
aab0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
aac0: 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft,.            
aad0: 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70    pEList->a[0].p
aae0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
aaf0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ab00: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
ab10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
ab20: 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
ab30: 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
ab40: 20 20 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61     **..** For ea
ab50: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62  ch expression, b
ab60: 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65  uild an index ke
ab70: 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75  y from the evalu
ab80: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
ab90: 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e    ** store it in
aba0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
abb0: 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20  able. If <expr> 
abc0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
abd0: 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  n use.        **
abe0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66   that columns af
abf0: 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c  finity when buil
ac00: 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e  ding index keys.
ac10: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f   If <expr> is no
ac20: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  t.        ** a c
ac30: 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72  olumn, use numer
ac40: 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  ic affinity..   
ac50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ac60: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45  int i;.        E
ac70: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
ac80: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
ac90: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
aca0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
acb0: 65 6d 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  em;..        if(
acc0: 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
acd0: 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
ace0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
acf0: 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
ad00: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43        keyInfo.aC
ad10: 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e  oll[0] = pExpr->
ad20: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20  pLeft->pColl;.. 
ad30: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
ad40: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
ad50: 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
ad60: 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
ad70: 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45   for(i=pList->nE
ad80: 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  xpr, pItem=pList
ad90: 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
ada0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
adb0: 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
adc0: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20  Item->pExpr;..  
add0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
ade0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
adf0: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
ae00: 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
ae10: 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
ae20: 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
ae30: 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
ae40: 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
ae50: 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
ae60: 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
ae70: 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
ae80: 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
ae90: 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
aea0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
aeb0: 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
aec0: 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
aed0: 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
aee0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
aef0: 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64       if( testAdd
af00: 72 3e 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  r>0 && !sqlite3E
af10: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
af20: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
af30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
af40: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73  ngeToNoop(v, tes
af50: 74 41 64 64 72 2d 31 2c 20 33 29 3b 0a 20 20 20  tAddr-1, 3);.   
af60: 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64           testAdd
af70: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  r = 0;.         
af80: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
af90: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
afa0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
afb0: 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
afc0: 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
afd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
afe0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
aff0: 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pE2);.          
b000: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
b010: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b020: 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79   1, 0, &affinity
b030: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
b040: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b050: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
b060: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
b070: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
b080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
b090: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
b0a0: 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
b0b0: 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)&keyInfo, P3_K
b0c0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62  EYINFO);.      b
b0d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
b0e0: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
b0f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
b100: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
b110: 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  This has to be a
b120: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
b130: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b140: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
b150: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
b160: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
b170: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
b180: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
b190: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
b1a0: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
b1b0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  olumn..      */.
b1c0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
b1d0: 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b  st Token one = {
b1e0: 20 28 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20   (u8*)"1", 0, 1 
b1f0: 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  };.      Select 
b200: 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *pSel;.      int
b210: 20 69 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74   iMem;.      int
b220: 20 73 6f 70 3b 0a 0a 20 20 20 20 20 20 70 45 78   sop;..      pEx
b230: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d  pr->iColumn = iM
b240: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
b250: 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 6c 20  m++;.      pSel 
b260: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
b270: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
b280: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
b290: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20   ){.        sop 
b2a0: 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
b2b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b2c0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c  dOp(v, OP_MemNul
b2d0: 6c 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l, iMem, 0);.   
b2e0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
b2f0: 28 28 76 2c 20 22 23 20 49 6e 69 74 20 73 75 62  ((v, "# Init sub
b300: 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
b310: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b320: 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f        sop = SRT_
b330: 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20  Exists;.        
b340: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b350: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30  (v, OP_MemInt, 0
b360: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , iMem);.       
b370: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
b380: 20 22 23 20 49 6e 69 74 20 45 58 49 53 54 53 20   "# Init EXISTS 
b390: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
b3a0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b3b0: 45 78 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d  ExprDelete(pSel-
b3c0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
b3d0: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pSel->pLimit = s
b3e0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e  qlite3Expr(TK_IN
b3f0: 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e  TEGER, 0, 0, &on
b400: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
b410: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
b420: 70 53 65 6c 2c 20 73 6f 70 2c 20 69 4d 65 6d 2c  pSel, sop, iMem,
b430: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
b440: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b450: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74  .  }..  if( test
b460: 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Addr ){.    sqli
b470: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
b480: 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20  v, testAddr);.  
b490: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  }.  return;.}.#e
b4a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
b4b0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
b4c0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b4d0: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
b4e0: 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
b4f0: 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
b500: 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
b510: 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74  ..n-1] on the st
b520: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
b530: 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28  oid codeInteger(
b540: 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
b550: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
b560: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 73    int i;.  if( s
b570: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
b580: 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 73 71 6c  , &i) ){.    sql
b590: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b5a0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
b5b0: 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
b5c0: 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42  sqlite3FitsIn64B
b5d0: 69 74 73 28 7a 29 20 29 7b 0a 20 20 20 20 73 71  its(z) ){.    sq
b5e0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
b5f0: 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 30 2c 20  OP_Int64, 0, 0, 
b600: 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  z, n);.  }else{.
b610: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
b620: 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30  p3(v, OP_Real, 0
b630: 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a  , 0, z, n);.  }.
b640: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
b650: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
b660: 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
b670: 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
b680: 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
b690: 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72   and leave the r
b6a0: 65 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70  esult on the top
b6b0: 20 6f 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a   of stack..**.**
b6c0: 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
b6d0: 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
b6e0: 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  hat certain toke
b6f0: 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b  n values (ex: TK
b700: 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20  _EQ).** are the 
b710: 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76  same as opcode v
b720: 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71  alues (ex: OP_Eq
b730: 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  ) that implement
b740: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
b750: 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  ng.** operation.
b760: 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e    Special commen
b770: 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64  ts in vdbe.c and
b780: 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
b790: 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20  wk script in.** 
b7a0: 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73  the make process
b7b0: 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c   cause these val
b7c0: 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41  ues to align.  A
b7d0: 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20  ssert()s in the 
b7e0: 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65  code.** below ve
b7f0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
b800: 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65  mbers are aligne
b810: 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  d correctly..*/.
b820: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
b830: 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72  Code(Parse *pPar
b840: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
b850: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
b860: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
b870: 6e 74 20 6f 70 3b 0a 20 20 69 6e 74 20 73 74 61  nt op;.  int sta
b880: 63 6b 43 68 6e 67 20 3d 20 31 3b 20 20 20 20 2f  ckChng = 1;    /
b890: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 63 68 61 6e  * Amount of chan
b8a0: 67 65 20 74 6f 20 73 74 61 63 6b 20 64 65 70 74  ge to stack dept
b8b0: 68 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30  h */..  if( v==0
b8c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
b8d0: 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
b8e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b8f0: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
b900: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
b910: 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70  .  }.  op = pExp
b920: 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
b930: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
b940: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
b950: 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
b960: 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72  pAggInfo = pExpr
b970: 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
b980: 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
b990: 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41  _col *pCol = &pA
b9a0: 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78  ggInfo->aCol[pEx
b9b0: 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20  pr->iAgg];.     
b9c0: 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e   if( !pAggInfo->
b9d0: 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20  directMode ){.  
b9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b9f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
ba00: 4c 6f 61 64 2c 20 70 43 6f 6c 2d 3e 69 4d 65 6d  Load, pCol->iMem
ba10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 0);.        br
ba20: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
ba30: 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
ba40: 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
ba50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ba60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
ba70: 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
ba80: 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20  >sortingIdx,.   
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
bab0: 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 29 3b  >iSorterColumn);
bac0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
bad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
bae0: 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
baf0: 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
bb00: 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
bb10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
bb20: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
bb30: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
bb40: 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  able<0 ){.      
bb50: 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
bb60: 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69  appens when codi
bb70: 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61  ng check constra
bb80: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
bb90: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
bba0: 63 6b 4f 66 66 73 65 74 3e 30 20 29 3b 0a 20 20  ckOffset>0 );.  
bbb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bbc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
bbd0: 2c 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73  , pParse->ckOffs
bbe0: 65 74 2d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  et-pExpr->iColum
bbf0: 6e 2d 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  n-1, 1);.      }
bc00: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
bc10: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
bc20: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
bc30: 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
bc40: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
bc50: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
bc60: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  mn;.        int 
bc70: 6f 70 20 3d 20 28 70 54 61 62 20 26 26 20 70 54  op = (pTab && pT
bc80: 61 62 2d 3e 69 73 56 69 72 74 75 61 6c 29 20 3f  ab->isVirtual) ?
bc90: 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50   OP_VColumn : OP
bca0: 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  _Column;.       
bcb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bcc0: 70 28 76 2c 20 6f 70 2c 20 70 45 78 70 72 2d 3e  p(v, op, pExpr->
bcd0: 69 54 61 62 6c 65 2c 20 69 43 6f 6c 29 3b 0a 20  iTable, iCol);. 
bce0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
bcf0: 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
bd00: 54 61 62 2c 20 69 43 6f 6c 29 3b 0a 23 69 66 6e  Tab, iCol);.#ifn
bd10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bd20: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
bd30: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20         if( pTab 
bd40: 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  && pTab->aCol[iC
bd50: 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol].affinity==SQ
bd60: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 7b  LITE_AFF_REAL ){
bd70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
bd80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bd90: 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
bda0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  0, 0);.        }
bdb0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
bdc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 61 62  lse{.        Tab
bdd0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
bde0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
bdf0: 69 6e 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26  int op = (pTab &
be00: 26 20 70 54 61 62 2d 3e 69 73 56 69 72 74 75 61  & pTab->isVirtua
be10: 6c 29 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a  l) ? OP_VRowid :
be20: 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 20   OP_Rowid;.     
be30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
be40: 64 4f 70 28 76 2c 20 6f 70 2c 20 70 45 78 70 72  dOp(v, op, pExpr
be50: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
be60: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
be70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
be80: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
be90: 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
bea0: 72 28 76 2c 20 28 63 68 61 72 2a 29 70 45 78 70  r(v, (char*)pExp
beb0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
bec0: 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
bed0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bee0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
bef0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  T:.    case TK_S
bf00: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61  TRING: {.      a
bf10: 73 73 65 72 74 28 20 54 4b 5f 46 4c 4f 41 54 3d  ssert( TK_FLOAT=
bf20: 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20  =OP_Real );.    
bf30: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 54 52    assert( TK_STR
bf40: 49 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e 67 38 20  ING==OP_String8 
bf50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bf60: 44 65 71 75 6f 74 65 45 78 70 72 28 70 45 78 70  DequoteExpr(pExp
bf70: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
bf80: 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20  3VdbeOp3(v, op, 
bf90: 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 70 45 78  0, 0, (char*)pEx
bfa0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
bfb0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
bfc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bfd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
bfe0: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
bff0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c000: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20  P_Null, 0, 0);. 
c010: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c020: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
c030: 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
c040: 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
c050: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
c060: 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
c070: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 61  char *z;.      a
c080: 73 73 65 72 74 28 20 54 4b 5f 42 4c 4f 42 3d 3d  ssert( TK_BLOB==
c090: 4f 50 5f 48 65 78 42 6c 6f 62 20 29 3b 0a 20 20  OP_HexBlob );.  
c0a0: 20 20 20 20 6e 20 3d 20 70 45 78 70 72 2d 3e 74      n = pExpr->t
c0b0: 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20 20  oken.n - 3;.    
c0c0: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 45 78    z = (char*)pEx
c0d0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b  pr->token.z + 2;
c0e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
c0f0: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
c100: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
c110: 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d   z = "";.      }
c120: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c130: 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20  beOp3(v, op, 0, 
c140: 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  0, z, n);.      
c150: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
c160: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
c170: 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
c180: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c190: 4f 70 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c  Op(v, OP_Variabl
c1a0: 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e, pExpr->iTable
c1b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
c1c0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31  pExpr->token.n>1
c1d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c1e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
c1f0: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 45  v, -1, (char*)pE
c200: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
c210: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
c220: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
c230: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
c240: 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
c250: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
c260: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
c270: 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69  emLoad, pExpr->i
c280: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
c290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
c2a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c2b0: 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
c2c0: 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
c2d0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
c2e0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
c2f0: 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
c300: 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  en) */.      int
c310: 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20   aff, to_op;.   
c320: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
c330: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
c340: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
c350: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66  aff = sqlite3Aff
c360: 69 6e 69 74 79 54 79 70 65 28 26 70 45 78 70 72  inityType(&pExpr
c370: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
c380: 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51  to_op = aff - SQ
c390: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20  LITE_AFF_TEXT + 
c3a0: 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20  OP_ToText;.     
c3b0: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
c3c0: 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20  OP_ToText    || 
c3d0: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
c3e0: 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20  TEXT    );.     
c3f0: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
c400: 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20  OP_ToBlob    || 
c410: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
c420: 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20  NONE    );.     
c430: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
c440: 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20  OP_ToNumeric || 
c450: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
c460: 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20  NUMERIC );.     
c470: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
c480: 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20  OP_ToInt     || 
c490: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
c4a0: 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20  INTEGER );.     
c4b0: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
c4c0: 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20  OP_ToReal    || 
c4d0: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
c4e0: 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20  REAL    );.     
c4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c500: 70 28 76 2c 20 74 6f 5f 6f 70 2c 20 30 2c 20 30  p(v, to_op, 0, 0
c510: 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68  );.      stackCh
c520: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  ng = 0;.      br
c530: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
c540: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c550: 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
c560: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
c570: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
c580: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
c590: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
c5a0: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
c5b0: 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
c5c0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
c5d0: 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Lt );.      a
c5e0: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50  ssert( TK_LE==OP
c5f0: 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Le );.      ass
c600: 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47  ert( TK_GT==OP_G
c610: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
c620: 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20  t( TK_GE==OP_Ge 
c630: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c640: 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b   TK_EQ==OP_Eq );
c650: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c660: 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  K_NE==OP_Ne );. 
c670: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c680: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
c690: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
c6a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c6b0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
c6c0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
c6d0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
c6e0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
c6f0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
c700: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
c710: 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31    stackChng = -1
c720: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c730: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c740: 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
c750: 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
c760: 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
c770: 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
c780: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
c790: 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
c7a0: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
c7b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
c7c0: 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
c7d0: 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
c7e0: 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
c7f0: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
c800: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
c810: 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
c820: 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
c830: 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
c840: 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
c850: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
c860: 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
c870: 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  dd );.      asse
c880: 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
c890: 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20  _Subtract );.   
c8a0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45     assert( TK_RE
c8b0: 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20  M==OP_Remainder 
c8c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c8d0: 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
c8e0: 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  itAnd );.      a
c8f0: 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
c900: 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20  =OP_BitOr );.   
c910: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
c920: 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
c930: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c940: 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
c950: 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  iftLeft );.     
c960: 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
c970: 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
c980: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
c990: 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50  t( TK_CONCAT==OP
c9a0: 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20  _Concat );.     
c9b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c9c0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c9d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
c9e0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c9f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
ca00: 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ght);.      sqli
ca10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ca20: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
ca30: 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31 3b   stackChng = -1;
ca40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ca50: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ca60: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
ca70: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
ca80: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
ca90: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
caa0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
cab0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
cac0: 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   || pLeft->op==T
cad0: 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
cae0: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20       Token *p = 
caf0: 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  &pLeft->token;. 
cb00: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
cb10: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
cb20: 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70  "-%.*s", p->n, p
cb30: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ->z);.        if
cb40: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
cb50: 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
cb60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
cb70: 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  3(v, OP_Real, 0,
cb80: 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a   0, z, p->n+1);.
cb90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cba0: 20 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74           codeInt
cbb0: 65 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b  eger(v, z, p->n+
cbc0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
cbd0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
cbe0: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  (z);.        bre
cbf0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
cc00: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
cc10: 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f  h into TK_NOT */
cc20: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
cc30: 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
cc40: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
cc50: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
cc60: 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
cc70: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
cc80: 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
cc90: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
cca0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ccb0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
ccc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ccd0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
cce0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63  , 0);.      stac
ccf0: 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  kChng = 0;.     
cd00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
cd10: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
cd20: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
cd30: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
cd40: 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 61  nt dest;.      a
cd50: 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
cd60: 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
cd70: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
cd80: 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
cd90: 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ull );.      sql
cda0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cdb0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
cdc0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
cdd0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
cde0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
cdf0: 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71  .      dest = sq
ce00: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
ce10: 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20  Addr(v) + 2;.   
ce20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ce30: 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
ce40: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
ce50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ce60: 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29  P_AddImm, -1, 0)
ce70: 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e  ;.      stackChn
ce80: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  g = 0;.      bre
ce90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
cea0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
ceb0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  ON: {.      AggI
cec0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78  nfo *pInfo = pEx
ced0: 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
cee0: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30      if( pInfo==0
cef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
cf00: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
cf10: 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
cf20: 67 67 72 65 67 61 74 65 3a 20 25 54 22 2c 0a 20  ggregate: %T",. 
cf30: 20 20 20 20 20 20 20 20 20 20 20 26 70 45 78 70             &pExp
cf40: 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  r->span);.      
cf50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
cf60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cf70: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
cf80: 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
cf90: 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 2c 20 30  r->iAgg].iMem, 0
cfa0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
cfb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
cfc0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
cfd0: 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54  FUNC:.    case T
cfe0: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
cff0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
d000: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
d010: 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  st;.      int nE
d020: 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  xpr = pList ? pL
d030: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
d040: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
d050: 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Def;.      int n
d060: 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  Id;.      const 
d070: 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20  char *zId;.     
d080: 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   int constMask =
d090: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   0;.      int i;
d0a0: 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
d0b0: 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
d0c0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
d0d0: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
d0e0: 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45   zId = (char*)pE
d0f0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  xpr->token.z;.  
d100: 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d      nId = pExpr-
d110: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  >token.n;.      
d120: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
d130: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
d140: 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  e->db, zId, nId,
d150: 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b   nExpr, enc, 0);
d160: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d170: 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Def!=0 );.      
d180: 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  nExpr = sqlite3E
d190: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
d1a0: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a  pParse, pList);.
d1b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
d1c0: 3c 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20  <nExpr && i<32; 
d1d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
d1e0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  ( sqlite3ExprIsC
d1f0: 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61  onstant(pList->a
d200: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
d210: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
d220: 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20  k |= (1<<i);.   
d230: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
d240: 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c  f( pDef->needCol
d250: 6c 53 65 71 20 26 26 20 21 70 43 6f 6c 6c 20 29  lSeq && !pColl )
d260: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
d270: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
d280: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
d290: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d2a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d2b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
d2c0: 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  Def->needCollSeq
d2d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
d2e0: 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
d2f0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
d300: 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20  ltColl; .       
d310: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
d320: 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
d330: 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
d340: 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P3_COLLSEQ);
d350: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
d360: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
d370: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f   OP_Function, co
d380: 6e 73 74 4d 61 73 6b 2c 20 6e 45 78 70 72 2c 20  nstMask, nExpr, 
d390: 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f  (char*)pDef, P3_
d3a0: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
d3b0: 73 74 61 63 6b 43 68 6e 67 20 3d 20 31 2d 6e 45  stackChng = 1-nE
d3c0: 78 70 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  xpr;.      break
d3d0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
d3e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
d3f0: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
d400: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
d410: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
d420: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
d430: 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  iColumn==0 ){.  
d440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
d450: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
d460: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
d470: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
d480: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d490: 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e  MemLoad, pExpr->
d4a0: 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  iColumn, 0);.   
d4b0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d4c0: 76 2c 20 22 23 20 6c 6f 61 64 20 73 75 62 71 75  v, "# load subqu
d4d0: 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
d4e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d4f0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
d500: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
d510: 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61  dr;.      char a
d520: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 69  ffinity;.      i
d530: 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50  nt ckOffset = pP
d540: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a  arse->ckOffset;.
d550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
d560: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
d570: 65 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  e, pExpr);..    
d580: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
d590: 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
d5a0: 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
d5b0: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
d5c0: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ults.      ** of
d5d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
d5e0: 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
d5f0: 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
d600: 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
d610: 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20  .      ** P3 of 
d620: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
d630: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66       */.      af
d640: 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
d650: 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
d660: 72 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  r);..      sqlit
d670: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d680: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29  P_Integer, 1, 0)
d690: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
d6a0: 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66 66  ckOffset = ckOff
d6b0: 73 65 74 2b 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  set+1;..      /*
d6c0: 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e   Code the <expr>
d6d0: 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
d6e0: 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d   (...)". The tem
d6f0: 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20  porary table.   
d700: 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61     ** pExpr->iTa
d710: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ble contains the
d720: 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
d730: 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73  e up the (...) s
d740: 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  et..      */.   
d750: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
d760: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
d770: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
d780: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
d790: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d7a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d7b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
d7c0: 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72  otNull, -1, addr
d7d0: 2b 34 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  +4);            
d7e0: 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a 20  /* addr + 0 */. 
d7f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d800: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
d810: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   2, 0);.      sq
d820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d830: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
d840: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d850: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
d860: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b  oto, 0, addr+7);
d870: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d880: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
d890: 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61  Record, 1, 0, &a
d8a0: 66 66 69 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f  ffinity, 1);   /
d8b0: 2a 20 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20  * addr + 4 */.  
d8c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d8d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  ddOp(v, OP_Found
d8e0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
d8f0: 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20   addr+7);.      
d900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d910: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d  (v, OP_AddImm, -
d920: 31 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20 20  1, 0);          
d930: 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20          /* addr 
d940: 2b 20 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72  + 6 */..      br
d950: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
d960: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  f.    case TK_BE
d970: 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
d980: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
d990: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
d9a0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
d9b0: 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20  _item *pLItem = 
d9c0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b  pExpr->pList->a;
d9d0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
d9e0: 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
d9f0: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
da00: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
da10: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  e, pLeft);.     
da20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
da30: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
da40: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
da50: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
da60: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
da70: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
da80: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
da90: 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29  ht, OP_Ge, 0, 0)
daa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dab0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
dac0: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
dad0: 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20    pLItem++;.    
dae0: 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65    pRight = pLIte
daf0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
db00: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
db10: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
db20: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
db30: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
db40: 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
db50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
db60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
db70: 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b  , OP_And, 0, 0);
db80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
db90: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
dba0: 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  UPLUS:.    case 
dbb0: 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73  TK_AS: {.      s
dbc0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
dbd0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
dbe0: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 74 61 63  eft);.      stac
dbf0: 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  kChng = 0;.     
dc00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
dc10: 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20    case TK_CASE: 
dc20: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70 72  {.      int expr
dc30: 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20  _end_label;.    
dc40: 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a    int jumpInst;.
dc50: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
dc60: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
dc70: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
dc80: 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75  List;.      stru
dc90: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
dca0: 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20 20   *aListelem;..  
dcb0: 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
dcc0: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
dcd0: 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70  assert((pExpr->p
dce0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29  List->nExpr % 2)
dcf0: 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73   == 0);.      as
dd00: 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  sert(pExpr->pLis
dd10: 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20  t->nExpr > 0);. 
dd20: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
dd30: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
dd40: 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
dd50: 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
dd60: 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
dd70: 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72  Expr;.      expr
dd80: 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c  _end_label = sql
dd90: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
dda0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l(v);.      if( 
ddb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
ddc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ddd0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
dde0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
ddf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
de00: 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
de10: 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
de20: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
de30: 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
de40: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
de50: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
de60: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
de70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
de80: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c  Op(v, OP_Dup, 1,
de90: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a   1);.          j
dea0: 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64 65 43 6f  umpInst = codeCo
deb0: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
dec0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69 73  xpr->pLeft, aLis
ded0: 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a  telem[i].pExpr,.
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a 20   OP_Ne, 0, 1);. 
df10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
df20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
df30: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
df40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
df50: 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20       jumpInst = 
df60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
df70: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c  (v, OP_IfNot, 1,
df80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
df90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
dfa0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
dfb0: 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
dfc0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
dfd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
dfe0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78  , OP_Goto, 0, ex
dff0: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20  pr_end_label);. 
e000: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e010: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 75  beJumpHere(v, ju
e020: 6d 70 49 6e 73 74 29 3b 0a 20 20 20 20 20 20 7d  mpInst);.      }
e030: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
e040: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
e050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e060: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
e070: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
e080: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
e090: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
e0a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e0b0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
e0c0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d  pRight);.      }
e0d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
e0e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e0f0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
e100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e110: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e120: 76 65 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f  veLabel(v, expr_
e130: 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20  end_label);.    
e140: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
e150: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e160: 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
e170: 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
e180: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
e190: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a  e->trigStack ){.
e1a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e1b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20         "RAISE() 
e1e0: 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
e1f0: 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
e200: 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 09 72 65  r-program");..re
e210: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
e220: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
e230: 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72  Column!=OE_Ignor
e240: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73  e ){.         as
e250: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
e260: 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  lumn==OE_Rollbac
e270: 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  k ||.           
e280: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
e290: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74  lumn == OE_Abort
e2a0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
e2b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
e2c0: 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29  umn == OE_Fail )
e2d0: 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
e2e0: 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 45  e3DequoteExpr(pE
e2f0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 73  xpr);.         s
e300: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
e310: 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
e320: 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78  _CONSTRAINT, pEx
e330: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70       (char*)pExp
e360: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
e370: 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
e380: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
e390: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
e3a0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
e3b0: 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20  E_Ignore );.    
e3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e3d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74  AddOp(v, OP_Cont
e3e0: 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  extPop, 0, 0);. 
e3f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e400: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
e410: 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  oto, 0, pParse->
e420: 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72  trigStack->ignor
e430: 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20  eJump);.        
e440: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
e450: 20 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52 45   "# raise(IGNORE
e460: 29 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )"));.      }.  
e470: 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
e480: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
e490: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
e4a0: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
e4b0: 63 6b 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  ckOffset ){.    
e4c0: 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
e4d0: 20 2b 3d 20 73 74 61 63 6b 43 68 6e 67 3b 0a 20   += stackChng;. 
e4e0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
e4f0: 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29 3b 0a 20  e->ckOffset );. 
e500: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
e510: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
e520: 52 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  R./*.** Generate
e530: 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75   code that evalu
e540: 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
e550: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61  pression and lea
e560: 76 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  ves the result.*
e570: 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  * on the stack. 
e580: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
e590: 33 45 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a  3ExprCode()..**.
e5a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e5b0: 6d 69 67 68 74 20 61 6c 73 6f 20 63 61 63 68 65  might also cache
e5c0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20   the result and 
e5d0: 6d 6f 64 69 66 79 20 74 68 65 20 70 45 78 70 72  modify the pExpr
e5e0: 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61 74   tree.** so that
e5f0: 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 73   it will make us
e600: 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 64 20  e of the cached 
e610: 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
e620: 75 65 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e 73  uent evaluations
e630: 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
e640: 65 76 61 6c 75 61 74 65 20 74 68 65 20 77 68 6f  evaluate the who
e650: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67  le expression ag
e660: 61 69 6e 2e 20 20 54 72 69 76 69 61 6c 20 65 78  ain.  Trivial ex
e670: 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
e680: 20 6e 6f 74 20 63 61 63 68 65 64 2e 20 20 49 66   not cached.  If
e690: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e6a0: 69 73 20 63 61 63 68 65 64 2c 20 69 74 73 20 72  is cached, its r
e6b0: 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20  esult is stored 
e6c0: 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  in a .** memory 
e6d0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  location..*/.voi
e6e0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
e6f0: 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20  eAndCache(Parse 
e700: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
e710: 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76  Expr){.  Vdbe *v
e720: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
e730: 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20  ;.  int iMem;.  
e740: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
e750: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
e760: 65 74 75 72 6e 3b 0a 20 20 61 64 64 72 31 20 3d  eturn;.  addr1 =
e770: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
e780: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73 71  entAddr(v);.  sq
e790: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e7a0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
e7b0: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
e7c0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
e7d0: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 32 3e 61  );.  if( addr2>a
e7e0: 64 64 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74 65  ddr1+1 || sqlite
e7f0: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64  3VdbeGetOp(v, ad
e800: 64 72 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  dr1)->opcode==OP
e810: 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20 20  _Function ){.   
e820: 20 69 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e 69   iMem = pExpr->i
e830: 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
e840: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nMem++;.    sqli
e850: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e860: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65  OP_MemStore, iMe
e870: 6d 2c 20 30 29 3b 0a 20 20 20 20 70 45 78 70 72  m, 0);.    pExpr
e880: 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
e890: 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  ER;.  }.}.#endif
e8a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
e8b0: 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
e8c0: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
e8d0: 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
e8e0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
e8f0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e 74  ression list ont
e900: 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  o the stack..**.
e910: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
e920: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
e930: 20 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65   pushed onto the
e940: 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73   stack..*/.int s
e950: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
e960: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
e970: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
e980: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
e990: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
e9a0: 4c 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20 65  List    /* The e
e9b0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
e9c0: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29 7b  o be coded */.){
e9d0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
e9e0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
e9f0: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66    int i, n;.  if
ea00: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
ea10: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c 69  urn 0;.  n = pLi
ea20: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72  st->nExpr;.  for
ea30: 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
ea40: 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20   i=n; i>0; i--, 
ea50: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
ea60: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ea70: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
ea80: 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
ea90: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n n;.}../*.** Ge
eaa0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
eab0: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
eac0: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
ead0: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
eae0: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
eaf0: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
eb00: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
eb10: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
eb20: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
eb30: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
eb40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
eb50: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
eb60: 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
eb70: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
eb80: 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
eb90: 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
eba0: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
ebb0: 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
ebc0: 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  flag is true..**
ebd0: 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
ebe0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
ebf0: 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
ec00: 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
ec10: 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
ec20: 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
ec30: 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
ec40: 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
ec50: 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
ec60: 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
ec70: 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
ec80: 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
ec90: 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
eca0: 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
ecb0: 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
ecc0: 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
ecd0: 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
ece0: 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
ecf0: 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
ed00: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
ed10: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
ed20: 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
ed30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
ed40: 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
ed50: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
ed60: 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
ed70: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
ed80: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
ed90: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
eda0: 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
edb0: 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73  ckOffset = pPars
edc0: 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69  e->ckOffset;.  i
edd0: 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
ede0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
edf0: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
ee00: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
ee10: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
ee20: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
ee30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
ee40: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
ee50: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
ee60: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
ee70: 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a  r->pLeft, d2, !j
ee80: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
ee90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
eea0: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
eeb0: 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
eec0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
eed0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
eee0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
eef0: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
ef00: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ef10: 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73  TK_OR: {.      s
ef20: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
ef30: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
ef40: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
ef50: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
ef60: 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
ef70: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
ef80: 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
ef90: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
efa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
efb0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
efc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
efd0: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
efe0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
eff0: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
f000: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
f010: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f020: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
f030: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
f040: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
f050: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
f060: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
f070: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
f080: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
f090: 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
f0a0: 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
f0b0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
f0c0: 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
f0d0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f0e0: 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
f0f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
f100: 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
f110: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
f120: 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
f130: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f140: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
f150: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
f160: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f170: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
f180: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
f190: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
f1a0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
f1b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
f1c0: 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  p, dest, jumpIfN
f1d0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
f1e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f1f0: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
f200: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
f210: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
f220: 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
f230: 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  IsNull );.      
f240: 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
f250: 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
f260: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
f270: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
f280: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
f290: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f2a0: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20  AddOp(v, op, 1, 
f2b0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
f2c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f2d0: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
f2e0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
f2f0: 70 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54 57  pression "x BETW
f300: 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73 20  EEN y AND z" is 
f310: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a  implemented as:.
f320: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
f330: 2a 20 31 20 49 46 20 28 78 20 3c 20 79 29 20 47  * 1 IF (x < y) G
f340: 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32  OTO 3.      ** 2
f350: 20 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f 54   IF (x <= z) GOT
f360: 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a  O <dest>.      *
f370: 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  * 3 ....      */
f380: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
f390: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
f3a0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
f3b0: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
f3c0: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
f3d0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
f3e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
f3f0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
f400: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
f410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f420: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
f430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f440: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f450: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64  Right);.      ad
f460: 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65  dr = codeCompare
f470: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
f480: 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c 20 30  pRight, OP_Lt, 0
f490: 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
f4a0: 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
f4b0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
f4c0: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  1].pExpr;.      
f4d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f4e0: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
f4f0: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
f500: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
f510: 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
f520: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
f530: 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  l);..      sqlit
f540: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f550: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
f560: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f570: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
f580: 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
f590: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f5a0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
f5b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f5c0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
f5d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f5e0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f5f0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
f600: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f610: 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75   OP_If, jumpIfNu
f620: 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ll, dest);.     
f630: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f640: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66  }.  pParse->ckOf
f650: 66 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b  fset = ckOffset;
f660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
f670: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
f680: 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
f690: 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
f6a0: 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
f6b0: 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
f6c0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
f6d0: 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
f6e0: 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
f6f0: 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
f700: 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
f710: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
f720: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
f730: 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
f740: 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
f750: 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
f760: 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  e) then.** jump 
f770: 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
f780: 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68   true or fall th
f790: 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
f7a0: 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f  ull is false..*/
f7b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
f7c0: 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
f7d0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
f7e0: 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
f7f0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
f800: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
f810: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
f820: 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63   op = 0;.  int c
f830: 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65  kOffset = pParse
f840: 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69 66  ->ckOffset;.  if
f850: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
f860: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
f870: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
f880: 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
f890: 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
f8a0: 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
f8b0: 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
f8c0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
f8d0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
f8e0: 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
f8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
f900: 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
f910: 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
f920: 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
f930: 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
f940: 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
f950: 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
f960: 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
f970: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
f990: 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
f9a0: 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
f9b0: 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
f9c0: 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
f9d0: 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
f9e0: 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
f9f0: 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
fa00: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
fa20: 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
fa30: 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
fa40: 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
fa50: 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
fa60: 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
fa70: 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
fa80: 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
fa90: 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
faa0: 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
fab0: 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
fac0: 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
fad0: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
fae0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
faf0: 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
fb00: 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
fb10: 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
fb20: 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
fb30: 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
fb40: 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
fb50: 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
fb60: 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
fb70: 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
fb80: 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
fb90: 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
fba0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
fbb0: 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
fbc0: 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
fbd0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
fbe0: 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
fbf0: 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
fc00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
fc10: 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
fc20: 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
fc30: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
fc40: 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
fc50: 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
fc60: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
fc70: 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
fc80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
fc90: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
fca0: 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
fcb0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
fcc0: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
fcd0: 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
fce0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
fcf0: 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
fd00: 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
fd10: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
fd20: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
fd30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fd40: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
fd50: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
fd60: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
fd70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
fd80: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
fd90: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
fda0: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
fdb0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
fdc0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fdd0: 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
fde0: 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
fdf0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
fe00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
fe10: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
fe20: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
fe30: 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  2, !jumpIfNull);
fe40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
fe50: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
fe60: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
fe70: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
fe80: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
fe90: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
fea0: 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
feb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fec0: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
fed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fee0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
fef0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
ff00: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
ff10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ff20: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ff30: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
ff40: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
ff50: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
ff60: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
ff70: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
ff80: 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  EQ: {.      sqli
ff90: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ffa0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
ffb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ffc0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ffd0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
ffe0: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
fff0: 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
10000 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
10010 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74  pRight, op, dest
10020 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
10030 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10040 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
10050 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
10060 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
10070 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10080 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
10090 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
100a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
100b0 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
100c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
100d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
100e0 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
100f0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
10100 69 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45 45  ion is "x BETWEE
10110 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20 69  N y AND z". It i
10120 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
10130 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
10140 20 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20 79   ** 1 IF (x >= y
10150 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a  ) GOTO 3.      *
10160 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a  * 2 GOTO <dest>.
10170 20 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28 78        ** 3 IF (x
10180 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74   > z) GOTO <dest
10190 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  >.      */.     
101a0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
101b0 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
101c0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
101d0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
101e0 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
101f0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
10200 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10210 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  e(pParse, pLeft)
10220 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10230 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
10240 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
10250 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10260 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
10270 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
10280 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
10290 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
102a0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
102b0 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
102c0 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33  t, OP_Ge, addr+3
102d0 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
102e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
102f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
10300 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
10310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10320 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
10330 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52 69  dest);.      pRi
10340 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
10350 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
10360 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10370 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
10380 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
10390 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
103a0 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
103b0 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75 6d  OP_Gt, dest, jum
103c0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
103d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
103e0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
103f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10400 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
10410 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10420 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
10430 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  fNot, jumpIfNull
10440 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
10450 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
10460 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73    pParse->ckOffs
10470 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a 7d  et = ckOffset;.}
10480 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
10490 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
104a0 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
104b0 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52  rees.  Return TR
104c0 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a  UE (non-zero).**
104d0 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
104e0 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72  ntical and retur
104f0 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20  n FALSE if they 
10500 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
10510 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
10520 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70  3ExprCompare(Exp
10530 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29  r *pA, Expr *pB)
10540 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
10550 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b   pA==0||pB==0 ){
10560 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d  .    return pB==
10570 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41  pA;.  }.  if( pA
10580 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72  ->op!=pB->op ) r
10590 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
105a0 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pA->flags & EP_D
105b0 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66  istinct)!=(pB->f
105c0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
105d0 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ct) ) return 0;.
105e0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
105f0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
10600 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20  eft, pB->pLeft) 
10610 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
10620 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ( !sqlite3ExprCo
10630 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74  mpare(pA->pRight
10640 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20  , pB->pRight) ) 
10650 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
10660 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pA->pList ){.   
10670 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d   if( pB->pList==
10680 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
10690 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d    if( pA->pList-
106a0 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73  >nExpr!=pB->pLis
106b0 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72  t->nExpr ) retur
106c0 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  n 0;.    for(i=0
106d0 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e  ; i<pA->pList->n
106e0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
106f0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
10700 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
10710 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
10720 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d   pB->pList->a[i]
10730 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
10740 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
10750 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
10760 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74  se if( pB->pList
10770 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10780 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
10790 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70  pSelect || pB->p
107a0 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
107b0 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61  0;.  if( pA->iTa
107c0 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20  ble!=pB->iTable 
107d0 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  || pA->iColumn!=
107e0 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65  pB->iColumn ) re
107f0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
10800 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20  ->token.z ){.   
10810 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a   if( pB->token.z
10820 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
10830 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
10840 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e  n.n!=pA->token.n
10850 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
10860 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
10870 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41 2d 3e  ICmp((char*)pA->
10880 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70  token.z,(char*)p
10890 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74  B->token.z,pB->t
108a0 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20  oken.n)!=0 ){.  
108b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
108c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
108d0 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64   1;.}.../*.** Ad
108e0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
108f0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
10900 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
10910 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
10920 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
10930 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
10940 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
10950 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
10960 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
10970 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
10980 6e 28 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  n(AggInfo *pInfo
10990 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  ){.  int i;.  i 
109a0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
109b0 6c 6f 63 61 74 65 28 28 76 6f 69 64 2a 2a 29 26  locate((void**)&
109c0 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 20 73 69 7a  pInfo->aCol, siz
109d0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
109e0 30 5d 29 2c 20 33 29 3b 0a 20 20 69 66 28 20 69  0]), 3);.  if( i
109f0 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
10a00 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
10a10 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
10a20 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
10a30 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
10a40 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
10a50 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
10a60 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
10a70 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
10a80 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
10a90 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
10aa0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
10ab0 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
10ac0 46 75 6e 63 28 41 67 67 49 6e 66 6f 20 2a 70 49  Func(AggInfo *pI
10ad0 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
10ae0 20 69 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61   i = sqlite3Arra
10af0 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f 69 64 2a  yAllocate((void*
10b00 2a 29 26 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  *)&pInfo->aFunc,
10b10 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
10b20 46 75 6e 63 5b 30 5d 29 2c 20 32 29 3b 0a 20 20  Func[0]), 2);.  
10b30 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 72  if( i<0 ){.    r
10b40 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
10b50 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
10b60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
10b70 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b  n xFunc for walk
10b80 45 78 70 72 54 72 65 65 28 29 20 75 73 65 64 20  ExprTree() used 
10b90 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a  to implement .**
10ba0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
10bb0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
10bc0 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
10bd0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
10be0 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
10bf0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
10c00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10c10 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 68  tine analyzes th
10c20 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
10c30 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a  tion at pExpr..*
10c40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
10c50 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 76 6f  lyzeAggregate(vo
10c60 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
10c70 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
10c80 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
10c90 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65  pNC = (NameConte
10ca0 78 74 20 2a 29 70 41 72 67 3b 0a 20 20 50 61 72  xt *)pArg;.  Par
10cb0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
10cc0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c  ->pParse;.  SrcL
10cd0 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
10ce0 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
10cf0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
10d00 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e  fo = pNC->pAggIn
10d10 66 6f 3b 0a 20 20 0a 0a 20 20 73 77 69 74 63 68  fo;.  ..  switch
10d20 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
10d30 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
10d40 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N: {.      /* Ch
10d50 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
10d60 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
10d70 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
10d80 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
10d90 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
10da0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
10db0 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
10dc0 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20   pSrcList ){.   
10dd0 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
10de0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
10df0 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20  = pSrcList->a;. 
10e00 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
10e10 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
10e20 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
10e30 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
10e40 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
10e50 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Col;.          i
10e60 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
10e70 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
10e80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
10e90 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
10ea0 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
10eb0 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
10ec0 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
10ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
10ee0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
10ef0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
10f00 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
10f10 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
10f20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
10f30 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
10f40 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
10f50 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
10f60 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
10f70 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
10f80 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
10f90 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
10fa0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10fb0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
10fc0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
10fd0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
10fe0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
10ff0 6f 6c 75 6d 6e 3b 20 69 2b 2b 2c 20 70 43 6f 6c  olumn; i++, pCol
11000 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
11010 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
11020 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
11030 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
11040 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
11050 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
11060 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
11070 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
11090 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
110a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
110b0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  =pAggInfo->nColu
110c0 6d 6e 20 26 26 20 28 69 20 3d 20 61 64 64 41 67  mn && (i = addAg
110d0 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 41 67 67  gInfoColumn(pAgg
110e0 49 6e 66 6f 29 29 3e 3d 30 20 29 7b 0a 20 20 20  Info))>=0 ){.   
110f0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
11100 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
11110 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[i];.          
11120 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
11130 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
11140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11150 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
11160 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
11180 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  ol->iMem = pPars
11190 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
111a0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
111b0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
111c0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
111d0 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
111e0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
111f0 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
11200 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
11220 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
11230 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
11240 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
11250 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
11260 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
11270 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
11280 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
11290 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
112a0 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
112b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
112c0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
112d0 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
11300 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
11310 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
11320 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
11330 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
11340 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
11350 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
11360 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
11370 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
11380 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
11390 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
113a0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
113b0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
113c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
113f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
11400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
11410 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
11420 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11440 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
11450 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
11460 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
11470 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11480 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
11490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
114a0 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
114b0 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
114c0 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
114d0 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
114e0 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
114f0 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
11500 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
11510 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
11520 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
11530 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
11540 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
11550 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
11560 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
11570 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
11580 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
11590 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
115a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
115b0 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
115c0 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
115d0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
115e0 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
115f0 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
11600 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b  pExpr->iAgg = i;
11610 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
11620 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
11630 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
11640 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
11650 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
11660 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
11670 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
11680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
11690 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
116a0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
116b0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
116c0 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65   /* The pNC->nDe
116d0 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73  pth==0 test caus
116e0 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
116f0 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65  ctions in subque
11700 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ries.      ** to
11710 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20   be ignored */. 
11720 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44       if( pNC->nD
11730 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  epth==0 ){.     
11740 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
11750 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
11760 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
11770 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
11780 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
11790 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
117a0 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
117b0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
117c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
117d0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
117e0 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
117f0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
11800 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
11810 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
11820 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
11830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
11840 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
11850 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
11860 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  , pExpr) ){.    
11870 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11880 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11890 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
118a0 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46   i>=pAggInfo->nF
118b0 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unc ){.         
118c0 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69   /* pExpr is ori
118d0 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e  ginal.  Make a n
118e0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67  ew entry in pAgg
118f0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20  Info->aFunc[].  
11900 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
11910 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
11920 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  C(pParse->db);. 
11930 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64           i = add
11940 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 41 67 67  AggInfoFunc(pAgg
11950 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
11960 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
11970 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
11980 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
11990 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
119a0 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
119b0 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
119c0 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
119d0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
119e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
119f0 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
11a00 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
11a10 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
11a40 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
11a50 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20  ken.n,.         
11a60 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
11a70 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  >pList ? pExpr->
11a80 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
11a90 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
11aa0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
11ab0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
11ac0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20  tinct ){.       
11ad0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
11ae0 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
11af0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
11b00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11b10 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
11b20 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
11b30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
11b40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11b50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
11b60 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e   Make pExpr poin
11b70 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  t to the appropr
11b80 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61  iate pAggInfo->a
11b90 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20  Func[] entry.   
11ba0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11bb0 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b  pExpr->iAgg = i;
11bc0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
11bd0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
11be0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
11bf0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
11c00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
11c10 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20  ecursively walk 
11c20 73 75 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b 69  subqueries looki
11c30 6e 67 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e  ng for TK_COLUMN
11c40 20 6e 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64   nodes that need
11c50 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63 68 61 6e  .  ** to be chan
11c60 67 65 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  ged to TK_AGG_CO
11c70 4c 55 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72 65  LUMN.  But incre
11c80 6d 65 6e 74 20 6e 44 65 70 74 68 20 73 6f 20 74  ment nDepth so t
11c90 68 61 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47 5f  hat.  ** TK_AGG_
11ca0 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
11cb0 6e 20 73 75 62 71 75 65 72 69 65 73 20 77 69 6c  n subqueries wil
11cc0 6c 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  l be unchanged..
11cd0 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
11ce0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
11cf0 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a   pNC->nDepth++;.
11d00 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78      walkSelectEx
11d10 70 72 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  pr(pExpr->pSelec
11d20 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  t, analyzeAggreg
11d30 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70  ate, pNC);.    p
11d40 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20  NC->nDepth--;.  
11d50 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
11d60 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
11d70 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
11d80 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ion looking for 
11d90 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
11da0 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76  ons and.** for v
11db0 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65  ariables that ne
11dc0 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ed to be added t
11dd0 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
11de0 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d  gg[] array..** M
11df0 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ake additional e
11e00 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50  ntries to the pP
11e10 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
11e20 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ay as necessary.
11e30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11e40 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
11e50 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
11e60 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
11e70 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
11e80 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78  zed by sqlite3Ex
11e90 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29  prResolveNames()
11ea0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72  ..**.** If error
11eb0 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61 76  s are seen, leav
11ec0 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
11ed0 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e  ge in zErrMsg an
11ee0 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  d return.** the 
11ef0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
11f00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11f10 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
11f20 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78  gates(NameContex
11f30 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45  t *pNC, Expr *pE
11f40 78 70 72 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  xpr){.  int nErr
11f50 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
11f60 6e 45 72 72 3b 0a 20 20 77 61 6c 6b 45 78 70 72  nErr;.  walkExpr
11f70 54 72 65 65 28 70 45 78 70 72 2c 20 61 6e 61 6c  Tree(pExpr, anal
11f80 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e  yzeAggregate, pN
11f90 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 43  C);.  return pNC
11fa0 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 2d  ->pParse->nErr -
11fb0 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nErr;.}../*.** 
11fc0 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
11fd0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
11fe0 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
11ff0 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
12000 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
12010 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
12020 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
12030 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
12040 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
12050 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
12060 20 73 68 6f 72 74 2e 0a 2a 2f 0a 69 6e 74 20 73   short..*/.int s
12070 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
12080 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e  eAggList(NameCon
12090 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c  text *pNC, ExprL
120a0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
120b0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
120c0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
120d0 74 20 69 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20  t i;.  int nErr 
120e0 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
120f0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
12100 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
12110 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 70 4c   nErr==0 && i<pL
12120 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
12130 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
12140 20 6e 45 72 72 20 2b 3d 20 73 71 6c 69 74 65 33   nErr += sqlite3
12150 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
12160 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
12170 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
12180 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72    }.  return nEr
12190 72 3b 0a 7d 0a                                   r;.}.