/ Hex Artifact Content
Login

Artifact 62f044ebff77bd7f486e3f214a963f0bfffd5d1b:


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 35 31 20 32 30 30 36 2f 30 31 2f 32 33 20  .251 2006/01/23 
0220: 30 35 3a 35 30 3a 35 38 20 64 61 6e 69 65 6c 6b  05:50:58 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 54 61 62 20 3d  rsor;.    pTab =
3cf0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
3d00: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
3d10: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
3d20: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
3d30: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
3d40: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
3d50: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
3d60: 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70  tDup(pOldItem->p
3d70: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65  Select);.    pNe
3d80: 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c  wItem->pOn = sql
3d90: 69 74 65 33 45 78 70 72 44 75 70 28 70 4f 6c 64  ite3ExprDup(pOld
3da0: 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
3db0: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
3dc0: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
3dd0: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 55  Dup(pOldItem->pU
3de0: 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49  sing);.    pNewI
3df0: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70  tem->colUsed = p
3e00: 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  OldItem->colUsed
3e10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3e20: 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73  New;.}.IdList *s
3e30: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
3e40: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
3e50: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
3e60: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
3e70: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3e80: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
3e90: 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 4e  cRaw( sizeof(*pN
3ea0: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
3eb0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
3ec0: 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70  .  pNew->nId = p
3ed0: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
3ee0: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
3ef0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
3f00: 77 28 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66  w( p->nId*sizeof
3f10: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
3f20: 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b  f( pNew->a==0 ){
3f30: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3f40: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
3f50: 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
3f60: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
3f70: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
3f80: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
3f90: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
3fa0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
3fb0: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
3fc0: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
3fd0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
3fe0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
3ff0: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  Dup(pOldItem->zN
4000: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
4010: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
4020: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
4030: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
4040: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
4050: 65 63 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70  ectDup(Select *p
4060: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
4070: 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  w;.  if( p==0 ) 
4080: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
4090: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
40a0: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  aw( sizeof(*p) )
40b0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
40c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
40d0: 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d  ew->isDistinct =
40e0: 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
40f0: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
4100: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4110: 44 75 70 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  Dup(p->pEList);.
4120: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
4130: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
4140: 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65  (p->pSrc);.  pNe
4150: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
4160: 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 57  te3ExprDup(p->pW
4170: 68 65 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  here);.  pNew->p
4180: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
4190: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  3ExprListDup(p->
41a0: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65  pGroupBy);.  pNe
41b0: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  w->pHaving = sql
41c0: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
41d0: 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d  Having);.  pNew-
41e0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
41f0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
4200: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
4210: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
4220: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
4230: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
4240: 75 70 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  up(p->pPrior);. 
4250: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
4260: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
4270: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 4e 65  ->pLimit);.  pNe
4280: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
4290: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
42a0: 4f 66 66 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d  Offset);.  pNew-
42b0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
42c0: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
42d0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65  -1;.  pNew->isRe
42e0: 73 6f 6c 76 65 64 20 3d 20 70 2d 3e 69 73 52 65  solved = p->isRe
42f0: 73 6f 6c 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e  solved;.  pNew->
4300: 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67  isAgg = p->isAgg
4310: 3b 0a 20 20 70 4e 65 77 2d 3e 75 73 65 73 56 69  ;.  pNew->usesVi
4320: 72 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  rt = 0;.  pNew->
4330: 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20  disallowOrderBy 
4340: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  = 0;.  pNew->pRi
4350: 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70  ghtmost = 0;.  p
4360: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  New->addrOpenVir
4370: 74 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  t[0] = -1;.  pNe
4380: 77 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  w->addrOpenVirt[
4390: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
43a0: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d  >addrOpenVirt[2]
43b0: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
43c0: 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65  pNew;.}.#else.Se
43d0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
43e0: 65 63 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70  ectDup(Select *p
43f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
4400: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0 );.  return 0;
4410: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
4420: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
4430: 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ent to the end o
4440: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
4450: 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20  list.  If pList 
4460: 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
4470: 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74  NULL, then creat
4480: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
4490: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72  on list..*/.Expr
44a0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
44b0: 72 4c 69 73 74 41 70 70 65 6e 64 28 45 78 70 72  rListAppend(Expr
44c0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70  List *pList, Exp
44d0: 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20  r *pExpr, Token 
44e0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70  *pName){.  if( p
44f0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
4500: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
4510: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72  loc( sizeof(Expr
4520: 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
4530: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
4540: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
4550: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
4560: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d  ( pList->nAlloc=
4570: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  =0 );.  }.  if( 
4580: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70  pList->nAlloc<=p
4590: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
45a0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
45b0: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
45c0: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  int n = pList->n
45d0: 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20  Alloc*2 + 4;.   
45e0: 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
45f0: 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73  oc(pList->a, n*s
4600: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
4610: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ]));.    if( a==
4620: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
4630: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
4640: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
4650: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
4660: 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  c = n;.  }.  ass
4670: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
4680: 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
4690: 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  || pName ){.    
46a0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
46b0: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
46c0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
46d0: 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d  Expr++];.    mem
46e0: 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
46f0: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20  zeof(*pItem));. 
4700: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
4710: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
4720: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
4730: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
4740: 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72  = pExpr;.  }.  r
4750: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f  eturn pList;..no
4760: 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20  _mem:     .  /* 
4770: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
4780: 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68  mory if malloc h
4790: 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20  as failed. */.  
47a0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
47b0: 65 28 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  e(pExpr);.  sqli
47c0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
47d0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  e(pList);.  retu
47e0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
47f0: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
4800: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
4810: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4820: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45  ExprListDelete(E
4830: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
4840: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
4850: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
4860: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
4870: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
4880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
4890: 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73  t->a!=0 || (pLis
48a0: 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70  t->nExpr==0 && p
48b0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29  List->nAlloc==0)
48c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
48d0: 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73  ist->nExpr<=pLis
48e0: 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66  t->nAlloc );.  f
48f0: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
4900: 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
4910: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
4920: 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
4930: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74  e3ExprDelete(pIt
4940: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
4950: 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
4960: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ->zName);.  }.  
4970: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
4980: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ->a);.  sqliteFr
4990: 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
49a0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
49b0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 43 61  ession tree.  Ca
49c0: 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20 65 61 63  ll xFunc for eac
49d0: 68 20 6e 6f 64 65 20 76 69 73 69 74 65 64 2e 0a  h node visited..
49e0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
49f0: 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e   value from xFun
4a00: 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  c determines whe
4a10: 74 68 65 72 20 74 68 65 20 74 72 65 65 20 77 61  ther the tree wa
4a20: 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a  lk continues..**
4a30: 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75   0 means continu
4a40: 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 74 72  e walking the tr
4a50: 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64 6f 20  ee.  1 means do 
4a60: 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64 72 65  not walk childre
4a70: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72  n.** of the curr
4a80: 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e  ent node but con
4a90: 74 69 6e 75 65 20 77 69 74 68 20 73 69 62 6c 69  tinue with sibli
4aa0: 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20 61 62  ngs.  2 means ab
4ab0: 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65  andon.** the tre
4ac0: 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c  e walk completel
4ad0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  y..**.** The ret
4ae0: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  urn value from t
4af0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 31  his routine is 1
4b00: 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20   to abandon the 
4b10: 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64  tree walk.** and
4b20: 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a   0 to continue..
4b30: 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20 20 54  **.** NOTICE:  T
4b40: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
4b50: 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64 20 69   *not* descend i
4b60: 6e 74 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a  nto subqueries..
4b70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
4b80: 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  lkExprList(ExprL
4b90: 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76  ist *, int (*)(v
4ba0: 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76  oid *, Expr*), v
4bb0: 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 69  oid *);.static i
4bc0: 6e 74 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  nt walkExprTree(
4bd0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
4be0: 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c   (*xFunc)(void*,
4bf0: 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  Expr*), void *pA
4c00: 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  rg){.  int rc;. 
4c10: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
4c20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
4c30: 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67 2c 20   (*xFunc)(pArg, 
4c40: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 72 63  pExpr);.  if( rc
4c50: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  ==0 ){.    if( w
4c60: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
4c70: 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c  r->pLeft, xFunc,
4c80: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
4c90: 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  1;.    if( walkE
4ca0: 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70  xprTree(pExpr->p
4cb0: 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20 70 41  Right, xFunc, pA
4cc0: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
4cd0: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
4ce0: 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  List(pExpr->pLis
4cf0: 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  t, xFunc, pArg) 
4d00: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
4d10: 20 20 72 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d    return rc>1;.}
4d20: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c  ../*.** Call wal
4d30: 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f 72 20  kExprTree() for 
4d40: 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
4d50: 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73   in list p..*/.s
4d60: 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78  tatic int walkEx
4d70: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
4d80: 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  *p, int (*xFunc)
4d90: 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c  (void *, Expr*),
4da0: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
4db0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
4dc0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
4dd0: 49 74 65 6d 3b 0a 20 20 69 66 28 20 21 70 20 29  Item;.  if( !p )
4de0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
4df0: 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74  (i=p->nExpr, pIt
4e00: 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  em=p->a; i>0; i-
4e10: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
4e20: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65   if( walkExprTre
4e30: 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
4e40: 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72  xFunc, pArg) ) r
4e50: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
4e60: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4e70: 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54  * Call walkExprT
4e80: 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79 20  ree() for every 
4e90: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 53 65  expression in Se
4ea0: 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c  lect p, not incl
4eb0: 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73  uding.** express
4ec0: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 70 61  ions that are pa
4ed0: 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65 63 74  rt of sub-select
4ee0: 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c  s in any FROM cl
4ef0: 61 75 73 65 20 6f 72 20 74 68 65 20 4c 49 4d 49  ause or the LIMI
4f00: 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54 20 65  T.** or OFFSET e
4f10: 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a  xpressions...*/.
4f20: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 53  static int walkS
4f30: 65 6c 65 63 74 45 78 70 72 28 53 65 6c 65 63 74  electExpr(Select
4f40: 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63   *p, int (*xFunc
4f50: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
4f60: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
4f70: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d   walkExprList(p-
4f80: 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20  >pEList, xFunc, 
4f90: 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70  pArg);.  walkExp
4fa0: 72 54 72 65 65 28 70 2d 3e 70 57 68 65 72 65 2c  rTree(p->pWhere,
4fb0: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
4fc0: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d   walkExprList(p-
4fd0: 3e 70 47 72 6f 75 70 42 79 2c 20 78 46 75 6e 63  >pGroupBy, xFunc
4fe0: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
4ff0: 78 70 72 54 72 65 65 28 70 2d 3e 70 48 61 76 69  xprTree(p->pHavi
5000: 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ng, xFunc, pArg)
5010: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  ;.  walkExprList
5020: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 78 46  (p->pOrderBy, xF
5030: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 72 65  unc, pArg);.  re
5040: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
5050: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5060: 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e  s designed as an
5070: 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
5080: 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprTree()..**.**
5090: 20 70 41 72 67 20 69 73 20 72 65 61 6c 6c 79 20   pArg is really 
50a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
50b0: 69 6e 74 65 67 65 72 2e 20 20 49 66 20 77 65 20  integer.  If we 
50c0: 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b  can tell by look
50d0: 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70 72 20  ing.** at pExpr 
50e0: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
50f0: 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
5100: 73 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61  s pExpr is not a
5110: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70   constant.** exp
5120: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65  ression, then se
5130: 74 20 2a 70 41 72 67 20 74 6f 20 30 20 61 6e 64  t *pArg to 0 and
5140: 20 72 65 74 75 72 6e 20 32 20 74 6f 20 61 62 61   return 2 to aba
5150: 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61  ndon the tree wa
5160: 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  lk..** If pExpr 
5170: 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20 64 69  does does not di
5180: 73 71 75 61 6c 69 66 79 20 74 68 65 20 65 78 70  squalify the exp
5190: 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69  ression from bei
51a0: 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  ng a constant.**
51b0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
51c0: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61  ..**.** After wa
51d0: 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c 65 20  lking the whole 
51e0: 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65  tree, if no node
51f0: 73 20 61 72 65 20 66 6f 75 6e 64 20 74 68 61 74  s are found that
5200: 20 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74   disqualify.** t
5210: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  he expression as
5220: 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
5230: 77 65 20 61 73 73 75 6d 65 20 74 68 65 20 77 68  we assume the wh
5240: 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ole expression.*
5250: 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20  * is constant.  
5260: 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  See sqlite3ExprI
5270: 73 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72 20  sConstant() for 
5280: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
5290: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
52a0: 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
52b0: 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a 70  Constant(void *p
52c0: 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
52d0: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ){.  switch( pEx
52e0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
52f0: 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69   Consider functi
5300: 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61  ons to be consta
5310: 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20  nt if all their 
5320: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f  arguments are co
5330: 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e  nstant.    ** an
5340: 64 20 2a 70 41 72 67 3d 3d 32 20 2a 2f 0a 20 20  d *pArg==2 */.  
5350: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
5360: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 2a 28  ON:.      if( *(
5370: 28 69 6e 74 2a 29 70 41 72 67 29 3d 3d 32 20 29  (int*)pArg)==2 )
5380: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
5390: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
53a0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
53b0: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
53c0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
53d0: 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73   TK_DOT:.    cas
53e0: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
53f0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
5400: 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64  GG_COLUMN:.#ifnd
5410: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5420: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
5430: 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
5440: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
5450: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 2a 28 28  #endif.      *((
5460: 69 6e 74 2a 29 70 41 72 67 29 20 3d 20 30 3b 0a  int*)pArg) = 0;.
5470: 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
5480: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a      case TK_IN:.
5490: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
54a0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
54b0: 20 20 20 20 2a 28 28 69 6e 74 2a 29 70 41 72 67      *((int*)pArg
54c0: 29 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  ) = 0;.        r
54d0: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d  eturn 2;.      }
54e0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
54f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5500: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  }.}../*.** Walk 
5510: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
5520: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
5530: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5540: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
5550: 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
5560: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
5570: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e   function calls.
5580: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
5590: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
55a0: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
55b0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
55c0: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
55d0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
55e0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
55f0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
5600: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
5610: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
5620: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5630: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45  ExprIsConstant(E
5640: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  xpr *p){.  int i
5650: 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20 77 61  sConst = 1;.  wa
5660: 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65 78  lkExprTree(p, ex
5670: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
5680: 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72  , &isConst);.  r
5690: 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 3b 0a 7d  eturn isConst;.}
56a0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
56b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
56c0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
56d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
56e0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
56f0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
5700: 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
5710: 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
5720: 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
5730: 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
5740: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
5750: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
5760: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
5770: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
5780: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
5790: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
57a0: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
57b0: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
57c0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
57d0: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
57e0: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
57f0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
5800: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
5810: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43  r *p){.  int isC
5820: 6f 6e 73 74 20 3d 20 32 3b 0a 20 20 77 61 6c 6b  onst = 2;.  walk
5830: 45 78 70 72 54 72 65 65 28 70 2c 20 65 78 70 72  ExprTree(p, expr
5840: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20  NodeIsConstant, 
5850: 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74  &isConst);.  ret
5860: 75 72 6e 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a  urn isConst!=0;.
5870: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
5880: 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64  expression p cod
5890: 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
58a0: 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
58b0: 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
58c0: 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
58d0: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
58e0: 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
58f0: 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
5900: 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
5910: 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
5920: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
5930: 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
5940: 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
5950: 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
5960: 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
5970: 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
5980: 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
5990: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
59a0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
59b0: 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
59c0: 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69   *pValue){.  swi
59d0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
59e0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
59f0: 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  R: {.      if( s
5a00: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 28  qlite3GetInt32((
5a10: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
5a20: 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20  , pValue) ){.   
5a30: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5a40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5a50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
5a60: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
5a70: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
5a80: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
5a90: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
5aa0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  e);.    }.    ca
5ab0: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
5ac0: 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20        int v;.   
5ad0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
5ae0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
5af0: 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20  Left, &v) ){.   
5b00: 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
5b10: 76 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  v;.        retur
5b20: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
5b30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5b40: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
5b50: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
5b60: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
5b70: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
5b80: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
5b90: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
5ba0: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
5bb0: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
5bc0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
5bd0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
5be0: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
5bf0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
5c00: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
5c10: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
5c20: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
5c30: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
5c40: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
5c50: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
5c60: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5c70: 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
5c80: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  of a column of t
5c90: 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72  he form X.Y.Z or
5ca0: 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20   Y.Z or just Z, 
5cb0: 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20  look up.** that 
5cc0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20  name in the set 
5cd0: 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  of source tables
5ce0: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64   in pSrcList and
5cf0: 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72 20   make the pExpr 
5d00: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  .** expression n
5d10: 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b 20 74  ode refer back t
5d20: 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f  o that source co
5d30: 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  lumn.  The follo
5d40: 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20  wing changes.** 
5d50: 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70  are made to pExp
5d60: 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70  r:.**.**    pExp
5d70: 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20 20  r->iDb          
5d80: 20 53 65 74 20 74 68 65 20 69 6e 64 65 78 20 69   Set the index i
5d90: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74  n db->aDb[] of t
5da0: 68 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64  he database hold
5db0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
5dd0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  he table..**    
5de0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20  pExpr->iTable   
5df0: 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20       Set to the 
5e00: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
5e10: 72 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61  r the table obta
5e20: 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ined.**         
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 66 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a  from pSrcList..*
5e50: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  *    pExpr->iCol
5e60: 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f  umn       Set to
5e70: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
5e80: 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  er within the ta
5e90: 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ble..**    pExpr
5ea0: 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
5eb0: 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  Set to TK_COLUMN
5ec0: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  ..**    pExpr->p
5ed0: 4c 65 66 74 20 20 20 20 20 20 20 20 20 41 6e 79  Left         Any
5ee0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
5ef0: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
5f00: 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70  leted.**    pExp
5f10: 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20 20  r->pRight       
5f20: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
5f30: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
5f40: 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
5f50: 20 54 68 65 20 70 44 62 54 6f 6b 65 6e 20 69 73   The pDbToken is
5f60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
5f70: 20 64 61 74 61 62 61 73 65 20 28 74 68 65 20 22   database (the "
5f80: 58 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75 65  X").  This value
5f90: 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20   may be.** NULL 
5fa0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d  meaning that nam
5fb0: 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  e is of the form
5fc0: 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20   Y.Z or Z.  Any 
5fd0: 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61  available databa
5fe0: 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  se.** can be use
5ff0: 64 2e 20 20 54 68 65 20 70 54 61 62 6c 65 54 6f  d.  The pTableTo
6000: 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ken is the name 
6010: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 74 68  of the table (th
6020: 65 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a  e "Y").  This.**
6030: 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55   value can be NU
6040: 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e 20 69  LL if pDbToken i
6050: 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66  s also NULL.  If
6060: 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20   pTableToken is 
6070: 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  NULL it.** means
6080: 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f   that the form o
6090: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20  f the name is Z 
60a0: 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73  and that columns
60b0: 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a   from any table.
60c0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  ** can be used..
60d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d  **.** If the nam
60e0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f  e cannot be reso
60f0: 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73  lved unambiguous
6100: 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ly, leave an err
6110: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
6120: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
6130: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65  rn non-zero.  Re
6140: 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63  turn zero on suc
6150: 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
6160: 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a  int lookupName(.
6170: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6180: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
6190: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
61a0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b  .  Token *pDbTok
61b0: 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  en,     /* Name 
61c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
61d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65  containing table
61e0: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
61f0: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65  oken *pTableToke
6200: 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  n,  /* Name of t
6210: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
6220: 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20  column, or NULL 
6230: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c  */.  Token *pCol
6240: 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d  umnToken, /* Nam
6250: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
6260: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
6270: 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68  t *pNC,    /* Th
6280: 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 75  e name context u
6290: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  sed to resolve t
62a0: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  he name */.  Exp
62b0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
62c0: 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 45    /* Make this E
62d0: 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74  XPR node point t
62e0: 6f 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63  o the selected c
62f0: 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68  olumn */.){.  ch
6300: 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20  ar *zDb = 0;    
6310: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
6320: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
6330: 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f   "X" in X.Y.Z */
6340: 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  .  char *zTab = 
6350: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  0;      /* Name 
6360: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
6370: 68 65 20 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20  he "Y" in X.Y.Z 
6380: 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72  or Y.Z */.  char
6390: 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20   *zCol = 0;     
63a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
63b0: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22  column.  The "Z"
63c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
63d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
63e0: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
63f0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20   int cnt = 0;   
6400: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6410: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
6420: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  mn names */.  in
6430: 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20  t cntTab = 0;   
6440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6450: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 6e  matching table n
6460: 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ames */.  sqlite
6470: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6480: 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  db;  /* The data
6490: 62 61 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  base */.  struct
64a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
64b0: 49 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55  Item;       /* U
64c0: 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  se for looping o
64d0: 76 65 72 20 70 53 72 63 4c 69 73 74 20 69 74 65  ver pSrcList ite
64e0: 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ms */.  struct S
64f0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61  rcList_item *pMa
6500: 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65  tch = 0;  /* The
6510: 20 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c 69   matching pSrcLi
6520: 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d  st item */.  Nam
6530: 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43  eContext *pTopNC
6540: 20 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20 2f   = pNC;        /
6550: 2a 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74  * First namecont
6560: 65 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ext in the list 
6570: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
6580: 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43  olumnToken && pC
6590: 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b  olumnToken->z );
65a0: 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59   /* The Z in X.Y
65b0: 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  .Z cannot be NUL
65c0: 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c  L */.  zDb = sql
65d0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
65e0: 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a  n(pDbToken);.  z
65f0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  Tab = sqlite3Nam
6600: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c  eFromToken(pTabl
6610: 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20  eToken);.  zCol 
6620: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
6630: 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f  mToken(pColumnTo
6640: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ken);.  if( sqli
6650: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
6660: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f  ) ){.    goto lo
6670: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20  okupname_end;.  
6680: 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62  }..  pExpr->iTab
6690: 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65  le = -1;.  while
66a0: 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20  ( pNC && cnt==0 
66b0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
66c0: 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 72 63  *pEList;.    Src
66d0: 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
66e0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
66f0: 0a 20 20 20 20 69 66 28 20 70 53 72 63 4c 69 73  .    if( pSrcLis
6700: 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  t ){.      for(i
6710: 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63 4c 69  =0, pItem=pSrcLi
6720: 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c 69 73  st->a; i<pSrcLis
6730: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
6740: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
6750: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
6760: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  tem->pTab;.     
6770: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
6780: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
6790: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
67a0: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 43 6f  ema);.        Co
67b0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20  lumn *pCol;.  . 
67c0: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d         if( pTab=
67d0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
67e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
67f0: 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20  Tab->nCol>0 );. 
6800: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 20         if( zTab 
6810: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
6820: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
6830: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
6840: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
6850: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  Item->zAlias;.  
6860: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
6870: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
6880: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
6890: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
68a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
68b0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
68c0: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
68d0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
68e0: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
68f0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
6900: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
6910: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
6920: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
6930: 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71  if( zDb!=0 && sq
6940: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d  lite3StrICmp(db-
6950: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
6960: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
6970: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
6980: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
6990: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
69a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
69b0: 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b  if( 0==(cntTab++
69c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
69d0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
69e0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
69f0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6a00: 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e  pSchema = pTab->
6a10: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20  pSchema;.       
6a20: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
6a30: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
6a40: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43       for(j=0, pC
6a50: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a  ol=pTab->aCol; j
6a60: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
6a70: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
6a80: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6a90: 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
6aa0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
6ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
6ac0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
6ad0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
6ae0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
6af0: 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
6b00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  ;.            cn
6b10: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
6b20: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
6b30: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
6b40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61  .            pMa
6b50: 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20  tch = pItem;.   
6b60: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6b70: 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e  pSchema = pTab->
6b80: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20  pSchema;.       
6b90: 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
6ba0: 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f  te the rowid (co
6bb0: 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65  lumn -1) for the
6bc0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
6bd0: 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20   KEY */.        
6be0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
6bf0: 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50  mn = j==pTab->iP
6c00: 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20  Key ? -1 : j;.  
6c10: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6c20: 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62  >affinity = pTab
6c30: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69  ->aCol[j].affini
6c40: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
6c50: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73  pExpr->pColl = s
6c60: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
6c70: 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
6c80: 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20  Coll,-1, 0);.   
6c90: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
6ca0: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
6cb0: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
6cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
6cd0: 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75   this match occu
6ce0: 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65 66 74  rred in the left
6cf0: 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61 74 75   table of a natu
6d00: 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20 20  ral join,.      
6d10: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
6d20: 73 6b 69 70 20 74 68 65 20 72 69 67 68 74 20 74  skip the right t
6d30: 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 20  able to avoid a 
6d40: 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20  duplicate match 
6d50: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
6d60: 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20   pItem++;.      
6d70: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
6d80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6d90: 20 20 20 20 20 20 20 69 66 28 20 28 70 55 73 69         if( (pUsi
6da0: 6e 67 20 3d 20 70 49 74 65 6d 2d 3e 70 55 73 69  ng = pItem->pUsi
6db0: 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ng)!=0 ){.      
6dc0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
6dd0: 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73 20  is match occurs 
6de0: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74  on a column that
6df0: 20 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e 47   is in the USING
6e00: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
6e10: 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 6a 6f        ** of a jo
6e20: 69 6e 2c 20 73 6b 69 70 20 74 68 65 20 73 65 61  in, skip the sea
6e30: 72 63 68 20 6f 66 20 74 68 65 20 72 69 67 68 74  rch of the right
6e40: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
6e50: 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  in.             
6e60: 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61 20 64   ** to avoid a d
6e70: 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20 74  uplicate match t
6e80: 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
6e90: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
6eb0: 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e  k=0; k<pUsing->n
6ec0: 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; k++){.      
6ed0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
6ee0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 55 73  lite3StrICmp(pUs
6ef0: 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c  ing->a[k].zName,
6f00: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
6f20: 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Item++;.        
6f30: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6f70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6f80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6f90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6fa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6fb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
6fc0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6fd0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
6fe0: 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f  /* If we have no
6ff0: 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76  t already resolv
7000: 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65  ed the name, the
7010: 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20  n maybe .    ** 
7020: 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72  it is a new.* or
7030: 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61   old.* trigger a
7040: 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  rgument referenc
7050: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
7060: 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21   zDb==0 && zTab!
7070: 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20  =0 && cnt==0 && 
7080: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
7090: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72  k!=0 ){.      Tr
70a0: 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69  iggerStack *pTri
70b0: 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72  ggerStack = pPar
70c0: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20  se->trigStack;. 
70d0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
70e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
70f0: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
7100: 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73  ewIdx != -1 && s
7110: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e  qlite3StrICmp("n
7120: 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20  ew", zTab) == 0 
7130: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
7140: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67  ->iTable = pTrig
7150: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
7160: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
7170: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
7180: 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  >pTab );.       
7190: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
71a0: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
71b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72     }else if( pTr
71c0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49  iggerStack->oldI
71d0: 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69  dx != -1 && sqli
71e0: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  te3StrICmp("old"
71f0: 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , zTab)==0 ){.  
7200: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
7210: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
7220: 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20  ack->oldIdx;.   
7230: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
7240: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
7250: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
7260: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
7270: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a  ->pTab;.      }.
7280: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20  .      if( pTab 
7290: 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ){ .        int 
72a0: 6a 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  j;.        Colum
72b0: 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  n *pCol = pTab->
72c0: 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 70  aCol;..        p
72d0: 45 78 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20  Expr->pSchema = 
72e0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  pTab->pSchema;. 
72f0: 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b         cntTab++;
7300: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
7310: 3b 20 6a 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c  ; j < pTab->nCol
7320: 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b  ; j++, pCol++) {
7330: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
7340: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
7350: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ol->zName, zCol)
7360: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7370: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
7380: 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
7390: 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
73a0: 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
73b0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
73c0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70  ->iColumn = j==p
73d0: 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20  Tab->iPKey ? -1 
73e0: 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  : j;.           
73f0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
7400: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
7410: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
7420: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
7430: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
7440: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
7450: 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20  (db), zColl,-1, 
7460: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7470: 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54  pExpr->pTab = pT
7480: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
7490: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
74a0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
74b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
74c0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
74d0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
74e0: 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  R) */..    /*.  
74f0: 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65    ** Perhaps the
7500: 20 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65 72   name is a refer
7510: 65 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49  ence to the ROWI
7520: 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  D.    */.    if(
7530: 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61   cnt==0 && cntTa
7540: 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 49  b==1 && sqlite3I
7550: 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a  sRowid(zCol) ){.
7560: 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20        cnt = 1;. 
7570: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
7580: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
7590: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
75a0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
75b0: 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  EGER;.    }..   
75c0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   /*.    ** If th
75d0: 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68  e input is of th
75e0: 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e  e form Z (not Y.
75f0: 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e  Z or X.Y.Z) then
7600: 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20   the name Z.    
7610: 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72 20 74  ** might refer t
7620: 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20  o an result-set 
7630: 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68 61 70  alias.  This hap
7640: 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  pens, for exampl
7650: 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77  e, when.    ** w
7660: 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20  e are resolving 
7670: 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45  names in the WHE
7680: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
7690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61   following comma
76a0: 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  nd:.    **.    *
76b0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62  *     SELECT a+b
76c0: 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65   AS x FROM table
76d0: 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 20   WHERE x<10;.   
76e0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61   **.    ** In ca
76f0: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72  ses like this, r
7700: 65 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74  eplace pExpr wit
7710: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
7720: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a  expression that.
7730: 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65      ** forms the
7740: 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72   result set entr
7750: 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20  y ("a+b" in the 
7760: 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74  example) and ret
7770: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  urn immediately.
7780: 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
7790: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
77a0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
77b0: 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  et should have a
77c0: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
77d0: 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74  ** resolved by t
77e0: 68 65 20 74 69 6d 65 20 74 68 65 20 57 48 45 52  he time the WHER
77f0: 45 20 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f  E clause is reso
7800: 6c 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lved..    */.   
7810: 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 28   if( cnt==0 && (
7820: 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45  pEList = pNC->pE
7830: 4c 69 73 74 29 21 3d 30 20 26 26 20 7a 54 61 62  List)!=0 && zTab
7840: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
7850: 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e  (j=0; j<pEList->
7860: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
7870: 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d       char *zAs =
7880: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
7890: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
78a0: 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74   zAs!=0 && sqlit
78b0: 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a  e3StrICmp(zAs, z
78c0: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
78d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
78e0: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
78f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
7900: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45   );.          pE
7910: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b  xpr->op = TK_AS;
7920: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
7930: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  ->iColumn = j;. 
7940: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7950: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
7960: 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61  xprDup(pEList->a
7970: 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [j].pExpr);.    
7980: 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20        cnt = 1;. 
7990: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
79a0: 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d   zTab==0 && zDb=
79b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
79c0: 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f  goto lookupname_
79d0: 65 6e 64 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d  end_2;.        }
79e0: 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a  .      } .    }.
79f0: 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  .    /* Advance 
7a00: 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 61 6d 65  to the next name
7a10: 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 6c   context.  The l
7a20: 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74 20 77 68  oop will exit wh
7a30: 65 6e 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a  en either.    **
7a40: 20 77 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   we have a match
7a50: 20 28 63 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e   (cnt>0) or when
7a60: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e   we run out of n
7a70: 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20  ame contexts..  
7a80: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
7a90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 43  ==0 ){.      pNC
7aa0: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
7ab0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
7ac0: 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61   ** If X and Y a
7ad0: 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65  re NULL (in othe
7ae0: 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20  r words if only 
7af0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
7b00: 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69  Z is.  ** suppli
7b10: 65 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ed) and the valu
7b20: 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73  e of Z is enclos
7b30: 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f  ed in double-quo
7b40: 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a  tes, then.  ** Z
7b50: 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74   is a string lit
7b60: 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e  eral if it doesn
7b70: 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c  't match any col
7b80: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74  umn names.  In t
7b90: 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77  hat.  ** case, w
7ba0: 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e  e need to return
7bb0: 20 72 69 67 68 74 20 61 77 61 79 20 61 6e 64 20   right away and 
7bc0: 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61  not make any cha
7bd0: 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78  nges to.  ** pEx
7be0: 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65  pr..  **.  ** Be
7bf0: 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e  cause no referen
7c00: 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f  ce was made to o
7c10: 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74  uter contexts, t
7c20: 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a  he pNC->nRef.  *
7c30: 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74  * fields are not
7c40: 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20   changed in any 
7c50: 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20  context..  */.  
7c60: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54  if( cnt==0 && zT
7c70: 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e  ab==0 && pColumn
7c80: 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27  Token->z[0]=='"'
7c90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
7ca0: 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65  ee(zCol);.    re
7cb0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
7cc0: 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65  *.  ** cnt==0 me
7cd0: 61 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f  ans there was no
7ce0: 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20  t match.  cnt>1 
7cf0: 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65  means there were
7d00: 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72   two or.  ** mor
7d10: 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68  e matches.  Eith
7d20: 65 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20  er way, we have 
7d30: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20  an error..  */. 
7d40: 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20   if( cnt!=1 ){. 
7d50: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a     char *z = 0;.
7d60: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a      char *zErr;.
7d70: 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d      zErr = cnt==
7d80: 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  0 ? "no such col
7d90: 75 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69  umn: %s" : "ambi
7da0: 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  guous column nam
7db0: 65 3a 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20  e: %s";.    if( 
7dc0: 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  zDb ){.      sql
7dd0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
7de0: 2c 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62  , zDb, ".", zTab
7df0: 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68  , ".", zCol, (ch
7e00: 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d 65 6c 73  ar*)0);.    }els
7e10: 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20  e if( zTab ){.  
7e20: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
7e30: 72 69 6e 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22  ring(&z, zTab, "
7e40: 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a  .", zCol, (char*
7e50: 29 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )0);.    }else{.
7e60: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
7e70: 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20  StrDup(zCol);.  
7e80: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
7e90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7ea0: 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71  zErr, z);.    sq
7eb0: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
7ec0: 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b   pTopNC->nErr++;
7ed0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
7ee0: 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61  column from a ta
7ef0: 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20  ble in pSrcList 
7f00: 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74  is referenced, t
7f10: 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  hen record.  ** 
7f20: 74 68 69 73 20 66 61 63 74 20 69 6e 20 74 68 65  this fact in the
7f30: 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f   pSrcList.a[].co
7f40: 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20  lUsed bitmask.  
7f50: 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a  Column 0 causes.
7f60: 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65    ** bit 0 to be
7f70: 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20   set.  Column 1 
7f80: 73 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64  sets bit 1.  And
7f90: 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74   so forth.  If t
7fa0: 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  he.  ** column n
7fb0: 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
7fc0: 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72   than the number
7fd0: 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
7fe0: 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65  bitmask.  ** the
7ff0: 6e 20 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f  n set the high-o
8000: 72 64 65 72 20 62 69 74 20 6f 66 20 74 68 65 20  rder bit of the 
8010: 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20  bitmask..  */.  
8020: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
8030: 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21  mn>=0 && pMatch!
8040: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  =0 ){.    int n 
8050: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
8060: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a  ;.    if( n>=siz
8070: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29  eof(Bitmask)*8 )
8080: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 69 7a 65  {.      n = size
8090: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b  of(Bitmask)*8-1;
80a0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
80b0: 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73  t( pMatch->iCurs
80c0: 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or==pExpr->iTabl
80d0: 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d  e );.    pMatch-
80e0: 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 31 3c 3c 6e  >colUsed |= 1<<n
80f0: 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61 6d  ;.  }..lookupnam
8100: 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43 6c 65 61  e_end:.  /* Clea
8110: 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 0a  n up and return.
8120: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65    */.  sqliteFre
8130: 65 28 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  e(zDb);.  sqlite
8140: 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 73 71  Free(zTab);.  sq
8150: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
8160: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
8170: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
8180: 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
8190: 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52  Delete(pExpr->pR
81a0: 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  ight);.  pExpr->
81b0: 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45  pRight = 0;.  pE
81c0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
81d0: 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f  UMN;.lookupname_
81e0: 65 6e 64 5f 32 3a 0a 20 20 73 71 6c 69 74 65 46  end_2:.  sqliteF
81f0: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28  ree(zCol);.  if(
8200: 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61   cnt==1 ){.    a
8210: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
8220: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68  .    sqlite3Auth
8230: 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78  Read(pParse, pEx
8240: 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  pr, pNC->pSrcLis
8250: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61 74  t);.    if( pMat
8260: 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d 3e 70  ch && !pMatch->p
8270: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
8280: 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4d  pExpr->pTab = pM
8290: 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20 20  atch->pTab;.    
82a0: 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  }.    /* Increme
82b0: 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c 75  nt the nRef valu
82c0: 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63 6f  e on all name co
82d0: 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70 4e  ntexts from TopN
82e0: 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20 74  C up to.    ** t
82f0: 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74  he point where t
8300: 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64 2e  he name matched.
8310: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b   */.    for(;;){
8320: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8330: 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20  TopNC!=0 );.    
8340: 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b    pTopNC->nRef++
8350: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 70  ;.      if( pTop
8360: 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b 3b  NC==pNC ) break;
8370: 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d 20  .      pTopNC = 
8380: 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20  pTopNC->pNext;. 
8390: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
83a0: 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  0;.  } else {.  
83b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
83c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
83d0: 75 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65  utine is designe
83e0: 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f  d as an xFunc fo
83f0: 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29  r walkExprTree()
8400: 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ..**.** Resolve 
8410: 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69  symbolic names i
8420: 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70  nto TK_COLUMN op
8430: 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65 20  erators for the 
8440: 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20  current.** node 
8450: 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
8460: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
8470: 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68  0 to continue th
8480: 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a  e search down.**
8490: 20 74 68 65 20 74 72 65 65 20 6f 72 20 32 20 74   the tree or 2 t
84a0: 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72 65 65  o abort the tree
84b0: 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   walk..**.** Thi
84c0: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64  s routine also d
84d0: 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b 69  oes error checki
84e0: 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f  ng and name reso
84f0: 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75  lution for.** fu
8500: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54  nction names.  T
8510: 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  he operator for 
8520: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
8530: 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a 2a  ons is changed.*
8540: 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43  * to TK_AGG_FUNC
8550: 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  TION..*/.static 
8560: 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72  int nameResolver
8570: 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72 67 2c  Step(void *pArg,
8580: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
8590: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
85a0: 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74  C = (NameContext
85b0: 2a 29 70 41 72 67 3b 0a 20 20 53 72 63 4c 69 73  *)pArg;.  SrcLis
85c0: 74 20 2a 70 53 72 63 4c 69 73 74 3b 0a 20 20 50  t *pSrcList;.  P
85d0: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20  arse *pParse;.. 
85e0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
85f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65  return 1;.  asse
8600: 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20  rt( pNC!=0 );.  
8610: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
8620: 70 53 72 63 4c 69 73 74 3b 0a 20 20 70 50 61 72  pSrcList;.  pPar
8630: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
8640: 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ;..  if( ExprHas
8650: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
8660: 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20  r, EP_Resolved) 
8670: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45 78  ) return 1;.  Ex
8680: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
8690: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
86a0: 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
86b0: 47 0a 20 20 69 66 28 20 70 53 72 63 4c 69 73 74  G.  if( pSrcList
86c0: 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 6e 41   && pSrcList->nA
86d0: 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e  lloc>0 ){.    in
86e0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
86f0: 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
8700: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
8710: 61 73 73 65 72 74 28 20 70 53 72 63 4c 69 73 74  assert( pSrcList
8720: 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d  ->a[i].iCursor>=
8730: 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61  0 && pSrcList->a
8740: 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72  [i].iCursor<pPar
8750: 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d  se->nTab);.    }
8760: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77  .  }.#endif.  sw
8770: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
8780: 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65  ){.    /* Double
8790: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20  -quoted strings 
87a0: 28 65 78 3a 20 22 61 62 63 22 29 20 61 72 65 20  (ex: "abc") are 
87b0: 75 73 65 64 20 61 73 20 69 64 65 6e 74 69 66 69  used as identifi
87c0: 65 72 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f  ers if.    ** po
87d0: 73 73 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69  ssible.  Otherwi
87e0: 73 65 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61  se they remain a
87f0: 73 20 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67  s strings.  Sing
8800: 6c 65 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a  le-quoted.    **
8810: 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61   strings (ex: 'a
8820: 62 63 27 29 20 61 72 65 20 61 6c 77 61 79 73 20  bc') are always 
8830: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e  string literals.
8840: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
8850: 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
8860: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74      if( pExpr->t
8870: 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20  oken.z[0]=='\'' 
8880: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f  ) break;.      /
8890: 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  * Fall thru into
88a0: 20 74 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20   the TK_ID case 
88b0: 69 66 20 74 68 69 73 20 69 73 20 61 20 64 6f 75  if this is a dou
88c0: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
88d0: 67 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f  g */.    }.    /
88e0: 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66  * A lone identif
88f0: 69 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ier is the name 
8900: 6f 66 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  of a column..   
8910: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
8920: 49 44 3a 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b  ID: {.      look
8930: 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30  upName(pParse, 0
8940: 2c 20 30 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b  , 0, &pExpr->tok
8950: 65 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b  en, pNC, pExpr);
8960: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
8970: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
8980: 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   A table name an
8990: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20  d column name:  
89a0: 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20     ID.ID.    ** 
89b0: 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c 20 74  Or a database, t
89c0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a  able and column:
89d0: 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a    ID.ID.ID.    *
89e0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  /.    case TK_DO
89f0: 54 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  T: {.      Token
8a00: 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20   *pColumn;.     
8a10: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a   Token *pTable;.
8a20: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62        Token *pDb
8a30: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
8a40: 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ight;..      /* 
8a50: 69 66 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20  if( pSrcList==0 
8a60: 29 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20  ) break; */.    
8a70: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
8a80: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
8a90: 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  if( pRight->op==
8aa0: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
8ab0: 20 70 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20   pDb = 0;.      
8ac0: 20 20 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70    pTable = &pExp
8ad0: 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  r->pLeft->token;
8ae0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  .        pColumn
8af0: 20 3d 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65   = &pRight->toke
8b00: 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  n;.      }else{.
8b10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8b20: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44  pRight->op==TK_D
8b30: 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  OT );.        pD
8b40: 62 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66  b = &pExpr->pLef
8b50: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
8b60: 20 20 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67    pTable = &pRig
8b70: 68 74 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  ht->pLeft->token
8b80: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d  ;.        pColum
8b90: 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69  n = &pRight->pRi
8ba0: 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  ght->token;.    
8bb0: 20 20 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70    }.      lookup
8bc0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62  Name(pParse, pDb
8bd0: 2c 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d  , pTable, pColum
8be0: 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a  n, pNC, pExpr);.
8bf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
8c00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
8c10: 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e  solve function n
8c20: 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ames.    */.    
8c30: 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55  case TK_CONST_FU
8c40: 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NC:.    case TK_
8c50: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
8c60: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8c70: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
8c80: 3b 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75  ;    /* The argu
8c90: 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20  ment list */.   
8ca0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74     int n = pList
8cb0: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
8cc0: 3a 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  : 0;  /* Number 
8cd0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8ce0: 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63        int no_suc
8cf0: 68 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20  h_func = 0;     
8d00: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20    /* True if no 
8d10: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78  such function ex
8d20: 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ists */.      in
8d30: 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73  t wrong_num_args
8d40: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
8d50: 65 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65  e if wrong numbe
8d60: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
8d70: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61  /.      int is_a
8d80: 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gg = 0;         
8d90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
8da0: 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66  s an aggregate f
8db0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
8dc0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
8dd0: 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
8de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8df0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
8e00: 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61  s in function na
8e10: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  me */.      cons
8e20: 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
8e30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
8e40: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f  unction name. */
8e50: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
8e60: 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  pDef;           
8e70: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
8e80: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63  n about the func
8e90: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
8ea0: 74 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  t enc = ENC(pPar
8eb0: 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20 54 68 65  se->db);  /* The
8ec0: 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69   database encodi
8ed0: 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64  ng */..      zId
8ee0: 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d   = (char*)pExpr-
8ef0: 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  >token.z;.      
8f00: 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  nId = pExpr->tok
8f10: 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66  en.n;.      pDef
8f20: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
8f30: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
8f40: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20  b, zId, nId, n, 
8f50: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
8f60: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
8f70: 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
8f80: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
8f90: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64  (pParse->db, zId
8fa0: 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20  , nId, -1, enc, 
8fb0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
8fc0: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
8fd0: 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e       no_such_fun
8fe0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
8ff0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9000: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
9010: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
9020: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9030: 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66     is_agg = pDef
9040: 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20  ->xFunc==0;.    
9050: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
9060: 5f 61 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c  _agg && !pNC->al
9070: 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20  lowAgg ){.      
9080: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9090: 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
90a0: 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
90b0: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
90c0: 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20   nId,zId);.     
90d0: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
90e0: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
90f0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
9100: 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63  if( no_such_func
9110: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9120: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9130: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e  se, "no such fun
9140: 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49  ction: %.*s", nI
9150: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
9160: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
9170: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72      }else if( wr
9180: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a  ong_num_args ){.
9190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
91a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
91b0: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
91c0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
91d0: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20  ction %.*s()",. 
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c              nId,
91f0: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
9200: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
9210: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
9220: 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  _agg ){.        
9230: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
9240: 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20  GG_FUNCTION;.   
9250: 20 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67       pNC->hasAgg
9260: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9270: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
9280: 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d   pNC->allowAgg =
9290: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
92a0: 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20  0; pNC->nErr==0 
92b0: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
92c0: 20 20 20 20 20 20 77 61 6c 6b 45 78 70 72 54 72        walkExprTr
92d0: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ee(pList->a[i].p
92e0: 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76  Expr, nameResolv
92f0: 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20  erStep, pNC);.  
9300: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9310: 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c  is_agg ) pNC->al
9320: 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  lowAgg = 1;.    
9330: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f    /* FIX ME:  Co
9340: 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66  mpute pExpr->aff
9350: 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74  inity based on t
9360: 68 65 20 65 78 70 65 63 74 65 64 20 72 65 74 75  he expected retu
9370: 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65  rn.      ** type
9380: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
9390: 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
93a0: 20 72 65 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a   return is_agg;.
93b0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
93c0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
93d0: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
93e0: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
93f0: 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69  TK_EXISTS:.#endi
9400: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  f.    case TK_IN
9410: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
9420: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
9430: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66          int nRef
9440: 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69   = pNC->nRef;.#i
9450: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9460: 54 5f 43 48 45 43 4b 0a 20 20 20 20 20 20 20 20  T_CHECK.        
9470: 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b  if( pNC->isCheck
9480: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
9490: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
94a0: 61 72 73 65 2c 22 73 75 62 71 75 65 72 69 65 73  arse,"subqueries
94b0: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
94c0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
94d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  ");.        }.#e
94e0: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c  ndif.        sql
94f0: 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
9500: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9510: 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a  >pSelect, pNC);.
9520: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9530: 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20  pNC->nRef>=nRef 
9540: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
9550: 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29  Ref!=pNC->nRef )
9560: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
9570: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
9580: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
9590: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
95a0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
95b0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
95c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
95d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
95e0: 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 69  IABLE: {.      i
95f0: 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20  f( pNC->isCheck 
9600: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9610: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9620: 65 2c 22 70 61 72 61 6d 65 74 65 72 73 20 70 72  e,"parameters pr
9630: 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45 43  ohibited in CHEC
9640: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b  K constraints");
9650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9660: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9670: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
9680: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
9690: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61   routine walks a
96a0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
96b0: 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72  e and resolves r
96c0: 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20  eferences to.** 
96d0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20  table columns.  
96e0: 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72  Nodes of the for
96f0: 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65  m ID.ID or ID re
9700: 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a  solve into an.**
9710: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61   index to the ta
9720: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
9730: 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75   list and a colu
9740: 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20  mn offset.  The 
9750: 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20  .** Expr.opcode 
9760: 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69  for such nodes i
9770: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
9780: 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70  COLUMN.  The Exp
9790: 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  r.iTable.** valu
97a0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
97b0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
97c0: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
97d0: 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a  e in pTabList.**
97e0: 20 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22   plus the "base"
97f0: 20 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73   value.  The bas
9800: 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74  e value will ult
9810: 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74  imately become t
9820: 68 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f  he.** VDBE curso
9830: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63  r number for a c
9840: 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f  ursor that is po
9850: 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20  inting into the 
9860: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61  referenced.** ta
9870: 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ble.  The Expr.i
9880: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20  Column value is 
9890: 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69  changed to the i
98a0: 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
98b0: 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  mn .** of the re
98c0: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20  ferenced table. 
98d0: 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d   The Expr.iColum
98e0: 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  n value for the 
98f0: 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44  special.** ROWID
9900: 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20   column is -1.  
9910: 41 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d  Any INTEGER PRIM
9920: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69  ARY KEY column i
9930: 73 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a  s tried as an.**
9940: 20 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44   alias for ROWID
9950: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73  ..**.** Also res
9960: 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61  olve function na
9970: 6d 65 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68  mes and check th
9980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20  e functions for 
9990: 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e  proper.** usage.
99a0: 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20    Make sure all 
99b0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61  function names a
99c0: 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e  re recognized an
99d0: 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a  d all functions.
99e0: 2a 2a 20 68 61 76 65 20 74 68 65 20 63 6f 72 72  ** have the corr
99f0: 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ect number of ar
9a00: 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20  guments.  Leave 
9a10: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9a20: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  .** in pParse->z
9a30: 45 72 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69  ErrMsg if anythi
9a40: 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65  ng is amiss.  Re
9a50: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
9a60: 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
9a70: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
9a80: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72  on contains aggr
9a90: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
9aa0: 74 68 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f  then set the EP_
9ab0: 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20  Agg.** property 
9ac0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
9ad0: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
9ae0: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
9af0: 73 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  s(.  NameContext
9b00: 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20   *pNC,       /* 
9b10: 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73  Namespace to res
9b20: 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73  olve expressions
9b30: 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a   in. */.  Expr *
9b40: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
9b50: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
9b60: 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  ion to be analyz
9b70: 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ed. */.){.  int 
9b80: 73 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20 69  savedHasAgg;.  i
9b90: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
9ba0: 74 75 72 6e 20 30 3b 0a 20 20 73 61 76 65 64 48  turn 0;.  savedH
9bb0: 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73  asAgg = pNC->has
9bc0: 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41  Agg;.  pNC->hasA
9bd0: 67 67 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78  gg = 0;.  walkEx
9be0: 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 6e 61  prTree(pExpr, na
9bf0: 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20  meResolverStep, 
9c00: 70 4e 43 29 3b 0a 20 20 69 66 28 20 70 4e 43 2d  pNC);.  if( pNC-
9c10: 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 45  >nErr>0 ){.    E
9c20: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
9c30: 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b  Expr, EP_Error);
9c40: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e  .  }.  if( pNC->
9c50: 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78  hasAgg ){.    Ex
9c60: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
9c70: 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20  xpr, EP_Agg);.  
9c80: 7d 65 6c 73 65 20 69 66 28 20 73 61 76 65 64 48  }else if( savedH
9c90: 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 4e 43  asAgg ){.    pNC
9ca0: 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20  ->hasAgg = 1;.  
9cb0: 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72 48  }.  return ExprH
9cc0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
9cd0: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a  , EP_Error);.}..
9ce0: 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  /*.** A pointer 
9cf0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
9d00: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
9d10: 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72  ed to pass infor
9d20: 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67  mation.** throug
9d30: 68 20 77 61 6c 6b 45 78 70 72 54 72 65 65 20 69  h walkExprTree i
9d40: 6e 74 6f 20 63 6f 64 65 53 75 62 71 75 65 72 79  nto codeSubquery
9d50: 53 74 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64  Step()..*/.typed
9d60: 65 66 20 73 74 72 75 63 74 20 51 75 65 72 79 43  ef struct QueryC
9d70: 6f 64 65 72 20 51 75 65 72 79 43 6f 64 65 72 3b  oder QueryCoder;
9d80: 0a 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64  .struct QueryCod
9d90: 65 72 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  er {.  Parse *pP
9da0: 61 72 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  arse;       /* T
9db0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
9dc0: 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  xt */.  NameCont
9dd0: 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20  ext *pNC;    /* 
9de0: 4e 61 6d 65 73 70 61 63 65 20 6f 66 20 66 69 72  Namespace of fir
9df0: 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65  st enclosing que
9e00: 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  ry */.};.../*.**
9e10: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
9e20: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
9e30: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 6e 20  ries used as an 
9e40: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e  expression.** an
9e50: 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  d IN operators. 
9e60: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
9e70: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
9e80: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
9e90: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
9ea0: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
9eb0: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
9ec0: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
9ed0: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
9ee0: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
9ef0: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
9f00: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
9f10: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
9f20: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
9f30: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
9f40: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
9f50: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
9f60: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
9f70: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
9f80: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
9f90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
9fa0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
9fb0: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
9fc0: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 23  r subquery..*/.#
9fd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9fe0: 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64  IT_SUBQUERY.void
9ff0: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
a000: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
a010: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
a020: 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64  ){.  int testAdd
a030: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a050: 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64  One-time test ad
a060: 64 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20  dress */.  Vdbe 
a070: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
a080: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
a090: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
a0a0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ;..  /* This cod
a0b0: 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e  e must be run in
a0c0: 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76   its entirety ev
a0d0: 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65  ery time it is e
a0e0: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
a0f0: 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
a100: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
a110: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
a120: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
a130: 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
a140: 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
a150: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
a160: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
a170: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
a180: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
a190: 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
a1a0: 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
a1b0: 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
a1c0: 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
a1d0: 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
a1e0: 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
a1f0: 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
a200: 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
a210: 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
a220: 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
a230: 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
a240: 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
a250: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
a260: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
a270: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
a280: 53 65 6c 65 63 74 29 20 26 26 20 21 70 50 61 72  Select) && !pPar
a290: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b  se->trigStack ){
a2a0: 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 70  .    int mem = p
a2b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
a2c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a2d0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
a2e0: 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  d, mem, 0);.    
a2f0: 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74  testAddr = sqlit
a300: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a310: 50 5f 49 66 2c 20 30 2c 20 30 29 3b 0a 20 20 20  P_If, 0, 0);.   
a320: 20 61 73 73 65 72 74 28 20 74 65 73 74 41 64 64   assert( testAdd
a330: 72 3e 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  r>0 || sqlite3Ma
a340: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a  llocFailed() );.
a350: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a360: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
a370: 74 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 7d 0a  t, 1, mem);.  }.
a380: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
a390: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
a3a0: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
a3b0: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
a3c0: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79       KeyInfo key
a3d0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20  Info;.      int 
a3e0: 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  addr;        /* 
a3f0: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
a400: 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75  enVirtual instru
a410: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ction */..      
a420: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
a430: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
a440: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
a450: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
a460: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
a470: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
a480: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
a490: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
a4a0: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
a4b0: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
a4c0: 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20   way. A virtual 
a4d0: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
a4e0: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
a4f0: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
a500: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
a510: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
a520: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
a530: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
a540: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
a550: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
a560: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
a570: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
a580: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
a590: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
a5a0: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
a5b0: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
a5c0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
a5d0: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
a5e0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
a5f0: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
a600: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
a610: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
a620: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
a630: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
a640: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
a650: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
a660: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
a670: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
a680: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
a690: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
a6a0: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
a6b0: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
a6c0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
a6d0: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
a6e0: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
a6f0: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
a700: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
a710: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
a720: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
a730: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
a740: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
a750: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a760: 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70 45  _OpenVirtual, pE
a770: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
a780: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b  .      memset(&k
a790: 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  eyInfo, 0, sizeo
a7a0: 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20  f(keyInfo));.   
a7b0: 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c     keyInfo.nFiel
a7c0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  d = 1;.      sql
a7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a7e0: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
a7f0: 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  s, pExpr->iTable
a800: 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 1);..      if(
a810: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
a820: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
a830: 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
a840: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
a850: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
a860: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
a870: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
a880: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
a890: 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
a8a0: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
a8b0: 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
a8c0: 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
a8d0: 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
a8e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61  .        int iPa
a8f0: 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  rm = pExpr->iTab
a900: 6c 65 20 2b 20 20 28 28 28 69 6e 74 29 61 66 66  le +  (((int)aff
a910: 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20  inity)<<16);.   
a920: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
a930: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61  EList;.        a
a940: 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
a950: 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
a960: 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
a970: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
a980: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
a990: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
a9a0: 2c 20 53 52 54 5f 53 65 74 2c 20 69 50 61 72 6d  , SRT_Set, iParm
a9b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
a9c0: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
a9d0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
a9e0: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
a9f0: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
aa00: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b  List->nExpr>0 ){
aa10: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
aa20: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 62  nfo.aColl[0] = b
aa30: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
aa40: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
aa50: 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20  r->pLeft,.      
aa60: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e          pEList->
aa70: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
aa80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
aa90: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  se if( pExpr->pL
aaa0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
aab0: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
aac0: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
aad0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a 2a 20  .        **..** 
aae0: 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
aaf0: 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
ab00: 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
ab10: 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
ab20: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
ab30: 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
ab40: 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
ab50: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
ab60: 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
ab70: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
ab80: 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
ab90: 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
aba0: 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
abb0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
abc0: 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
abd0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
abe0: 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
abf0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
ac00: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
ac10: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
ac20: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
ac30: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
ac40: 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 20 20 20  m *pItem;..     
ac50: 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
ac60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
ac70: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
ac80: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
ac90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b       }.        k
aca0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
acb0: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  = pExpr->pLeft->
acc0: 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20  pColl;..        
acd0: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
ace0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
acf0: 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
ad00: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  /.        for(i=
ad10: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
ad20: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
ad30: 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
ad40: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
ad50: 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
ad60: 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  Expr;..         
ad70: 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65   /* If the expre
ad80: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e  ssion is not con
ad90: 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69  stant then we wi
ada0: 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ll need to.     
adb0: 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
adc0: 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
add0: 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
ade0: 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
adf0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
ae00: 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78  his code only ex
ae10: 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65  ecutes once.  Be
ae20: 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d  cause for a non-
ae30: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20  constant.       
ae40: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
ae50: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75   we need to reru
ae60: 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68  n this code each
ae70: 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20   time..         
ae80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
ae90: 28 20 74 65 73 74 41 64 64 72 3e 30 20 26 26 20  ( testAddr>0 && 
aea0: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
aeb0: 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20  nstant(pE2) ){. 
aec0: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 4f             VdbeO
aed0: 70 20 2a 61 4f 70 20 3d 20 73 71 6c 69 74 65 33  p *aOp = sqlite3
aee0: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 74 65 73  VdbeGetOp(v, tes
aef0: 74 41 64 64 72 2d 31 29 3b 0a 20 20 20 20 20 20  tAddr-1);.      
af00: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
af10: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
af20: 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<3; i++){.   
af30: 20 20 20 20 20 20 20 20 20 20 20 61 4f 70 5b 69             aOp[i
af40: 5d 2e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ].opcode = OP_No
af50: 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  op;.            
af60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  }.            te
af70: 73 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  stAddr = 0;.    
af80: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
af90: 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
afa0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
afb0: 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
afc0: 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
afd0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
afe0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
aff0: 72 73 65 2c 20 70 45 32 29 3b 0a 20 20 20 20 20  rse, pE2);.     
b000: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b010: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
b020: 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66  cord, 1, 0, &aff
b030: 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
b040: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b050: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
b060: 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
b070: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
b080: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
b0a0: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
b0b0: 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c  void *)&keyInfo,
b0c0: 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
b0d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b0e0: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
b0f0: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
b100: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
b110: 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f    /* This has to
b120: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
b130: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
b140: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
b150: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
b160: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
b170: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
b180: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
b190: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
b1a0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
b1b0: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20  in iColumn..    
b1c0: 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69    */.      stati
b1d0: 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e  c const Token on
b1e0: 65 20 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c 20  e = { (u8*)"1", 
b1f0: 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 53 65  0, 1 };.      Se
b200: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20  lect *pSel;.    
b210: 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20    int iMem;.    
b220: 20 20 69 6e 74 20 73 6f 70 3b 0a 0a 20 20 20 20    int sop;..    
b230: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
b240: 20 3d 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65   = iMem = pParse
b250: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
b260: 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53  pSel = pExpr->pS
b270: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28  elect;.      if(
b280: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
b290: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
b2a0: 20 73 6f 70 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a   sop = SRT_Mem;.
b2b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b2c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
b2d0: 65 6d 4e 75 6c 6c 2c 20 69 4d 65 6d 2c 20 30 29  emNull, iMem, 0)
b2e0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
b2f0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 49 6e 69  mment((v, "# Ini
b300: 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
b310: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t"));.      }els
b320: 65 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d  e{.        sop =
b330: 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
b340: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b350: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
b360: 6e 74 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20 20  nt, 0, iMem);.  
b370: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
b380: 74 28 28 76 2c 20 22 23 20 49 6e 69 74 20 45 58  t((v, "# Init EX
b390: 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a  ISTS result"));.
b3a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
b3b0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
b3c0: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
b3d0: 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
b3e0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
b3f0: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30  TK_INTEGER, 0, 0
b400: 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73  , &one);.      s
b410: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
b420: 72 73 65 2c 20 70 53 65 6c 2c 20 73 6f 70 2c 20  rse, pSel, sop, 
b430: 69 4d 65 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30  iMem, 0, 0, 0, 0
b440: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b450: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
b460: 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20   testAddr ){.   
b470: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b480: 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72  Here(v, testAddr
b490: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
b4a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
b4b0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b4c0: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  Y */../*.** Gene
b4d0: 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
b4e0: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
b4f0: 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65  t the integer de
b500: 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78  scribe by.** tex
b510: 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74  t z[0..n-1] on t
b520: 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61  he stack..*/.sta
b530: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
b540: 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f  eger(Vdbe *v, co
b550: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
b560: 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   n){.  int i;.  
b570: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e  if( sqlite3GetIn
b580: 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20  t32(z, &i) ){.  
b590: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b5a0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
b5b0: 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , i, 0);.  }else
b5c0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73   if( sqlite3Fits
b5d0: 49 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20  In64Bits(z) ){. 
b5e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
b5f0: 33 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  3(v, OP_Int64, 0
b600: 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65  , 0, z, n);.  }e
b610: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
b620: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65  VdbeOp3(v, OP_Re
b630: 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b  al, 0, 0, z, n);
b640: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
b650: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
b660: 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
b670: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
b680: 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
b690: 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20  ssion and leave 
b6a0: 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68  the result on th
b6b0: 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a  e top of stack..
b6c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
b6d0: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
b6e0: 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
b6f0: 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
b700: 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
b710: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
b720: 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
b730: 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
b740: 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
b750: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
b760: 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
b770: 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
b780: 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
b790: 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
b7a0: 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
b7b0: 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
b7c0: 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
b7d0: 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
b7e0: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
b7f0: 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
b800: 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
b810: 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
b820: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b830: 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
b840: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
b850: 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76  Expr){.  Vdbe *v
b860: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
b870: 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 6e  ;.  int op;.  in
b880: 74 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 31 3b  t stackChng = 1;
b890: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
b8a0: 20 63 68 61 6e 67 65 20 74 6f 20 73 74 61 63 6b   change to stack
b8b0: 20 64 65 70 74 68 20 2a 2f 0a 0a 20 20 69 66 28   depth */..  if(
b8c0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
b8d0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
b8e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b8f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
b900: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65  l, 0, 0);.    re
b910: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d  turn;.  }.  op =
b920: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
b930: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
b940: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
b950: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
b960: 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
b970: 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
b980: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
b990: 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
b9a0: 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
b9b0: 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
b9c0: 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
b9d0: 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
b9e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b9f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ba00: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 43 6f 6c 2d  P_MemLoad, pCol-
ba10: 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  >iMem, 0);.     
ba20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ba30: 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
ba40: 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
ba50: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
ba60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ba70: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67   OP_Column, pAgg
ba80: 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78  Info->sortingIdx
ba90: 2c 0a 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 20 20 20 20 20                  
bab0: 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
bac0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 62 72  umn);.        br
bad0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
bae0: 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c     /* Otherwise,
baf0: 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20   fall thru into 
bb00: 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61  the TK_COLUMN ca
bb10: 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
bb20: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
bb30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
bb40: 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20  r->iTable<0 ){. 
bb50: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f         /* This o
bb60: 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
bb70: 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f   coding check co
bb80: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
bb90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
bba0: 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3e 30 20  rse->ckOffset>0 
bbb0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bbc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bbd0: 50 5f 44 75 70 2c 20 70 50 61 72 73 65 2d 3e 63  P_Dup, pParse->c
bbe0: 6b 4f 66 66 73 65 74 2d 70 45 78 70 72 2d 3e 69  kOffset-pExpr->i
bbf0: 43 6f 6c 75 6d 6e 2d 31 2c 20 31 29 3b 0a 20 20  Column-1, 1);.  
bc00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
bc10: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
bc20: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
bc30: 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e   *pTab = pExpr->
bc40: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 6e  pTab;.        in
bc50: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
bc60: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
bc70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bc80: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
bc90: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69  pExpr->iTable, i
bca0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
bcb0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75  lite3ColumnDefau
bcc0: 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c  lt(v, pTab, iCol
bcd0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
bce0: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
bcf0: 50 4f 49 4e 54 0a 20 20 20 20 20 20 20 20 69 66  POINT.        if
bd00: 28 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  ( pTab && pTab->
bd10: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e  aCol[iCol].affin
bd20: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
bd30: 52 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  REAL ){.        
bd40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bd50: 4f 70 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  Op(v, OP_RealAff
bd60: 69 6e 69 74 79 2c 20 30 2c 20 30 29 3b 0a 20 20  inity, 0, 0);.  
bd70: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
bd80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bd90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bda0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64  ddOp(v, OP_Rowid
bdb0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
bdc0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
bdd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bde0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
bdf0: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  GER: {.      cod
be00: 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68 61  eInteger(v, (cha
be10: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
be20: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
be30: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
be40: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
be50: 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61  TK_FLOAT:.    ca
be60: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
be70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
be80: 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65 61 6c 20  _FLOAT==OP_Real 
be90: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
bea0: 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f 50 5f 53   TK_STRING==OP_S
beb0: 74 72 69 6e 67 38 20 29 3b 0a 20 20 20 20 20 20  tring8 );.      
bec0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78  sqlite3DequoteEx
bed0: 70 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20  pr(pExpr);.     
bee0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
bef0: 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 28 63 68  v, op, 0, 0, (ch
bf00: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
bf10: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
bf20: 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .n);.      break
bf30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
bf40: 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
bf50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bf60: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
bf70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
bf80: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
bf90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
bfa0: 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
bfb0: 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
bfc0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
bfd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
bfe0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
bff0: 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c 6f  _BLOB==OP_HexBlo
c000: 62 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70  b );.      n = p
c010: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20  Expr->token.n - 
c020: 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68  3;.      z = (ch
c030: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
c040: 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20 61 73  .z + 2;.      as
c050: 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20  sert( n>=0 );.  
c060: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
c070: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 22 3b 0a          z = "";.
c080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
c090: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
c0a0: 6f 70 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b  op, 0, 0, z, n);
c0b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c0c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
c0d0: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
c0e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
c0f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c100: 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
c110: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
c120: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f     if( pExpr->to
c130: 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20  ken.n>1 ){.     
c140: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
c150: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63  angeP3(v, -1, (c
c160: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
c170: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
c180: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n.n);.      }.  
c190: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c1a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
c1b0: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
c1c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c1d0: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
c1e0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29  Expr->iTable, 0)
c1f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c200: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
c210: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
c220: 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
c230: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
c240: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
c250: 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
c260: 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
c270: 20 20 20 20 69 6e 74 20 61 66 66 2c 20 6f 70 3b      int aff, op;
c280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c290: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c2a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
c2b0: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
c2c0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70  3AffinityType(&p
c2d0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  Expr->token);.  
c2e0: 20 20 20 20 6f 70 20 3d 20 61 66 66 20 2d 20 53      op = aff - S
c2f0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b  QLITE_AFF_TEXT +
c300: 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20   OP_ToText;.    
c310: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50    assert( op==OP
c320: 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66  _ToText    || af
c330: 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f!=SQLITE_AFF_TE
c340: 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  XT    );.      a
c350: 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 54 6f  ssert( op==OP_To
c360: 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d  Blob    || aff!=
c370: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
c380: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
c390: 72 74 28 20 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d  rt( op==OP_ToNum
c3a0: 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c  eric || aff!=SQL
c3b0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
c3c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c3d0: 20 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20   op==OP_ToInt   
c3e0: 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
c3f0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a  _AFF_INTEGER );.
c400: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70        assert( op
c410: 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c  ==OP_ToReal    |
c420: 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
c430: 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20  F_REAL    );.   
c440: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c450: 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29  dOp(v, op, 0, 0)
c460: 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e  ;.      stackChn
c470: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  g = 0;.      bre
c480: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
c490: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
c4a0: 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
c4b0: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
c4c0: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
c4d0: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
c4e0: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
c4f0: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
c500: 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
c510: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
c520: 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
c530: 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
c540: 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
c550: 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
c560: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c570: 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
c580: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c590: 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
c5a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c5b0: 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
c5c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c5d0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
c5e0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
c5f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c600: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c610: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
c620: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
c630: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
c640: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
c650: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
c660: 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31 3b   stackChng = -1;
c670: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c680: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c690: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
c6a0: 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
c6b0: 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
c6c0: 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
c6d0: 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
c6e0: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
c6f0: 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
c700: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
c710: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
c720: 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
c730: 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
c740: 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
c750: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
c760: 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
c770: 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41  rt( TK_AND==OP_A
c780: 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nd );.      asse
c790: 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
c7a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c7b0: 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64  ( TK_PLUS==OP_Ad
c7c0: 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
c7d0: 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
c7e0: 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20  Subtract );.    
c7f0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d    assert( TK_REM
c800: 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29  ==OP_Remainder )
c810: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c820: 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69  TK_BITAND==OP_Bi
c830: 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  tAnd );.      as
c840: 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d  sert( TK_BITOR==
c850: 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20  OP_BitOr );.    
c860: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
c870: 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
c880: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c890: 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
c8a0: 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  ftLeft );.      
c8b0: 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
c8c0: 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
c8d0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c8e0: 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f  ( TK_CONCAT==OP_
c8f0: 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20  Concat );.      
c900: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c910: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
c920: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
c930: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c940: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
c950: 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ht);.      sqlit
c960: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
c970: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
c980: 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31 3b 0a  stackChng = -1;.
c990: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c9a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
c9b0: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
c9c0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
c9d0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
c9e0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
c9f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
ca00: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
ca10: 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  || pLeft->op==TK
ca20: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
ca30: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26      Token *p = &
ca40: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
ca50: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
ca60: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
ca70: 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d  -%.*s", p->n, p-
ca80: 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >z);.        if(
ca90: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
caa0: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
cab0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
cac0: 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
cad0: 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20  0, z, p->n+1);. 
cae0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
caf0: 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
cb00: 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31  ger(v, z, p->n+1
cb10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
cb20: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
cb30: 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  z);.        brea
cb40: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
cb50: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
cb60: 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a   into TK_NOT */.
cb70: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
cb80: 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
cb90: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
cba0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
cbb0: 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20  TNOT==OP_BitNot 
cbc0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cbd0: 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
cbe0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cbf0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
cc00: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
cc10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cc20: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
cc30: 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b   0);.      stack
cc40: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Chng = 0;.      
cc50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
cc60: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
cc70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
cc80: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NULL: {.      in
cc90: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 61 73  t dest;.      as
cca0: 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
ccb0: 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
ccc0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
ccd0: 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
cce0: 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ll );.      sqli
ccf0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cd00: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30  OP_Integer, 1, 0
cd10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cd20: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
cd30: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
cd40: 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c        dest = sql
cd50: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
cd60: 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20  ddr(v) + 2;.    
cd70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cd80: 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73  Op(v, op, 1, des
cd90: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
cda0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cdb0: 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b  _AddImm, -1, 0);
cdc0: 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
cdd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
cde0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
cdf0: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
ce00: 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
ce10: 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
ce20: 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
ce30: 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
ce40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ce50: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ce60: 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
ce70: 67 72 65 67 61 74 65 3a 20 25 54 22 2c 0a 20 20  gregate: %T",.  
ce80: 20 20 20 20 20 20 20 20 20 20 26 70 45 78 70 72            &pExpr
ce90: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  ->span);.      }
cea0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
ceb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
cec0: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 49  , OP_MemLoad, pI
ced0: 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72  nfo->aFunc[pExpr
cee0: 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 2c 20 30 29  ->iAgg].iMem, 0)
cef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cf00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
cf10: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
cf20: 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
cf30: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
cf40: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
cf50: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
cf60: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  t;.      int nEx
cf70: 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  pr = pList ? pLi
cf80: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
cf90: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
cfa0: 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49  ef;.      int nI
cfb0: 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  d;.      const c
cfc0: 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20  har *zId;.      
cfd0: 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  int constMask = 
cfe0: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  0;.      int i;.
cff0: 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
d000: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
d010: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
d020: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
d030: 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78  zId = (char*)pEx
d040: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
d050: 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e     nId = pExpr->
d060: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70  token.n;.      p
d070: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
d080: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
d090: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
d0a0: 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a  nExpr, enc, 0);.
d0b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
d0c0: 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ef!=0 );.      n
d0d0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
d0e0: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
d0f0: 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20  Parse, pList);. 
d100: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
d110: 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69  nExpr && i<32; i
d120: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
d130: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
d140: 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b  nstant(pList->a[
d150: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
d160: 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
d170: 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20   |= (1<<i);.    
d180: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
d190: 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c  ( pDef->needColl
d1a0: 53 65 71 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  Seq && !pColl ){
d1b0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
d1c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
d1d0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
d1e0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
d1f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d200: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
d210: 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  ef->needCollSeq 
d220: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
d230: 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
d240: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
d250: 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20  tColl; .        
d260: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
d270: 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
d280: 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
d290: 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P3_COLLSEQ);.
d2a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d2b0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
d2c0: 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e  OP_Function, con
d2d0: 73 74 4d 61 73 6b 2c 20 6e 45 78 70 72 2c 20 28  stMask, nExpr, (
d2e0: 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46  char*)pDef, P3_F
d2f0: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
d300: 74 61 63 6b 43 68 6e 67 20 3d 20 31 2d 6e 45 78  tackChng = 1-nEx
d310: 70 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  pr;.      break;
d320: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
d330: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
d340: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
d350: 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
d360: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
d370: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
d380: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
d390: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
d3a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d3b0: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
d3c0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30  Expr->iColumn, 0
d3d0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
d3e0: 6d 65 6e 74 28 28 76 2c 20 22 23 20 6c 6f 61 64  ment((v, "# load
d3f0: 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
d400: 22 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  "));.      break
d410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d420: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
d430: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
d440: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
d450: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
d460: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
d470: 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20  , pExpr);..     
d480: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
d490: 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75  he affinity to u
d4a0: 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b  se to create a k
d4b0: 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75  ey from the resu
d4c0: 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  lts.      ** of 
d4d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
d4e0: 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72  affinityStr stor
d4f0: 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69  es a static stri
d500: 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a  ng suitable for.
d510: 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20 4f        ** P3 of O
d520: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20  P_MakeRecord..  
d530: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66      */.      aff
d540: 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73  inity = comparis
d550: 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  onAffinity(pExpr
d560: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
d570: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d580: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b  _Integer, 1, 0);
d590: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
d5a0: 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
d5b0: 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
d5c0: 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79  ". The temporary
d5d0: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
d5e0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f  pExpr->iTable co
d5f0: 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
d600: 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
d610: 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20  he (...) set..  
d620: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
d630: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d640: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
d650: 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  t);.      addr =
d660: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d670: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
d680: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d690: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
d6a0: 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20 20  , -1, addr+4);  
d6b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64            /* add
d6c0: 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20 73  r + 0 */.      s
d6d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d6e0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29  v, OP_Pop, 2, 0)
d6f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d700: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
d710: 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ull, 0, 0);.    
d720: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d730: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
d740: 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20  , addr+7);.     
d750: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
d760: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
d770: 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 1, 0, &affinit
d780: 79 2c 20 31 29 3b 20 20 20 2f 2a 20 61 64 64 72  y, 1);   /* addr
d790: 20 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20 73 71   + 4 */.      sq
d7a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d7b0: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
d7c0: 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b  r->iTable, addr+
d7d0: 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  7);.      sqlite
d7e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d7f0: 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b  _AddImm, -1, 0);
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d810: 20 20 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f    /* addr + 6 */
d820: 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
d830: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d840: 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
d850: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
d860: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
d870: 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  eft;.      struc
d880: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
d890: 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d  *pLItem = pExpr-
d8a0: 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  >pList->a;.     
d8b0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
d8c0: 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
d8d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d8e0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65  Code(pParse, pLe
d8f0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
d900: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d910: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
d920: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d930: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
d940: 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  ht);.      codeC
d950: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
d960: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
d970: 5f 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  _Ge, 0, 0);.    
d980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d990: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
d9a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4c 49 74  , 0);.      pLIt
d9b0: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67  em++;.      pRig
d9c0: 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
d9d0: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
d9e0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d9f0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
da00: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
da10: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
da20: 68 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29  ht, OP_Le, 0, 0)
da30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
da40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
da50: 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  nd, 0, 0);.     
da60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
da70: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
da80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
da90: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
daa0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
dab0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
dac0: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
dad0: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
dae0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
daf0: 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20   TK_CASE: {.    
db00: 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c    int expr_end_l
db10: 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  abel;.      int 
db20: 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20  jumpInst;.      
db30: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20  int nExpr;.     
db40: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78   int i;.      Ex
db50: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
db60: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
db70: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73  rList_item *aLis
db80: 74 65 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73  telem;..      as
db90: 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  sert(pExpr->pLis
dba0: 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
dbb0: 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  ((pExpr->pList->
dbc0: 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29  nExpr % 2) == 0)
dbd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
dbe0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
dbf0: 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
dc00: 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
dc10: 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
dc20: 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
dc30: 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
dc40: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
dc50: 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c        expr_end_l
dc60: 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
dc70: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
dc80: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
dc90: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
dca0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
dcb0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
dcc0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d  >pLeft);.      }
dcd0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
dce0: 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b  i<nExpr; i=i+2){
dcf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dd00: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
dd10: 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
dd20: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
dd30: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
dd40: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
dd50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
dd60: 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20  OP_Dup, 1, 1);. 
dd70: 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73           jumpIns
dd80: 74 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  t = codeCompare(
dd90: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
dda0: 4c 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  Left, aListelem[
ddb0: 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20  i].pExpr,.      
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
dde0: 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 0, 1);.       
ddf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
de00: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
de10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
de20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  lse{.          j
de30: 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65  umpInst = sqlite
de40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
de50: 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  _IfNot, 1, 0);. 
de60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
de70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
de80: 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
de90: 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a  em[i+1].pExpr);.
dea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
deb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
dec0: 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64  oto, 0, expr_end
ded0: 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  _label);.       
dee0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
def0: 48 65 72 65 28 76 2c 20 6a 75 6d 70 49 6e 73 74  Here(v, jumpInst
df00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
df10: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
df20: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
df30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
df40: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
df50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
df60: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
df70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
df80: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
df90: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
dfa0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
dfb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dfc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
dfd0: 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ull, 0, 0);.    
dfe0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
dff0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
e000: 6c 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61  l(v, expr_end_la
e010: 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
e020: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
e030: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
e040: 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
e050: 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
e060: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69  if( !pParse->tri
e070: 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  gStack ){.      
e080: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e090: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0b0: 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
e0c0: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
e0d0: 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
e0e0: 72 61 6d 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a  ram");..return;.
e0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e100: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
e110: 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  !=OE_Ignore ){. 
e120: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e130: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
e140: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20  OE_Rollback ||. 
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e160: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
e170: 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20  = OE_Abort ||.  
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
e190: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d  Expr->iColumn ==
e1a0: 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20   OE_Fail );.    
e1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
e1c0: 6f 74 65 45 78 70 72 28 70 45 78 70 72 29 3b 0a  oteExpr(pExpr);.
e1d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e1e0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61  VdbeOp3(v, OP_Ha
e1f0: 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
e200: 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43  RAINT, pExpr->iC
e210: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
e230: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
e240: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
e250: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65  en.n);.      } e
e260: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 61  lse {.         a
e270: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
e280: 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f  olumn == OE_Igno
e290: 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73  re );.         s
e2a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e2b0: 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70  v, OP_ContextPop
e2c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
e2d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e2e0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
e2f0: 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  , pParse->trigSt
e300: 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29  ack->ignoreJump)
e310: 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62 65 43  ;.         VdbeC
e320: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 61  omment((v, "# ra
e330: 69 73 65 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a  ise(IGNORE)"));.
e340: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
e350: 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ackChng = 0;.   
e360: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e370: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
e380: 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73  ( pParse->ckOffs
e390: 65 74 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  et ){.    pParse
e3a0: 2d 3e 63 6b 4f 66 66 73 65 74 20 2b 3d 20 73 74  ->ckOffset += st
e3b0: 61 63 6b 43 68 6e 67 3b 0a 20 20 20 20 61 73 73  ackChng;.    ass
e3c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f  ert( pParse->ckO
e3d0: 66 66 73 65 74 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  ffset );.  }.}..
e3e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e3f0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a 2a  MIT_TRIGGER./*.*
e400: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e410: 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68  that evalutes th
e420: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
e430: 6f 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68  on and leaves th
e440: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74  e result.** on t
e450: 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20 61  he stack.  See a
e460: 6c 73 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  lso sqlite3ExprC
e470: 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ode()..**.** Thi
e480: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
e490: 61 6c 73 6f 20 63 61 63 68 65 20 74 68 65 20 72  also cache the r
e4a0: 65 73 75 6c 74 20 61 6e 64 20 6d 6f 64 69 66 79  esult and modify
e4b0: 20 74 68 65 20 70 45 78 70 72 20 74 72 65 65 0a   the pExpr tree.
e4c0: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ** so that it wi
e4d0: 6c 6c 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 74  ll make use of t
e4e0: 68 65 20 63 61 63 68 65 64 20 72 65 73 75 6c 74  he cached result
e4f0: 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 65   on subsequent e
e500: 76 61 6c 75 61 74 69 6f 6e 73 0a 2a 2a 20 72 61  valuations.** ra
e510: 74 68 65 72 20 74 68 61 6e 20 65 76 61 6c 75 61  ther than evalua
e520: 74 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78 70  te the whole exp
e530: 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 2e 20 20  ression again.  
e540: 54 72 69 76 69 61 6c 20 65 78 70 72 65 73 73 69  Trivial expressi
e550: 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 63  ons are.** not c
e560: 61 63 68 65 64 2e 20 20 49 66 20 74 68 65 20 65  ached.  If the e
e570: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 61 63  xpression is cac
e580: 68 65 64 2c 20 69 74 73 20 72 65 73 75 6c 74 20  hed, its result 
e590: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 0a  is stored in a .
e5a0: 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ** memory locati
e5b0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
e5c0: 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
e5d0: 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
e5e0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
e5f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
e600: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
e610: 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 61 64  t iMem;.  int ad
e620: 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 69 66  dr1, addr2;.  if
e630: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
e640: 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
e650: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e660: 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  r(v);.  sqlite3E
e670: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e680: 70 45 78 70 72 29 3b 0a 20 20 61 64 64 72 32 20  pExpr);.  addr2 
e690: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
e6a0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
e6b0: 66 28 20 61 64 64 72 32 3e 61 64 64 72 31 2b 31  f( addr2>addr1+1
e6c0: 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 47   || sqlite3VdbeG
e6d0: 65 74 4f 70 28 76 2c 20 61 64 64 72 31 29 2d 3e  etOp(v, addr1)->
e6e0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
e6f0: 69 6f 6e 20 29 7b 0a 20 20 20 20 69 4d 65 6d 20  ion ){.    iMem 
e700: 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
e710: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
e720: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e730: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
e740: 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b  Store, iMem, 0);
e750: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
e760: 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
e770: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
e780: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e790: 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
e7a0: 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
e7b0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
e7c0: 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
e7d0: 6e 20 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20  n list onto the 
e7e0: 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  stack..**.** Ret
e7f0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
e800: 66 20 65 6c 65 6d 65 6e 74 73 20 70 75 73 68 65  f elements pushe
e810: 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  d onto the stack
e820: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e830: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
e840: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e850: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
e860: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
e870: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20  xprList *pList  
e880: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
e890: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
e8a0: 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  oded */.){.  str
e8b0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e8c0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
e8d0: 69 2c 20 6e 3b 0a 20 20 69 66 28 20 70 4c 69 73  i, n;.  if( pLis
e8e0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
e8f0: 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
e900: 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
e910: 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 6e 3b 20  =pList->a, i=n; 
e920: 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
e930: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
e940: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e950: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
e960: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
e970: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
e980: 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
e990: 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
e9a0: 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
e9b0: 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
e9c0: 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
e9d0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e9e0: 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
e9f0: 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
ea00: 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
ea10: 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
ea20: 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
ea30: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
ea40: 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
ea50: 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
ea60: 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
ea70: 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
ea80: 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
ea90: 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
eaa0: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  s true..**.** Th
eab0: 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
eac0: 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
ead0: 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76   certain token v
eae0: 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51  alues (ex: TK_EQ
eaf0: 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  ).** are the sam
eb00: 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75  e as opcode valu
eb10: 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74  es (ex: OP_Eq) t
eb20: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  hat implement th
eb30: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
eb40: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ** operation.  S
eb50: 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20  pecial comments 
eb60: 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68  in vdbe.c and th
eb70: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
eb80: 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65  script in.** the
eb90: 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61   make process ca
eba0: 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  use these values
ebb0: 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65   to align.  Asse
ebc0: 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64  rt()s in the cod
ebd0: 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66  e.** below verif
ebe0: 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
ebf0: 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63  rs are aligned c
ec00: 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69  orrectly..*/.voi
ec10: 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
ec20: 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
ec30: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
ec40: 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
ec50: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
ec60: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
ec70: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
ec80: 20 30 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66 73   0;.  int ckOffs
ec90: 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f  et = pParse->ckO
eca0: 66 66 73 65 74 3b 0a 20 20 69 66 28 20 76 3d 3d  ffset;.  if( v==
ecb0: 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
ecc0: 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20 70  return;.  op = p
ecd0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
ece0: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
ecf0: 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
ed00: 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
ed10: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
ed20: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
ed30: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
ed40: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ed50: 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e  ft, d2, !jumpIfN
ed60: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
ed70: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
ed80: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
ed90: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
eda0: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
edb0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
edc0: 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
edd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ede0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
edf0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
ee00: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
ee10: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
ee20: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
ee30: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
ee40: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
ee50: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
ee60: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
ee70: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
ee80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
ee90: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
eea0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
eeb0: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
eec0: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
eed0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
eee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
eef0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
ef00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
ef10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
ef20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
ef30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
ef40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
ef50: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
ef60: 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
ef70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
ef80: 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
ef90: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
efa0: 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
efb0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
efc0: 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
efd0: 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
efe0: 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
eff0: 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
f000: 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  _Ne );.      sql
f010: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f020: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f030: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
f040: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f050: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
f060: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
f070: 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
f080: 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
f090: 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73  >pRight, op, des
f0a0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
f0b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f0c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
f0d0: 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
f0e0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
f0f0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
f100: 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
f110: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f120: 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
f130: 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  _NotNull );.    
f140: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f150: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
f160: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
f170: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f180: 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
f190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f1a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f1b0: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
f1c0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
f1d0: 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79 20  on "x BETWEEN y 
f1e0: 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65 6d  AND z" is implem
f1f0: 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20  ented as:.      
f200: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46  **.      ** 1 IF
f210: 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33 0a   (x < y) GOTO 3.
f220: 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28 78        ** 2 IF (x
f230: 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73   <= z) GOTO <des
f240: 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e 2e  t>.      ** 3 ..
f250: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f260: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
f270: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
f280: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
f290: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
f2a0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
f2b0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
f2c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f2d0: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  e(pParse, pLeft)
f2e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f2f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
f300: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
f310: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f320: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
f330: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 63  ;.      addr = c
f340: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
f350: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
f360: 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d  , OP_Lt, 0, !jum
f370: 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  pIfNull);..     
f380: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
f390: 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
f3a0: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
f3b0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f3c0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
f3d0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
f3e0: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
f3f0: 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73 74 2c  ht, OP_Le, dest,
f400: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20   jumpIfNull);.. 
f410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f420: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
f430: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
f440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
f450: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
f460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f470: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
f480: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 1, 0);.      b
f490: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f4a0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
f4b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f4c0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
f4d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f4e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
f4f0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
f500: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
f510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
f520: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d  arse->ckOffset =
f530: 20 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a   ckOffset;.}../*
f540: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
f550: 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
f560: 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
f570: 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
f580: 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
f590: 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
f5a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
f5b0: 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
f5c0: 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
f5d0: 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
f5e0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
f5f0: 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
f600: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
f610: 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
f620: 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
f630: 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
f640: 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
f650: 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 20  pIfNull is true 
f660: 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
f670: 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
f680: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20   false..*/.void 
f690: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
f6a0: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
f6b0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
f6c0: 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
f6d0: 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
f6e0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f6f0: 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
f700: 30 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66 73 65  0;.  int ckOffse
f710: 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66  t = pParse->ckOf
f720: 66 73 65 74 3b 0a 20 20 69 66 28 20 76 3d 3d 30  fset;.  if( v==0
f730: 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72   || pExpr==0 ) r
f740: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65  eturn;..  /* The
f750: 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d   value of pExpr-
f760: 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72  >op and op are r
f770: 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  elated as follow
f780: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
f790: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
f7a0: 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20          op.  ** 
f7b0: 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20        --------- 
f7c0: 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
f7d0: 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ---.  **       T
f7e0: 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20  K_ISNULL        
f7f0: 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a    OP_NotNull.  *
f800: 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55  *       TK_NOTNU
f810: 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73  LL         OP_Is
f820: 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
f830: 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20  TK_NE           
f840: 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20     OP_Eq.  **   
f850: 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20      TK_EQ       
f860: 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a         OP_Ne.  *
f870: 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20  *       TK_GT   
f880: 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65             OP_Le
f890: 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
f8a0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
f8b0: 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Gt.  **       
f8c0: 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20  TK_GE           
f8d0: 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20     OP_Lt.  **   
f8e0: 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20      TK_LT       
f8f0: 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a         OP_Ge.  *
f900: 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72  *.  ** For other
f910: 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72   values of pExpr
f920: 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65  ->op, op is unde
f930: 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64  fined and unused
f940: 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65  ..  ** The value
f950: 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
f960: 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72  constants are ar
f970: 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74  ranged such that
f980: 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d   we.  ** can com
f990: 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67  pute the mapping
f9a0: 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65   above using the
f9b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65   following expre
f9c0: 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65  ssion..  ** Asse
f9d0: 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61  rt()s verify tha
f9e0: 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  t the computatio
f9f0: 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  n is correct..  
fa00: 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70  */.  op = ((pExp
fa10: 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c  r->op+(TK_ISNULL
fa20: 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55  &1))^1)-(TK_ISNU
fa30: 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  LL&1);..  /* Ver
fa40: 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67  ify correct alig
fa50: 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64  nment of TK_ and
fa60: 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20   OP_ constants. 
fa70: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
fa80: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  xpr->op!=TK_ISNU
fa90: 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74  LL || op==OP_Not
faa0: 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
fab0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
fac0: 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  NOTNULL || op==O
fad0: 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  P_IsNull );.  as
fae0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
faf0: 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_NE || op==OP
fb00: 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Eq );.  assert(
fb10: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45   pExpr->op!=TK_E
fb20: 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29  Q || op==OP_Ne )
fb30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
fb40: 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op!=TK_LT || 
fb50: 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61  op==OP_Ge );.  a
fb60: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
fb70: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LE || op==O
fb80: 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Gt );.  assert
fb90: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
fba0: 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20  GT || op==OP_Le 
fbb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
fbc0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  pr->op!=TK_GE ||
fbd0: 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20   op==OP_Lt );.. 
fbe0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
fbf0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
fc00: 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73  K_AND: {.      s
fc10: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
fc20: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
fc30: 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
fc40: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
fc50: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
fc60: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
fc70: 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
fc80: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
fc90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fca0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
fcb0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
fcc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
fcd0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
fce0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
fcf0: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
fd00: 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75  ->pLeft, d2, !ju
fd10: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
fd20: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
fd30: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
fd40: 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
fd50: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
fd60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
fd70: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
fd80: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
fd90: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fda0: 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
fdb0: 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
fdc0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
fdd0: 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
fde0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
fdf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
fe00: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
fe10: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
fe20: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
fe30: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
fe40: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
fe50: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
fe60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fe70: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
fe80: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
fe90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
fea0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
feb0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
fec0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
fed0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
fee0: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
fef0: 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , op, dest, jump
ff00: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
ff10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ff20: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
ff30: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
ff40: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
ff50: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ff60: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
ff70: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
ff80: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
ff90: 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
ffa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ffb0: 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
ffc0: 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  EN: {.      /* T
ffd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
ffe0: 20 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e   "x BETWEEN y AN
fff0: 44 20 7a 22 2e 20 49 74 20 69 73 20 69 6d 70 6c  D z". It is impl
10000 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20  emented as:.    
10010 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20    **.      ** 1 
10020 49 46 20 28 78 20 3e 3d 20 79 29 20 47 4f 54 4f  IF (x >= y) GOTO
10030 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20 47 4f   3.      ** 2 GO
10040 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20  TO <dest>.      
10050 2a 2a 20 33 20 49 46 20 28 78 20 3e 20 7a 29 20  ** 3 IF (x > z) 
10060 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20  GOTO <dest>.    
10070 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
10080 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ddr;.      Expr 
10090 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
100a0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70  pLeft;.      Exp
100b0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
100c0 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
100d0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
100e0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
100f0 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  se, pLeft);.    
10100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10110 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
10120 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
10130 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10140 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
10150 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
10160 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10170 76 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  v);.      codeCo
10180 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
10190 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
101a0 47 65 2c 20 61 64 64 72 2b 33 2c 20 21 6a 75 6d  Ge, addr+3, !jum
101b0 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  pIfNull);..     
101c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
101d0 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
101e0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
101f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10200 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b  _Goto, 0, dest);
10210 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
10220 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
10230 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  1].pExpr;.      
10240 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
10250 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
10260 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
10270 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
10280 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 74 2c  , pRight, OP_Gt,
10290 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
102a0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
102b0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
102c0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  lt: {.      sqli
102d0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
102e0 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
102f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10300 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  Op(v, OP_IfNot, 
10310 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74  jumpIfNull, dest
10320 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10330 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
10340 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63  se->ckOffset = c
10350 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  kOffset;.}../*.*
10360 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
10370 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
10380 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
10390 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f   Return TRUE (no
103a0 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68  n-zero).** if th
103b0 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
103c0 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53   and return FALS
103d0 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  E if they differ
103e0 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a   in any way..*/.
103f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
10400 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c  ompare(Expr *pA,
10410 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e   Expr *pB){.  in
10420 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
10430 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ||pB==0 ){.    r
10440 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20 20  eturn pB==pA;.  
10450 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
10460 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20  pB->op ) return 
10470 30 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  0;.  if( (pA->fl
10480 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
10490 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
104a0 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
104b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
104c0 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
104d0 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
104e0 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  B->pLeft) ) retu
104f0 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
10500 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
10510 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
10520 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e  pRight) ) return
10530 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c   0;.  if( pA->pL
10540 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ist ){.    if( p
10550 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  B->pList==0 ) re
10560 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
10570 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pA->pList->nExpr
10580 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  !=pB->pList->nEx
10590 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  pr ) return 0;. 
105a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
105b0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  ->pList->nExpr; 
105c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
105d0 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
105e0 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61  are(pA->pList->a
105f0 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70  [i].pExpr, pB->p
10600 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10610 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
10620 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
10630 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
10640 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pB->pList ){.  
10650 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
10660 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63    if( pA->pSelec
10670 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74  t || pB->pSelect
10680 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
10690 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70  f( pA->iTable!=p
106a0 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d  B->iTable || pA-
106b0 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
106c0 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30  olumn ) return 0
106d0 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65  ;.  if( pA->toke
106e0 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70  n.z ){.    if( p
106f0 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20  B->token.z==0 ) 
10700 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
10710 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70  ( pB->token.n!=p
10720 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74  A->token.n ) ret
10730 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73  urn 0;.    if( s
10740 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
10750 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e  char*)pA->token.
10760 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b  z,(char*)pB->tok
10770 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e  en.z,pB->token.n
10780 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
10790 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
107a0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
107b0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
107c0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
107d0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
107e0 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
107f0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
10800 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
10810 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
10820 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
10830 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
10840 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
10850 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 41 67 67 49  gInfoColumn(AggI
10860 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
10870 6e 74 20 69 3b 0a 20 20 69 20 3d 20 73 71 6c 69  nt i;.  i = sqli
10880 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
10890 28 28 76 6f 69 64 2a 2a 29 26 70 49 6e 66 6f 2d  ((void**)&pInfo-
108a0 3e 61 43 6f 6c 2c 20 73 69 7a 65 6f 66 28 70 49  >aCol, sizeof(pI
108b0 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 20 33  nfo->aCol[0]), 3
108c0 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
108d0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
108e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
108f0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
10900 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
10910 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
10920 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
10930 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
10940 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
10950 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
10960 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
10970 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
10980 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10990 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 41  addAggInfoFunc(A
109a0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
109b0 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 73    int i;.  i = s
109c0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
109d0 61 74 65 28 28 76 6f 69 64 2a 2a 29 26 70 49 6e  ate((void**)&pIn
109e0 66 6f 2d 3e 61 46 75 6e 63 2c 20 73 69 7a 65 6f  fo->aFunc, sizeo
109f0 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
10a00 5d 29 2c 20 32 29 3b 0a 20 20 69 66 28 20 69 3c  ]), 2);.  if( i<
10a10 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
10a20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
10a30 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
10a40 20 54 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e   This is an xFun
10a50 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
10a60 65 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70  ee() used to imp
10a70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74  lement .** sqlit
10a80 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
10a90 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
10aa0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
10ab0 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
10ac0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
10ad0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
10ae0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
10af0 6e 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72  nalyzes the aggr
10b00 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61  egate function a
10b10 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74  t pExpr..*/.stat
10b20 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
10b30 67 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41  gregate(void *pA
10b40 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  rg, Expr *pExpr)
10b50 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
10b60 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
10b70 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29 70  (NameContext *)p
10b80 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Arg;.  Parse *pP
10b90 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
10ba0 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
10bb0 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
10bc0 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
10bd0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
10be0 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  NC->pAggInfo;.  
10bf0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
10c00 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
10c10 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
10c20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
10c30 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
10c40 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
10c50 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
10c60 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
10c70 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
10c80 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
10c90 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 4c  .      if( pSrcL
10ca0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
10cb0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
10cc0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
10cd0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
10ce0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
10cf0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
10d00 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
10d10 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
10d20 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
10d30 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
10d40 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
10d50 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
10d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
10d70 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
10d80 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
10d90 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
10da0 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
10db0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
10dc0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
10dd0 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
10de0 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
10df0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
10e00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
10e10 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
10e20 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
10e30 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
10e40 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
10e50 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
10e60 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
10e70 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
10e80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
10e90 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d  pCol = pAggInfo-
10ea0 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  >aCol;.         
10eb0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
10ec0 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
10ed0 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
10ef0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70   pCol->iTable==p
10f00 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d    pCol->iColumn=
10f30 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
10f40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
10f50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10f60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10f80 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
10f90 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20  nfo->nColumn && 
10fa0 28 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (i = addAggInfoC
10fb0 6f 6c 75 6d 6e 28 70 41 67 67 49 6e 66 6f 29 29  olumn(pAggInfo))
10fc0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
10fd0 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
10fe0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a  gInfo->aCol[i];.
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
11000 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ol->iTable = pEx
11010 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
11020 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
11030 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
11040 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
11050 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d          pCol->iM
11060 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
11070 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m++;.           
11080 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
11090 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
110a0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
110b0 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
110d0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  ( pAggInfo->pGro
110e0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
110f0 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e          int j, n
11100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11110 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20    ExprList *pGB 
11120 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  = pAggInfo->pGro
11130 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20  upBy;.          
11140 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
11150 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
11160 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20  m = pGB->a;.    
11170 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
11180 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pGB->nExpr;.    
11190 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
111a0 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70  j=0; j<n; j++, p
111b0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
111c0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
111d0 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pE = pTerm->pEx
111e0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
111f0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
11200 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
11210 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  E->iTable==pExpr
11220 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70    pE->iColumn==p
11250 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
11260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11270 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
11280 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  erColumn = j;.  
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
112b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
112f0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
11300 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
11310 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
11320 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
11330 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69  pAggInfo->nSorti
11340 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20  ngColumn++;.    
11350 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11370 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
11380 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66  s now an entry f
11390 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67  or pExpr in pAgg
113a0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69  Info->aCol[] (ei
113b0 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
113c0 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77   ** because it w
113d0 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20  as there before 
113e0 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  or because we ju
113f0 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a  st created it)..
11400 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43              ** C
11410 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72  onvert the pExpr
11420 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f   to be a TK_AGG_
11430 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67  COLUMN referring
11440 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   to that.       
11450 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f       ** pAggInfo
11460 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a  ->aCol[] entry..
11470 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
11480 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
11490 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
114a0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  gInfo;.         
114b0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
114c0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20  K_AGG_COLUMN;.  
114d0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
114e0 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
114f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11500 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
11510 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
11520 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
11530 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
11540 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
11550 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
11560 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
11570 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
11580 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
11590 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
115a0 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  e pNC->nDepth==0
115b0 20 74 65 73 74 20 63 61 75 73 65 73 20 61 67 67   test causes agg
115c0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
115d0 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20   in subqueries. 
115e0 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67       ** to be ig
115f0 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69  nored */.      i
11600 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  f( pNC->nDepth==
11610 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
11620 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
11630 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69  pExpr is a dupli
11640 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  cate of another 
11650 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20  aggregate .     
11660 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74     ** function t
11670 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  hat is already i
11680 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73  n the pAggInfo s
11690 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20  tructure.       
116a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75   */.        stru
116b0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
116c0 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66  *pItem = pAggInf
116d0 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20  o->aFunc;.      
116e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
116f0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
11700 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
11710 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
11720 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49  e3ExprCompare(pI
11730 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70  tem->pExpr, pExp
11740 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
11750 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
11770 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41         if( i>=pA
11780 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b  ggInfo->nFunc ){
11790 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45  .          /* pE
117a0 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e  xpr is original.
117b0 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74    Make a new ent
117c0 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  ry in pAggInfo->
117d0 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20  aFunc[].        
117e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
117f0 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
11800 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  se->db);.       
11810 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66     i = addAggInf
11820 6f 46 75 6e 63 28 70 41 67 67 49 6e 66 6f 29 3b  oFunc(pAggInfo);
11830 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
11840 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
11850 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
11860 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
11870 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
11880 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
11890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
118a0 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  tem->iMem = pPar
118b0 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
118c0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
118d0 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
118e0 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
118f0 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
11900 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
11910 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
11920 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
11930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11940 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74      pExpr->pList
11950 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   ? pExpr->pList-
11960 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
11970 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
11980 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
11990 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20  s & EP_Distinct 
119a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
119b0 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
119c0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
119d0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
119e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
119f0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
11a00 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
11a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11a20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
11a30 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
11a40 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74  pExpr point to t
11a50 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
11a60 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
11a70 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a   entry.        *
11a80 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  /.        pExpr-
11a90 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
11aa0 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
11ab0 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
11ac0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
11ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11ae0 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 75 72 73 69   }..  /* Recursi
11af0 76 65 6c 79 20 77 61 6c 6b 20 73 75 62 71 75 65  vely walk subque
11b00 72 69 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ries looking for
11b10 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
11b20 20 74 68 61 74 20 6e 65 65 64 0a 20 20 2a 2a 20   that need.  ** 
11b30 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  to be changed to
11b40 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
11b50 20 42 75 74 20 69 6e 63 72 65 6d 65 6e 74 20 6e   But increment n
11b60 44 65 70 74 68 20 73 6f 20 74 68 61 74 0a 20 20  Depth so that.  
11b70 2a 2a 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  ** TK_AGG_FUNCTI
11b80 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 73 75 62 71  ON nodes in subq
11b90 75 65 72 69 65 73 20 77 69 6c 6c 20 62 65 20 75  ueries will be u
11ba0 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20  nchanged..  */. 
11bb0 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
11bc0 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  ect ){.    pNC->
11bd0 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 77 61  nDepth++;.    wa
11be0 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 45 78  lkSelectExpr(pEx
11bf0 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61 6e 61  pr->pSelect, ana
11c00 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70  lyzeAggregate, p
11c10 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  NC);.    pNC->nD
11c20 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65  epth--;.  }.  re
11c30 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
11c40 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76   Analyze the giv
11c50 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  en expression lo
11c60 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
11c70 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
11c80 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
11c90 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
11ca0 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
11cb0 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
11cc0 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64  rray..** Make ad
11cd0 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
11ce0 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
11cf0 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20  aAgg[] array as 
11d00 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
11d10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
11d20 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
11d30 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
11d40 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
11d50 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
11d60 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
11d70 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a  lveNames()..**.*
11d80 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65 20  * If errors are 
11d90 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65  seen, leave an e
11da0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
11db0 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74 75  zErrMsg and retu
11dc0 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
11dd0 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69   of errors..*/.i
11de0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
11df0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
11e00 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
11e10 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
11e20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 70 4e 43    int nErr = pNC
11e30 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  ->pParse->nErr;.
11e40 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
11e50 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67 67  Expr, analyzeAgg
11e60 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20  regate, pNC);.  
11e70 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70 50 61 72  return pNC->pPar
11e80 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72 72 3b  se->nErr - nErr;
11e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
11ea0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
11eb0 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f  eAggregates() fo
11ec0 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
11ed0 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72  on in an.** expr
11ee0 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65  ession list.  Re
11ef0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
11f00 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
11f10 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
11f20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79  found, the analy
11f30 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74  sis is cut short
11f40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11f50 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
11f60 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  st(NameContext *
11f70 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  pNC, ExprList *p
11f80 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20  List){.  struct 
11f90 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
11fa0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
11fb0 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
11fc0 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
11fd0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
11fe0 74 2d 3e 61 2c 20 69 3d 30 3b 20 6e 45 72 72 3d  t->a, i=0; nErr=
11ff0 3d 30 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  =0 && i<pList->n
12000 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
12010 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 45 72 72 20  ++){.      nErr 
12020 2b 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  += sqlite3ExprAn
12030 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
12040 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
12050 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
12060 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a     return nErr;.}.