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

Artifact eb91a54d0c2a3bebfcf91deda95508a188c2ed63:


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 38 37 20 32 30 30 37 2f 30 35 2f 30 38 20  .287 2007/05/08 
0220: 31 38 3a 30 34 3a 34 36 20 64 61 6e 69 65 6c 6b  18:04:46 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 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
0600: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
0610: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  r expression pEx
0620: 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c  pr to be the col
0630: 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
0640: 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b  ce named by pTok
0650: 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70  en.   Return a p
0660: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65  ointer to the re
0670: 76 69 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e  vised expression
0680: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  ..** The collati
0690: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d  ng sequence is m
06a0: 61 72 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63  arked as "explic
06b0: 69 74 22 20 75 73 69 6e 67 20 74 68 65 20 45 50  it" using the EP
06c0: 5f 45 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66  _ExpCollate.** f
06d0: 6c 61 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69  lag.  An explici
06e0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
06f0: 65 6e 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69  ence will overri
0700: 64 65 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63  de implicit.** c
0710: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0720: 65 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  es..*/.Expr *sql
0730: 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28  ite3ExprSetColl(
0740: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
0750: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
0760: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 43 6f 6c  n *pName){.  Col
0770: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
0780: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
0790: 74 75 72 6e 20 30 3b 0a 20 20 70 43 6f 6c 6c 20  turn 0;.  pColl 
07a0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
07b0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 28  ollSeq(pParse, (
07c0: 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20  char*)pName->z, 
07d0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 69 66 28  pName->n);.  if(
07e0: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 45   pColl ){.    pE
07f0: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f  xpr->pColl = pCo
0800: 6c 6c 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 66  ll;.    pExpr->f
0810: 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
0820: 6c 6c 61 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  llate;.  }.  ret
0830: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a  urn pExpr;.}../*
0840: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
0850: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
0860: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
0870: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
0880: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
0890: 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  is no default co
08a0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65  llation type, re
08b0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53  turn 0..*/.CollS
08c0: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
08d0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
08e0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
08f0: 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  r){.  CollSeq *p
0900: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  Coll = 0;.  if( 
0910: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 43 6f  pExpr ){.    pCo
0920: 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c  ll = pExpr->pCol
0930: 6c 3b 0a 20 20 20 20 69 66 28 20 28 70 45 78 70  l;.    if( (pExp
0940: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 7c 7c 20  r->op==TK_AS || 
0950: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41  pExpr->op==TK_CA
0960: 53 54 29 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  ST) && !pColl ){
0970: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
0980: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
0990: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
09a0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pLeft);.    }.  
09b0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43  }.  if( sqlite3C
09c0: 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72  heckCollSeq(pPar
09d0: 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20  se, pColl) ){ . 
09e0: 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     pColl = 0;.  
09f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  }.  return pColl
0a00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
0a10: 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f   is an operand o
0a20: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
0a30: 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69  perator.  aff2 i
0a40: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
0a50: 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74  finity of the ot
0a60: 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  her operand.  Th
0a70: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
0a80: 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61  ns the.** type a
0a90: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
0aa0: 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
0ab0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  the comparison o
0ac0: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72  perator..*/.char
0ad0: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
0ae0: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
0af0: 78 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b  xpr, char aff2){
0b00: 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73  .  char aff1 = s
0b10: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
0b20: 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  ty(pExpr);.  if(
0b30: 20 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b   aff1 && aff2 ){
0b40: 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64  .    /* Both sid
0b50: 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  es of the compar
0b60: 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ison are columns
0b70: 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d  . If one has num
0b80: 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69  eric.    ** affi
0b90: 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20  nity, use that. 
0ba0: 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f  Otherwise use no
0bb0: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a   affinity..    *
0bc0: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
0bd0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
0be0: 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69  ty(aff1) || sqli
0bf0: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
0c00: 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20  nity(aff2) ){.  
0c10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0c20: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
0c30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0c40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0c50: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  F_NONE;.    }.  
0c60: 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20  }else if( !aff1 
0c70: 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20  && !aff2 ){.    
0c80: 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20  /* Neither side 
0c90: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
0ca0: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n is a column.  
0cb0: 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20  Compare the.    
0cc0: 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63  ** results direc
0cd0: 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tly..    */.    
0ce0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0cf0: 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  F_NONE;.  }else{
0d00: 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65  .    /* One side
0d10: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
0d20: 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20  e other is not. 
0d30: 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  Use the columns 
0d40: 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
0d50: 20 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30   assert( aff1==0
0d60: 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20   || aff2==0 );. 
0d70: 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20     return (aff1 
0d80: 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a  + aff2);.  }.}..
0d90: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
0da0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0db0: 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ator.  Return th
0dc0: 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  e type affinity 
0dd0: 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
0de0: 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74  e applied to bot
0df0: 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72  h operands prior
0e00: 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f   to doing the co
0e10: 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61  mparison..*/.sta
0e20: 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69  tic char compari
0e30: 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72  sonAffinity(Expr
0e40: 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72   *pExpr){.  char
0e50: 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20   aff;.  assert( 
0e60: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
0e70: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0e80: 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IN || pExpr->o
0e90: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20  p==TK_LT ||.    
0ea0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
0eb0: 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d  =TK_GT || pExpr-
0ec0: 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45  >op==TK_GE || pE
0ed0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  xpr->op==TK_LE |
0ee0: 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  |.          pExp
0ef0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  r->op==TK_NE );.
0f00: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0f10: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20  >pLeft );.  aff 
0f20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
0f30: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
0f40: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
0f50: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
0f60: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
0f70: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
0f80: 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29  pr->pRight, aff)
0f90: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
0fa0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
0fb0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
0fc0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
0fd0: 69 74 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65  ity(pExpr->pSele
0fe0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ct->pEList->a[0]
0ff0: 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20  .pExpr, aff);.  
1000: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 21 61 66  }.  else if( !af
1010: 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  f ){.    aff = S
1020: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1030: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
1040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
1050: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
1060: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e   expression, eg.
1070: 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e   '=', '<', IN(..
1080: 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61  .) etc..** idx_a
1090: 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61  ffinity is the a
10a0: 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e  ffinity of an in
10b0: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65  dexed column. Re
10c0: 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
10d0: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61  the index with a
10e0: 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69  ffinity idx_affi
10f0: 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64  nity may be used
1100: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
1110: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1120: 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74  in pExpr..*/.int
1130: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
1140: 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45  inityOk(Expr *pE
1150: 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66  xpr, char idx_af
1160: 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20  finity){.  char 
1170: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
1180: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
1190: 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29  .  switch( aff )
11a0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
11b0: 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20  E_AFF_NONE:.    
11c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
11d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
11e0: 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75  TEXT:.      retu
11f0: 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
1200: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
1210: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
1220: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1230: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1240: 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74  nity(idx_affinit
1250: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  y);.  }.}../*.**
1260: 20 52 65 74 75 72 6e 20 74 68 65 20 50 31 20 76   Return the P1 v
1270: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
1280: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
1290: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
12a0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
12b0: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
12c0: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
12d0: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
12e0: 2e 0a 2a 2a 20 49 66 20 6a 75 6d 70 49 66 4e 75  ..** If jumpIfNu
12f0: 6c 6c 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ll is true, then
1300: 20 73 65 74 20 74 68 65 20 6c 6f 77 20 62 79 74   set the low byt
1310: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
1320: 64 0a 2a 2a 20 50 31 20 76 61 6c 75 65 20 74 6f  d.** P1 value to
1330: 20 74 65 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65   tell the opcode
1340: 20 74 6f 20 6a 75 6d 70 20 69 66 20 65 69 74 68   to jump if eith
1350: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  er expression.**
1360: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
1370: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LL..*/.static in
1380: 74 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  t binaryCompareP
1390: 31 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20  1(Expr *pExpr1, 
13a0: 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e  Expr *pExpr2, in
13b0: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
13c0: 20 63 68 61 72 20 61 66 66 20 3d 20 73 71 6c 69   char aff = sqli
13d0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
13e0: 70 45 78 70 72 32 29 3b 0a 20 20 72 65 74 75 72  pExpr2);.  retur
13f0: 6e 20 28 28 69 6e 74 29 73 71 6c 69 74 65 33 43  n ((int)sqlite3C
1400: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
1410: 45 78 70 72 31 2c 20 61 66 66 29 29 2b 28 6a 75  Expr1, aff))+(ju
1420: 6d 70 49 66 4e 75 6c 6c 3f 30 78 31 30 30 3a 30  mpIfNull?0x100:0
1430: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1440: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1450: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1460: 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75  quence that shou
1470: 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a  ld be used by.**
1480: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1490: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f  ison operator co
14a0: 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e  mparing pLeft an
14b0: 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  d pRight..**.** 
14c0: 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  If the left hand
14d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
14e0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
14f0: 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20  ence type, then 
1500: 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f  it is.** used. O
1510: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c  therwise the col
1520: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1530: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61  for the right ha
1540: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  nd expression.**
1550: 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65   is used, or the
1560: 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59   default (BINARY
1570: 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70  ) if neither exp
1580: 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f  ression has a co
1590: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e  llating.** type.
15a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
15b0: 65 71 2a 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  eq* binaryCompar
15c0: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
15d0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 4c  pParse, Expr *pL
15e0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
15f0: 74 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  t){.  CollSeq *p
1600: 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Coll;.  assert( 
1610: 70 4c 65 66 74 20 29 3b 0a 20 20 61 73 73 65 72  pLeft );.  asser
1620: 74 28 20 70 52 69 67 68 74 20 29 3b 0a 20 20 69  t( pRight );.  i
1630: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
1640: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
1650: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1660: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Left->pColl );. 
1670: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74     pColl = pLeft
1680: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65  ->pColl;.  }else
1690: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 6c 61   if( pRight->fla
16a0: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
16b0: 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  te ){.    assert
16c0: 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 20  ( pRight->pColl 
16d0: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70  );.    pColl = p
16e0: 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  Right->pColl;.  
16f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c  }else{.    pColl
1700: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1710: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
1720: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70  eft);.    if( !p
1730: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
1740: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1750: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
1760: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a   pRight);.    }.
1770: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
1780: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ll;.}../*.** Gen
1790: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
17a0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
17b0: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
17c0: 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  int codeCompare(
17d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17e0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  ,    /* The pars
17f0: 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65  ing (and code ge
1800: 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78  nerating) contex
1810: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  t */.  Expr *pLe
1820: 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ft,      /* The 
1830: 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  left operand */.
1840: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
1850: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1860: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1870: 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20  t opcode,       
1880: 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  /* The compariso
1890: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  n opcode */.  in
18a0: 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
18b0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
18c0: 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  true.  */.  int 
18d0: 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
18e0: 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69   If true, jump i
18f0: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
1900: 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
1910: 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61 72 79   int p1 = binary
1920: 43 6f 6d 70 61 72 65 50 31 28 70 4c 65 66 74 2c  CompareP1(pLeft,
1930: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
1940: 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  ull);.  CollSeq 
1950: 2a 70 33 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70  *p3 = binaryComp
1960: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
1970: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
1980: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1990: 74 65 33 56 64 62 65 4f 70 33 28 70 50 61 72 73  te3VdbeOp3(pPars
19a0: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
19b0: 2c 20 70 31 2c 20 64 65 73 74 2c 20 28 76 6f 69  , p1, dest, (voi
19c0: 64 2a 29 70 33 2c 20 50 33 5f 43 4f 4c 4c 53 45  d*)p3, P3_COLLSE
19d0: 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  Q);.}../*.** Con
19e0: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
19f0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
1a00: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
1a10: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
1a20: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
1a30: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
1a40: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
1a50: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
1a60: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
1a70: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
1a80: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
1a90: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
1aa0: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78  ets freed..*/.Ex
1ab0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
1ac0: 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c  int op, Expr *pL
1ad0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
1ae0: 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  t, const Token *
1af0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
1b00: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
1b10: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
1b20: 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20  zeof(Expr) );.  
1b30: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1b40: 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f     /* When mallo
1b50: 63 20 66 61 69 6c 73 2c 20 64 65 6c 65 74 65 20  c fails, delete 
1b60: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1b70: 2e 20 45 78 70 72 65 73 73 69 6f 6e 73 20 70 61  . Expressions pa
1b80: 73 73 65 64 20 74 6f 20 0a 20 20 20 20 2a 2a 20  ssed to .    ** 
1b90: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
1ba0: 73 74 20 61 6c 77 61 79 73 20 62 65 20 61 6c 6c  st always be all
1bb0: 6f 63 61 74 65 64 20 77 69 74 68 20 73 71 6c 69  ocated with sqli
1bc0: 74 65 33 45 78 70 72 28 29 20 66 6f 72 20 74 68  te3Expr() for th
1bd0: 69 73 20 0a 20 20 20 20 2a 2a 20 72 65 61 73 6f  is .    ** reaso
1be0: 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  n. .    */.    s
1bf0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1c00: 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c  (pLeft);.    sql
1c10: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
1c20: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
1c30: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  rn 0;.  }.  pNew
1c40: 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 4e 65  ->op = op;.  pNe
1c50: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  w->pLeft = pLeft
1c60: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
1c70: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 70 4e 65   = pRight;.  pNe
1c80: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
1c90: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
1ca0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
1cb0: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ->dyn==0 );.    
1cc0: 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65  pNew->span = pNe
1cd0: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
1ce0: 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  en;.  }else if( 
1cf0: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 69 66 28  pLeft ){.    if(
1d00: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
1d10: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
1d20: 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73  (pNew, &pLeft->s
1d30: 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70  pan, &pRight->sp
1d40: 61 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  an);.      if( p
1d50: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
1d60: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
1d70: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
1d80: 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c  ags |= EP_ExpCol
1d90: 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  late;.        pN
1da0: 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52 69 67  ew->pColl = pRig
1db0: 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ht->pColl;.     
1dc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1dd0: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
1de0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
1df0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
1e00: 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c  gs |= EP_ExpColl
1e10: 61 74 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ate;.      pNew-
1e20: 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e  >pColl = pLeft->
1e30: 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  pColl;.    }.  }
1e40: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
1e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20 6c  }../*.** Works l
1e60: 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 28  ike sqlite3Expr(
1e70: 29 20 62 75 74 20 66 72 65 65 73 20 69 74 73 20  ) but frees its 
1e80: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1e90: 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 69 66   arguments.** if
1ea0: 20 69 74 20 66 61 69 6c 73 20 64 75 65 20 74 6f   it fails due to
1eb0: 20 61 20 6d 61 6c 6c 6f 63 20 70 72 6f 62 6c 65   a malloc proble
1ec0: 6d 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  m..*/.Expr *sqli
1ed0: 74 65 33 45 78 70 72 4f 72 46 72 65 65 28 69 6e  te3ExprOrFree(in
1ee0: 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66  t op, Expr *pLef
1ef0: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  t, Expr *pRight,
1f00: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
1f10: 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70  oken){.  Expr *p
1f20: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1f30: 72 28 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  r(op, pLeft, pRi
1f40: 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  ght, pToken);.  
1f50: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1f60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1f70: 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20  lete(pLeft);.   
1f80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1f90: 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  te(pRight);.  }.
1fa0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
1fb0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69  ../*.** When doi
1fc0: 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73  ng a nested pars
1fd0: 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75  e, you can inclu
1fe0: 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65  de terms in an e
1ff0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61  xpression.** tha
2000: 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73  t look like this
2010: 3a 20 20 20 23 30 20 23 31 20 23 32 20 2e 2e 2e  :   #0 #1 #2 ...
2020: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 72 65    These terms re
2030: 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73 0a  fer to elements.
2040: 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ** on the stack.
2050: 20 20 22 23 30 22 20 6d 65 61 6e 73 20 74 68 65    "#0" means the
2060: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
2070: 6b 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61 6e 73  k..** "#1" means
2080: 20 74 68 65 20 6e 65 78 74 20 64 6f 77 6e 20 6f   the next down o
2090: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 41 6e  n the stack.  An
20a0: 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a  d so forth..**.*
20b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
20c0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
20d0: 70 61 72 73 65 72 20 74 6f 20 64 65 61 6c 20 77  parser to deal w
20e0: 69 74 68 20 6f 6e 20 6f 66 20 74 68 6f 73 65 20  ith on of those 
20f0: 74 65 72 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d  terms..** It imm
2100: 65 64 69 61 74 65 6c 79 20 67 65 6e 65 72 61 74  ediately generat
2110: 65 73 20 63 6f 64 65 20 74 6f 20 73 74 6f 72 65  es code to store
2120: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 61 20   the value in a 
2130: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e  memory location.
2140: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 73 20  .** The returns 
2150: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
2160: 61 74 20 77 69 6c 6c 20 63 6f 64 65 20 74 6f 20  at will code to 
2170: 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  extract the valu
2180: 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d  e from.** that m
2190: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 61  emory location a
21a0: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45 78 70  s needed..*/.Exp
21b0: 72 20 2a 73 71 6c 69 74 65 33 52 65 67 69 73 74  r *sqlite3Regist
21c0: 65 72 45 78 70 72 28 50 61 72 73 65 20 2a 70 50  erExpr(Parse *pP
21d0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
21e0: 6b 65 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ken){.  Vdbe *v 
21f0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2200: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 6e  .  Expr *p;.  in
2210: 74 20 64 65 70 74 68 3b 0a 20 20 69 66 28 20 70  t depth;.  if( p
2220: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
2230: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2240: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2250: 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73 79  "near \"%T\": sy
2260: 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 70 54 6f  ntax error", pTo
2270: 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ken);.    return
2280: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d   0;.  }.  if( v=
2290: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
22a0: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
22b0: 28 54 4b 5f 52 45 47 49 53 54 45 52 2c 20 30 2c  (TK_REGISTER, 0,
22c0: 20 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69   0, pToken);.  i
22d0: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( p==0 ){.    r
22e0: 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c  eturn 0;  /* Mal
22f0: 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
2300: 7d 0a 20 20 64 65 70 74 68 20 3d 20 61 74 6f 69  }.  depth = atoi
2310: 28 28 63 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d  ((char*)&pToken-
2320: 3e 7a 5b 31 5d 29 3b 0a 20 20 70 2d 3e 69 54 61  >z[1]);.  p->iTa
2330: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ble = pParse->nM
2340: 65 6d 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56  em++;.  sqlite3V
2350: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
2360: 75 70 2c 20 64 65 70 74 68 2c 20 30 29 3b 0a 20  up, depth, 0);. 
2370: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2380: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
2390: 2c 20 70 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b  , p->iTable, 1);
23a0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
23b0: 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65  /*.** Join two e
23c0: 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67  xpressions using
23d0: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
23e0: 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78 70  .  If either exp
23f0: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55  ression is.** NU
2400: 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  LL, then just re
2410: 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65  turn the other e
2420: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
2430: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41  pr *sqlite3ExprA
2440: 6e 64 28 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  nd(Expr *pLeft, 
2450: 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  Expr *pRight){. 
2460: 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b   if( pLeft==0 ){
2470: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67  .    return pRig
2480: 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ht;.  }else if( 
2490: 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20  pRight==0 ){.   
24a0: 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20   return pLeft;. 
24b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
24c0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 54  rn sqlite3Expr(T
24d0: 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52  K_AND, pLeft, pR
24e0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  ight, 0);.  }.}.
24f0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
2500: 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f  xpr.span field o
2510: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
2520: 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61  ession to span a
2530: 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74 77 65  ll.** text betwe
2540: 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e  en the two given
2550: 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64   tokens..*/.void
2560: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
2570: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f  (Expr *pExpr, To
2580: 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65  ken *pLeft, Toke
2590: 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 61 73  n *pRight){.  as
25a0: 73 65 72 74 28 20 70 52 69 67 68 74 21 3d 30 20  sert( pRight!=0 
25b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  );.  assert( pLe
25c0: 66 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ft!=0 );.  if( !
25d0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
25e0: 6c 65 64 28 29 20 26 26 20 70 52 69 67 68 74 2d  led() && pRight-
25f0: 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20 29  >z && pLeft->z )
2600: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
2610: 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c 20 70  eft->dyn==0 || p
2620: 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d 3e 6e  Left->z[pLeft->n
2630: 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ]==0 );.    if( 
2640: 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26 26  pLeft->dyn==0 &&
2650: 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30 20   pRight->dyn==0 
2660: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
2670: 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e  span.z = pLeft->
2680: 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  z;.      pExpr->
2690: 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d  span.n = pRight-
26a0: 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e 7a 20  >n + (pRight->z 
26b0: 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 20  - pLeft->z);.   
26c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45   }else{.      pE
26d0: 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b  xpr->span.z = 0;
26e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
26f0: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
2700: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
2710: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
2720: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
2730: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
2740: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
2750: 78 70 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  xprFunction(Expr
2760: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
2770: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
2780: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73  xpr *pNew;.  ass
2790: 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20  ert( pToken );. 
27a0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
27b0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
27c0: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
27d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
27e0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
27f0: 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69  (pList); /* Avoi
2800: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
2810: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
2820: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
2830: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
2840: 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  op = TK_FUNCTION
2850: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20  ;.  pNew->pList 
2860: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
2870: 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d  t( pToken->dyn==
2880: 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 74 6f 6b  0 );.  pNew->tok
2890: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
28a0: 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65  pNew->span = pNe
28b0: 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72 65 74 75  w->token;.  retu
28c0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
28d0: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
28e0: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
28f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
2900: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
2910: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
2920: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
2930: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
2940: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
2950: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
2960: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
2970: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
2980: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
2990: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
29a0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
29b0: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
29c0: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
29d0: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
29e0: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
29f0: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74   is not too be t
2a00: 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c  o avoid a denial
2a10: 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61   of service atta
2a20: 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53  ck when.** the S
2a30: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d  QL statement com
2a40: 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72  es from an exter
2a50: 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a  nal source..**.*
2a60: 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74  * Wildcards of t
2a70: 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f  he form ":aaa" o
2a80: 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73  r "$aaa" are ass
2a90: 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e  igned the same n
2aa0: 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20  umber.** as the 
2ab0: 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63  previous instanc
2ac0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69  e of the same wi
2ad0: 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74  ldcard.  Or if t
2ae0: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
2af0: 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  .** instance of 
2b00: 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68  the wildcard, th
2b10: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61 6c  e next sequenial
2b20: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2b30: 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e   is.** assigned.
2b40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2b50: 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d  ExprAssignVarNum
2b60: 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ber(Parse *pPars
2b70: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
2b80: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  .  Token *pToken
2b90: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
2ba0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f   ) return;.  pTo
2bb0: 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f  ken = &pExpr->to
2bc0: 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ken;.  assert( p
2bd0: 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20  Token->n>=1 );. 
2be0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
2bf0: 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  >z!=0 );.  asser
2c00: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21  t( pToken->z[0]!
2c10: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  =0 );.  if( pTok
2c20: 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  en->n==1 ){.    
2c30: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
2c40: 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73  he form "?".  As
2c50: 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61  sign the next va
2c60: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
2c70: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
2c80: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
2c90: 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Var;.  }else if(
2ca0: 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27   pToken->z[0]=='
2cb0: 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  ?' ){.    /* Wil
2cc0: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
2cd0: 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65  m "?nnn".  Conve
2ce0: 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69  rt "nnn" to an i
2cf0: 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a  nteger and.    *
2d00: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
2d10: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
2d20: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  */.    int i;.  
2d30: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
2d40: 3d 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72  = i = atoi((char
2d50: 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29  *)&pToken->z[1])
2d60: 3b 0a 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c  ;.    if( i<1 ||
2d70: 20 69 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41   i>SQLITE_MAX_VA
2d80: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b  RIABLE_NUMBER ){
2d90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2da0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2db0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
2dc0: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
2dd0: 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20  ?1 and ?%d",.   
2de0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41         SQLITE_MA
2df0: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
2e00: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  R);.    }.    if
2e10: 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( i>pParse->nVar
2e20: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
2e30: 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20  ->nVar = i;.    
2e40: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
2e50: 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74  * Wildcards of t
2e60: 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f  he form ":aaa" o
2e70: 72 20 22 24 61 61 61 22 2e 20 20 52 65 75 73 65  r "$aaa".  Reuse
2e80: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
2e90: 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  le.    ** number
2ea0: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
2eb0: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
2ec0: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
2ed0: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a   the name.    **
2ee0: 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61   has never appea
2ef0: 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73  red before, reus
2f00: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
2f10: 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a  ble number.    *
2f20: 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  /.    int i, n;.
2f30: 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e      n = pToken->
2f40: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
2f50: 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  i<pParse->nVarEx
2f60: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
2f70: 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
2f80: 69 66 28 20 28 70 45 20 3d 20 70 50 61 72 73 65  if( (pE = pParse
2f90: 2d 3e 61 70 56 61 72 45 78 70 72 5b 69 5d 29 21  ->apVarExpr[i])!
2fa0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
2fb0: 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20  pE->token.n==n. 
2fc0: 20 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63           && memc
2fd0: 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  mp(pE->token.z, 
2fe0: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30  pToken->z, n)==0
2ff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
3000: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e  r->iTable = pE->
3010: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
3020: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3030: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
3040: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
3050: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
3060: 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72  >iTable = ++pPar
3070: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20  se->nVar;.      
3080: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  if( pParse->nVar
3090: 45 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56  Expr>=pParse->nV
30a0: 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b  arExprAlloc-1 ){
30b0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
30c0: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b  >nVarExprAlloc +
30d0: 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  = pParse->nVarEx
30e0: 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20  prAlloc + 10;.  
30f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70        pParse->ap
3100: 56 61 72 45 78 70 72 20 3d 20 73 71 6c 69 74 65  VarExpr = sqlite
3110: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50  ReallocOrFree(pP
3120: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c  arse->apVarExpr,
3130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3140: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
3150: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69  nVarExprAlloc*si
3160: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 70 56  zeof(pParse->apV
3170: 61 72 45 78 70 72 5b 30 5d 29 20 29 3b 0a 20 20  arExpr[0]) );.  
3180: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
3190: 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61  !sqlite3MallocFa
31a0: 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 20 20  iled() ){.      
31b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
31c0: 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20 29  ->apVarExpr!=0 )
31d0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
31e0: 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61 72  ->apVarExpr[pPar
31f0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20  se->nVarExpr++] 
3200: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  = pExpr;.      }
3210: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f  .    }.  } .}../
3220: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
3230: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
3240: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76  ssion tree..*/.v
3250: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44  oid sqlite3ExprD
3260: 65 6c 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a  elete(Expr *p){.
3270: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3280: 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70  urn;.  if( p->sp
3290: 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46  an.dyn ) sqliteF
32a0: 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70  ree((char*)p->sp
32b0: 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e  an.z);.  if( p->
32c0: 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69  token.dyn ) sqli
32d0: 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d  teFree((char*)p-
32e0: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c  >token.z);.  sql
32f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
3300: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69  ->pLeft);.  sqli
3310: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
3320: 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69  >pRight);.  sqli
3330: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
3340: 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73  e(p->pList);.  s
3350: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
3360: 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  te(p->pSelect);.
3370: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
3380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78  .}../*.** The Ex
3390: 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d  pr.token field m
33a0: 69 67 68 74 20 62 65 20 61 20 73 74 72 69 6e 67  ight be a string
33b0: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73   literal that is
33c0: 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73   quoted..** If s
33d0: 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71 75  o, remove the qu
33e0: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a  otation marks..*
33f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
3400: 71 75 6f 74 65 45 78 70 72 28 45 78 70 72 20 2a  quoteExpr(Expr *
3410: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
3420: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20  sAnyProperty(p, 
3430: 45 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a  EP_Dequoted) ){.
3440: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
3450: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
3460: 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64  y(p, EP_Dequoted
3470: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
3480: 6e 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  n.dyn==0 ){.    
3490: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
34a0: 28 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e  (&p->token, &p->
34b0: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71  token);.  }.  sq
34c0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28 63 68  lite3Dequote((ch
34d0: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  ar*)p->token.z);
34e0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
34f0: 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f  ollowing group o
3500: 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20  f routines make 
3510: 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65  deep copies of e
3520: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65  xpressions,.** e
3530: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c  xpression lists,
3540: 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73   ID lists, and s
3550: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
3560: 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61  .  The copies ca
3570: 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20  n.** be deleted 
3580: 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64  (by being passed
3590: 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63   to their respec
35a0: 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29  tive ...Delete()
35b0: 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69   routines).** wi
35c0: 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20  thout effecting 
35d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a  the originals..*
35e0: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
35f0: 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e  ion list, ID, an
3600: 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72  d source lists r
3610: 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33  eturn by sqlite3
3620: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a  ExprListDup(),.*
3630: 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  * sqlite3IdListD
3640: 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65  up(), and sqlite
3650: 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61  3SrcListDup() ca
3660: 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72  n not be further
3670: 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79   expanded .** by
3680: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
3690: 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74  s to sqlite*List
36a0: 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  Append() routine
36b0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62  s..**.** Any tab
36c0: 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63  les that the Src
36d0: 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74  List might point
36e0: 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c   to are not dupl
36f0: 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  icated..*/.Expr 
3700: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
3710: 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72  Expr *p){.  Expr
3720: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
3730: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3740: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
3750: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
3760: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
3770: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
3780: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20  .  memcpy(pNew, 
3790: 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  p, sizeof(*pNew)
37a0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
37b0: 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e  n.z!=0 ){.    pN
37c0: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75  ew->token.z = (u
37d0: 38 2a 29 73 71 6c 69 74 65 53 74 72 4e 44 75 70  8*)sqliteStrNDup
37e0: 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e  ((char*)p->token
37f0: 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  .z, p->token.n);
3800: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
3810: 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  .dyn = 1;.  }els
3820: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
3830: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20  New->token.z==0 
3840: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73  );.  }.  pNew->s
3850: 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65  pan.z = 0;.  pNe
3860: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
3870: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 65  e3ExprDup(p->pLe
3880: 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  ft);.  pNew->pRi
3890: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
38a0: 72 44 75 70 28 70 2d 3e 70 52 69 67 68 74 29 3b  rDup(p->pRight);
38b0: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d  .  pNew->pList =
38c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
38d0: 44 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20  Dup(p->pList);. 
38e0: 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d   pNew->pSelect =
38f0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
3900: 70 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  p(p->pSelect);. 
3910: 20 70 4e 65 77 2d 3e 70 54 61 62 20 3d 20 70 2d   pNew->pTab = p-
3920: 3e 70 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20  >pTab;.  return 
3930: 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  pNew;.}.void sql
3940: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 54 6f  ite3TokenCopy(To
3950: 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20  ken *pTo, Token 
3960: 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
3970: 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74 65  To->dyn ) sqlite
3980: 46 72 65 65 28 28 63 68 61 72 2a 29 70 54 6f 2d  Free((char*)pTo-
3990: 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  >z);.  if( pFrom
39a0: 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e  ->z ){.    pTo->
39b0: 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20  n = pFrom->n;.  
39c0: 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29    pTo->z = (u8*)
39d0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63  sqliteStrNDup((c
39e0: 68 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70  har*)pFrom->z, p
39f0: 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54  From->n);.    pT
3a00: 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65  o->dyn = 1;.  }e
3a10: 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20  lse{.    pTo->z 
3a20: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c  = 0;.  }.}.ExprL
3a30: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
3a40: 4c 69 73 74 44 75 70 28 45 78 70 72 4c 69 73 74  ListDup(ExprList
3a50: 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74   *p){.  ExprList
3a60: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
3a70: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
3a80: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
3a90: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
3aa0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
3ab0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
3ac0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
3ad0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
3ae0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
3af0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70   0;.  pNew->nExp
3b00: 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  r = pNew->nAlloc
3b10: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70   = p->nExpr;.  p
3b20: 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d  New->a = pItem =
3b30: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
3b40: 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70  ->nExpr*sizeof(p
3b50: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
3b60: 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20   pItem==0 ){.   
3b70: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77   sqliteFree(pNew
3b80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
3b90: 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d  .  } .  pOldItem
3ba0: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
3bb0: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
3bc0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
3bd0: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
3be0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a  xpr *pNewExpr, *
3bf0: 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49  pOldExpr;.    pI
3c00: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65  tem->pExpr = pNe
3c10: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  wExpr = sqlite3E
3c20: 78 70 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20  xprDup(pOldExpr 
3c30: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70  = pOldItem->pExp
3c40: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  r);.    if( pOld
3c50: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  Expr->span.z!=0 
3c60: 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20  && pNewExpr ){. 
3c70: 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d       /* Always m
3c80: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
3c90: 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c  e span for top-l
3ca0: 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73  evel expressions
3cb0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
3cc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
3cd0: 2e 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20  .  The logic in 
3ce0: 53 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e  SELECT processin
3cf0: 67 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  g that determine
3d00: 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  s.      ** the n
3d10: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  ames of columns 
3d20: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
3d30: 74 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66  t needs this inf
3d40: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
3d50: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
3d60: 70 79 28 26 70 4e 65 77 45 78 70 72 2d 3e 73 70  py(&pNewExpr->sp
3d70: 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73  an, &pOldExpr->s
3d80: 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pan);.    }.    
3d90: 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72  assert( pNewExpr
3da0: 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d  ==0 || pNewExpr-
3db0: 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20  >span.z!=0 .    
3dc0: 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45          || pOldE
3dd0: 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 0a 20  xpr->span.z==0. 
3de0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
3df0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
3e00: 64 28 29 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  d() );.    pItem
3e10: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
3e20: 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  StrDup(pOldItem-
3e30: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  >zName);.    pIt
3e40: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
3e50: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
3e60: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
3e70: 69 73 41 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d  isAgg = pOldItem
3e80: 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 70 49 74  ->isAgg;.    pIt
3e90: 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20  em->done = 0;.  
3ea0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
3eb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
3ec0: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
3ed0: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
3ee0: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
3ef0: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
3f00: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
3f10: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3f20: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
3f30: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
3f40: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
3f50: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
3f60: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
3f70: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
3f80: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
3f90: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
3fa0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
3fb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
3fc0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
3fd0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
3fe0: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
3ff0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
4000: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
4010: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
4020: 70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  p(SrcList *p){. 
4030: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
4040: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
4050: 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  Byte;.  if( p==0
4060: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
4070: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
4080: 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f  ) + (p->nSrc>0 ?
4090: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
40a0: 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a   * (p->nSrc-1) :
40b0: 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71   0);.  pNew = sq
40c0: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
40d0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
40e0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
40f0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
4100: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
4110: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
4120: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
4130: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
4140: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
4150: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
4160: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
4170: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
4180: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
4190: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
41a0: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
41b0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
41c0: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64  qliteStrDup(pOld
41d0: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
41e0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
41f0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
4200: 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a  rDup(pOldItem->z
4210: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
4220: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
4230: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
4240: 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
4250: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e    pNewItem->join
4260: 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  type = pOldItem-
4270: 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70  >jointype;.    p
4280: 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  NewItem->iCursor
4290: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75   = pOldItem->iCu
42a0: 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74  rsor;.    pNewIt
42b0: 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20  em->isPopulated 
42c0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f  = pOldItem->isPo
42d0: 70 75 6c 61 74 65 64 3b 0a 20 20 20 20 70 54 61  pulated;.    pTa
42e0: 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54  b = pNewItem->pT
42f0: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ab = pOldItem->p
4300: 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
4310: 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  b ){.      pTab-
4320: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nRef++;.    }. 
4330: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65     pNewItem->pSe
4340: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
4350: 6c 65 63 74 44 75 70 28 70 4f 6c 64 49 74 65 6d  lectDup(pOldItem
4360: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
4370: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
4380: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
4390: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  OldItem->pOn);. 
43a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
43b0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
43c0: 69 73 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  istDup(pOldItem-
43d0: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
43e0: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
43f0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
4400: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
4410: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
4420: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
4430: 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  up(IdList *p){. 
4440: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
4450: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
4460: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4470: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
4480: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
4490: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
44a0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
44b0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20   0;.  pNew->nId 
44c0: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
44d0: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
44e0: 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  >a = sqliteMallo
44f0: 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73 69 7a  cRaw( p->nId*siz
4500: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
4510: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
4520: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
4530: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  ee(pNew);.    re
4540: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  turn 0;.  }.  fo
4550: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
4560: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
4570: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
4580: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
4590: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
45a0: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
45b0: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
45c0: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
45d0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
45e0: 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  StrDup(pOldItem-
45f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
4600: 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c  wItem->idx = pOl
4610: 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a  dItem->idx;.  }.
4620: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
4630: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
4640: 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74  SelectDup(Select
4650: 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a   *p){.  Select *
4660: 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pNew;.  if( p==0
4670: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
4680: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
4690: 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70  ocRaw( sizeof(*p
46a0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
46b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
46c0: 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63   pNew->isDistinc
46d0: 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
46e0: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  t;.  pNew->pELis
46f0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
4700: 69 73 74 44 75 70 28 70 2d 3e 70 45 4c 69 73 74  istDup(p->pEList
4710: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20  );.  pNew->pSrc 
4720: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
4730: 44 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20  Dup(p->pSrc);.  
4740: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73  pNew->pWhere = s
4750: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d  qlite3ExprDup(p-
4760: 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65 77  >pWhere);.  pNew
4770: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
4780: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
4790: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
47a0: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
47b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
47c0: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e  ->pHaving);.  pN
47d0: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
47e0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
47f0: 70 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  p(p->pOrderBy);.
4800: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
4810: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  op;.  pNew->pPri
4820: 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  or = sqlite3Sele
4830: 63 74 44 75 70 28 70 2d 3e 70 50 72 69 6f 72 29  ctDup(p->pPrior)
4840: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
4850: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
4860: 70 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  p(p->pLimit);.  
4870: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
4880: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
4890: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 4e  ->pOffset);.  pN
48a0: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
48b0: 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74  .  pNew->iOffset
48c0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69   = -1;.  pNew->i
48d0: 73 52 65 73 6f 6c 76 65 64 20 3d 20 70 2d 3e 69  sResolved = p->i
48e0: 73 52 65 73 6f 6c 76 65 64 3b 0a 20 20 70 4e 65  sResolved;.  pNe
48f0: 77 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e 69 73  w->isAgg = p->is
4900: 41 67 67 3b 0a 20 20 70 4e 65 77 2d 3e 75 73 65  Agg;.  pNew->use
4910: 73 45 70 68 6d 20 3d 20 30 3b 0a 20 20 70 4e 65  sEphm = 0;.  pNe
4920: 77 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72  w->disallowOrder
4930: 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  By = 0;.  pNew->
4940: 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
4950: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
4960: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
4970: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
4980: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
4990: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
49a0: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  [2] = -1;.  retu
49b0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
49c0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
49d0: 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74  SelectDup(Select
49e0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
49f0: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
4a00: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
4a10: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
4a20: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
4a30: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
4a40: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
4a50: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
4a60: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
4a70: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
4a80: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45  ssion list..*/.E
4a90: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
4aa0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45  ExprListAppend(E
4ab0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
4ac0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
4ad0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 66  en *pName){.  if
4ae0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
4af0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
4b00: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
4b10: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
4b20: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
4b30: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
4b40: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  m;.    }.    ass
4b50: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ert( pList->nAll
4b60: 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69  oc==0 );.  }.  i
4b70: 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  f( pList->nAlloc
4b80: 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <=pList->nExpr )
4b90: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
4ba0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
4bb0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74     int n = pList
4bc0: 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a  ->nAlloc*2 + 4;.
4bd0: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65      a = sqliteRe
4be0: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
4bf0: 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  n*sizeof(pList->
4c00: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
4c10: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  a==0 ){.      go
4c20: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
4c30: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
4c40: 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  a;.    pList->nA
4c50: 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20  lloc = n;.  }.  
4c60: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
4c70: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78  !=0 );.  if( pEx
4c80: 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20  pr || pName ){. 
4c90: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
4ca0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
4cb0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
4cc0: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20  ->nExpr++];.    
4cd0: 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c  memset(pItem, 0,
4ce0: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29   sizeof(*pItem))
4cf0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
4d00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
4d10: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
4d20: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
4d30: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a  pr = pExpr;.  }.
4d40: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
4d50: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
4d60: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
4d70: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
4d80: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
4d90: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
4da0: 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73  lete(pExpr);.  s
4db0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4dc0: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
4dd0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4de0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
4df0: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
4e00: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
4e10: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
4e20: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
4e30: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
4e40: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
4e50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4e60: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
4e70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
4e80: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
4e90: 2c 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 2c 0a  ,.  int iLimit,.
4ea0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
4eb0: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 66 28 20 70  bject.){.  if( p
4ec0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
4ed0: 3e 6e 45 78 70 72 3e 69 4c 69 6d 69 74 20 29 7b  >nExpr>iLimit ){
4ee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4ef0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
4f00: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
4f10: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
4f20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
4f30: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65  lete an entire e
4f40: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
4f50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
4f60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78  xprListDelete(Ex
4f70: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
4f80: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
4f90: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
4fa0: 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
4fb0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
4fc0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
4fd0: 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74  ->a!=0 || (pList
4fe0: 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c  ->nExpr==0 && pL
4ff0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20  ist->nAlloc==0) 
5000: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  );.  assert( pLi
5010: 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74  st->nExpr<=pList
5020: 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f  ->nAlloc );.  fo
5030: 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
5040: 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
5050: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
5060: 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
5070: 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74 65  3ExprDelete(pIte
5080: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  m->pExpr);.    s
5090: 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d  qliteFree(pItem-
50a0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  >zName);.  }.  s
50b0: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
50c0: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  >a);.  sqliteFre
50d0: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
50e0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
50f0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c  ssion tree.  Cal
5100: 6c 20 78 46 75 6e 63 20 66 6f 72 20 65 61 63 68  l xFunc for each
5110: 20 6e 6f 64 65 20 76 69 73 69 74 65 64 2e 0a 2a   node visited..*
5120: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
5130: 76 61 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e 63  value from xFunc
5140: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
5150: 68 65 72 20 74 68 65 20 74 72 65 65 20 77 61 6c  her the tree wal
5160: 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20  k continues..** 
5170: 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65  0 means continue
5180: 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 74 72 65   walking the tre
5190: 65 2e 20 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e  e.  1 means do n
51a0: 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e  ot walk children
51b0: 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65  .** of the curre
51c0: 6e 74 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74  nt node but cont
51d0: 69 6e 75 65 20 77 69 74 68 20 73 69 62 6c 69 6e  inue with siblin
51e0: 67 73 2e 20 20 32 20 6d 65 61 6e 73 20 61 62 61  gs.  2 means aba
51f0: 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65  ndon.** the tree
5200: 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79   walk completely
5210: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
5220: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  rn value from th
5230: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 31 20  is routine is 1 
5240: 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74  to abandon the t
5250: 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20  ree walk.** and 
5260: 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a  0 to continue..*
5270: 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20 20 54 68  *.** NOTICE:  Th
5280: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
5290: 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64 20 69 6e  *not* descend in
52a0: 74 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  to subqueries..*
52b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
52c0: 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  kExprList(ExprLi
52d0: 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76 6f  st *, int (*)(vo
52e0: 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f  id *, Expr*), vo
52f0: 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  id *);.static in
5300: 74 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 45  t walkExprTree(E
5310: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
5320: 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45  (*xFunc)(void*,E
5330: 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  xpr*), void *pAr
5340: 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  g){.  int rc;.  
5350: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
5360: 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20  eturn 0;.  rc = 
5370: 28 2a 78 46 75 6e 63 29 28 70 41 72 67 2c 20 70  (*xFunc)(pArg, p
5380: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  Expr);.  if( rc=
5390: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 61  =0 ){.    if( wa
53a0: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
53b0: 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c 20  ->pLeft, xFunc, 
53c0: 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31  pArg) ) return 1
53d0: 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  ;.    if( walkEx
53e0: 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 52  prTree(pExpr->pR
53f0: 69 67 68 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  ight, xFunc, pAr
5400: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
5410: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 4c     if( walkExprL
5420: 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ist(pExpr->pList
5430: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
5440: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
5450: 20 72 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a   return rc>1;.}.
5460: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b  ./*.** Call walk
5470: 45 78 70 72 54 72 65 65 28 29 20 66 6f 72 20 65  ExprTree() for e
5480: 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
5490: 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73 74  in list p..*/.st
54a0: 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70  atic int walkExp
54b0: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
54c0: 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  p, int (*xFunc)(
54d0: 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20  void *, Expr*), 
54e0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
54f0: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45  nt i;.  struct E
5500: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
5510: 74 65 6d 3b 0a 20 20 69 66 28 20 21 70 20 29 20  tem;.  if( !p ) 
5520: 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
5530: 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  i=p->nExpr, pIte
5540: 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  m=p->a; i>0; i--
5550: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
5560: 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65  if( walkExprTree
5570: 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 78  (pItem->pExpr, x
5580: 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65  Func, pArg) ) re
5590: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
55a0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
55b0: 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72   Call walkExprTr
55c0: 65 65 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  ee() for every e
55d0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 53 65 6c  xpression in Sel
55e0: 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c 75  ect p, not inclu
55f0: 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ding.** expressi
5600: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 70 61 72  ons that are par
5610: 74 20 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 73  t of sub-selects
5620: 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c 61   in any FROM cla
5630: 75 73 65 20 6f 72 20 74 68 65 20 4c 49 4d 49 54  use or the LIMIT
5640: 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54 20 65 78  .** or OFFSET ex
5650: 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73  pressions...*/.s
5660: 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 53 65  tatic int walkSe
5670: 6c 65 63 74 45 78 70 72 28 53 65 6c 65 63 74 20  lectExpr(Select 
5680: 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  *p, int (*xFunc)
5690: 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c  (void *, Expr*),
56a0: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
56b0: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e  walkExprList(p->
56c0: 70 45 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70  pEList, xFunc, p
56d0: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
56e0: 54 72 65 65 28 70 2d 3e 70 57 68 65 72 65 2c 20  Tree(p->pWhere, 
56f0: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
5700: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e  walkExprList(p->
5710: 70 47 72 6f 75 70 42 79 2c 20 78 46 75 6e 63 2c  pGroupBy, xFunc,
5720: 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78   pArg);.  walkEx
5730: 70 72 54 72 65 65 28 70 2d 3e 70 48 61 76 69 6e  prTree(p->pHavin
5740: 67 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  g, xFunc, pArg);
5750: 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  .  walkExprList(
5760: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 78 46 75  p->pOrderBy, xFu
5770: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 72 65 74  nc, pArg);.  ret
5780: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
5790: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
57a0: 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20   designed as an 
57b0: 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78  xFunc for walkEx
57c0: 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  prTree()..**.** 
57d0: 70 41 72 67 20 69 73 20 72 65 61 6c 6c 79 20 61  pArg is really a
57e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
57f0: 6e 74 65 67 65 72 2e 20 20 49 66 20 77 65 20 63  nteger.  If we c
5800: 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69  an tell by looki
5810: 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70 72 20 74  ng.** at pExpr t
5820: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
5830: 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
5840: 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20   pExpr is not a 
5850: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72  constant.** expr
5860: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74  ession, then set
5870: 20 2a 70 41 72 67 20 74 6f 20 30 20 61 6e 64 20   *pArg to 0 and 
5880: 72 65 74 75 72 6e 20 32 20 74 6f 20 61 62 61 6e  return 2 to aban
5890: 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c  don the tree wal
58a0: 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 64  k..** If pExpr d
58b0: 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20 64 69 73  oes does not dis
58c0: 71 75 61 6c 69 66 79 20 74 68 65 20 65 78 70 72  qualify the expr
58d0: 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69 6e  ession from bein
58e0: 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20  g a constant.** 
58f0: 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  then do nothing.
5900: 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61 6c  .**.** After wal
5910: 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c 65 20 74  king the whole t
5920: 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65 73  ree, if no nodes
5930: 20 61 72 65 20 66 6f 75 6e 64 20 74 68 61 74 20   are found that 
5940: 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74 68  disqualify.** th
5950: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  e expression as 
5960: 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 77  constant, then w
5970: 65 20 61 73 73 75 6d 65 20 74 68 65 20 77 68 6f  e assume the who
5980: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  le expression.**
5990: 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53   is constant.  S
59a0: 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  ee sqlite3ExprIs
59b0: 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72 20 61  Constant() for a
59c0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
59d0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
59e0: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
59f0: 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a 70 41  onstant(void *pA
5a00: 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  rg, Expr *pExpr)
5a10: 7b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  {.  switch( pExp
5a20: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
5a30: 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f  Consider functio
5a40: 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e  ns to be constan
5a50: 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61  t if all their a
5a60: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e  rguments are con
5a70: 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64  stant.    ** and
5a80: 20 2a 70 41 72 67 3d 3d 32 20 2a 2f 0a 20 20 20   *pArg==2 */.   
5a90: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
5aa0: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 2a 28 28  N:.      if( *((
5ab0: 69 6e 74 2a 29 70 41 72 67 29 3d 3d 32 20 29 20  int*)pArg)==2 ) 
5ac0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
5ad0: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
5ae0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
5af0: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  D:.    case TK_C
5b00: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
5b10: 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65  TK_DOT:.    case
5b20: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
5b30: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
5b40: 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65  G_COLUMN:.#ifnde
5b50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
5b60: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
5b70: 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63  TK_SELECT:.    c
5b80: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23  ase TK_EXISTS:.#
5b90: 65 6e 64 69 66 0a 20 20 20 20 20 20 2a 28 28 69  endif.      *((i
5ba0: 6e 74 2a 29 70 41 72 67 29 20 3d 20 30 3b 0a 20  nt*)pArg) = 0;. 
5bb0: 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
5bc0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20     case TK_IN:. 
5bd0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
5be0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
5bf0: 20 20 20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29     *((int*)pArg)
5c00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
5c10: 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a  turn 2;.      }.
5c20: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
5c30: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
5c50: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
5c60: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
5c70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
5c80: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e  s constant.** an
5c90: 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  d 0 if it involv
5ca0: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
5cb0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a  function calls..
5cc0: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
5cd0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
5ce0: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
5cf0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
5d00: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
5d10: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
5d20: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
5d30: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
5d40: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
5d50: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
5d60: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5d70: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78  xprIsConstant(Ex
5d80: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73  pr *p){.  int is
5d90: 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20 77 61 6c  Const = 1;.  wal
5da0: 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65 78 70  kExprTree(p, exp
5db0: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c  rNodeIsConstant,
5dc0: 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65   &isConst);.  re
5dd0: 74 75 72 6e 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a  turn isConst;.}.
5de0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
5df0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
5e00: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
5e10: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
5e20: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
5e30: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
5e40: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
5e50: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
5e60: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
5e70: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
5e80: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
5e90: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
5ea0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
5eb0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
5ec0: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
5ed0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
5ee0: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
5ef0: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
5f00: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
5f10: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
5f20: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
5f30: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
5f40: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
5f50: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f   *p){.  int isCo
5f60: 6e 73 74 20 3d 20 32 3b 0a 20 20 77 61 6c 6b 45  nst = 2;.  walkE
5f70: 78 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e  xprTree(p, exprN
5f80: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26  odeIsConstant, &
5f90: 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75  isConst);.  retu
5fa0: 72 6e 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d  rn isConst!=0;.}
5fb0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
5fc0: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
5fd0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
5fe0: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
5ff0: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
6000: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
6010: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
6020: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
6030: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
6040: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
6050: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
6060: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
6070: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
6080: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
6090: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
60a0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
60b0: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
60c0: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
60d0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
60e0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
60f0: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
6100: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74  *pValue){.  swit
6110: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
6120: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
6130: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
6140: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 28 63  lite3GetInt32((c
6150: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c  har*)p->token.z,
6160: 20 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20   pValue) ){.    
6170: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
6180: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6190: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
61a0: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
61b0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
61c0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
61d0: 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65  p->pLeft, pValue
61e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
61f0: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
6200: 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
6210: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
6220: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
6230: 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
6240: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
6250: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
6260: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6270: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6280: 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
6290: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
62a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
62b0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
62c0: 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
62d0: 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
62e0: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
62f0: 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
6300: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
6310: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6320: 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
6330: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
6340: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
6350: 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
6360: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
6370: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
6380: 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
6390: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
63a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
63b0: 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  Given the name o
63c0: 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  f a column of th
63d0: 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20  e form X.Y.Z or 
63e0: 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c  Y.Z or just Z, l
63f0: 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e  ook up.** that n
6400: 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f  ame in the set o
6410: 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  f source tables 
6420: 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20  in pSrcList and 
6430: 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a  make the pExpr .
6440: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ** expression no
6450: 64 65 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f  de refer back to
6460: 20 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c   that source col
6470: 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  umn.  The follow
6480: 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  ing changes.** a
6490: 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72  re made to pExpr
64a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72  :.**.**    pExpr
64b0: 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20 20 20  ->iDb           
64c0: 53 65 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Set the index in
64d0: 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68   db->aDb[] of th
64e0: 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69  e database holdi
64f0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
6510: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
6520: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20  Expr->iTable    
6530: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
6540: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
6550: 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69   the table obtai
6560: 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ned.**          
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
6580: 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a  rom pSrcList..**
6590: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
65a0: 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  mn       Set to 
65b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
65c0: 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62  r within the tab
65d0: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
65e0: 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 53  >op            S
65f0: 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e  et to TK_COLUMN.
6600: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .**    pExpr->pL
6610: 65 66 74 20 20 20 20 20 20 20 20 20 41 6e 79 20  eft         Any 
6620: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20  expression this 
6630: 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c  points to is del
6640: 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72  eted.**    pExpr
6650: 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20 20 20  ->pRight        
6660: 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
6670: 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73  his points to is
6680: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
6690: 54 68 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20  The pDbToken is 
66a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
66b0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 22 58  database (the "X
66c0: 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ").  This value 
66d0: 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d  may be.** NULL m
66e0: 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65  eaning that name
66f0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
6700: 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61  Y.Z or Z.  Any a
6710: 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73  vailable databas
6720: 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  e.** can be used
6730: 2e 20 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b  .  The pTableTok
6740: 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  en is the name o
6750: 66 20 74 68 65 20 74 61 62 6c 65 20 28 74 68 65  f the table (the
6760: 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20   "Y").  This.** 
6770: 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c  value can be NUL
6780: 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73  L if pDbToken is
6790: 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20   also NULL.  If 
67a0: 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e  pTableToken is N
67b0: 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ULL it.** means 
67c0: 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66  that the form of
67d0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61   the name is Z a
67e0: 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  nd that columns 
67f0: 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a  from any table.*
6800: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a  * can be used..*
6810: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65  *.** If the name
6820: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c   cannot be resol
6830: 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c  ved unambiguousl
6840: 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  y, leave an erro
6850: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
6860: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
6870: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74  n non-zero.  Ret
6880: 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63  urn zero on succ
6890: 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
68a0: 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20  nt lookupName(. 
68b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
68c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
68d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
68e0: 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65    Token *pDbToke
68f0: 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  n,     /* Name o
6900: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
6910: 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c  ontaining table,
6920: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
6930: 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e  ken *pTableToken
6940: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61  ,  /* Name of ta
6950: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  ble containing c
6960: 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a  olumn, or NULL *
6970: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75  /.  Token *pColu
6980: 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65  mnToken, /* Name
6990: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
69a0: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
69b0: 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65   *pNC,    /* The
69c0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 75 73   name context us
69d0: 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68  ed to resolve th
69e0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72  e name */.  Expr
69f0: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
6a00: 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58   /* Make this EX
6a10: 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f  PR node point to
6a20: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f   the selected co
6a30: 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  lumn */.){.  cha
6a40: 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20 20  r *zDb = 0;     
6a50: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
6a60: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
6a70: 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a  "X" in X.Y.Z */.
6a80: 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30    char *zTab = 0
6a90: 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ;      /* Name o
6aa0: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
6ab0: 65 20 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f  e "Y" in X.Y.Z o
6ac0: 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20  r Y.Z */.  char 
6ad0: 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20  *zCol = 0;      
6ae0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
6af0: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20  olumn.  The "Z" 
6b00: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
6b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
6b20: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
6b30: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20  int cnt = 0;    
6b40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6b50: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
6b60: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
6b70: 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20   cntTab = 0;    
6b80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
6b90: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61  atching table na
6ba0: 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  mes */.  sqlite3
6bb0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
6bc0: 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  b;  /* The datab
6bd0: 61 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ase */.  struct 
6be0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
6bf0: 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73  tem;       /* Us
6c00: 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  e for looping ov
6c10: 65 72 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d  er pSrcList item
6c20: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
6c30: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74  cList_item *pMat
6c40: 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20  ch = 0;  /* The 
6c50: 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73  matching pSrcLis
6c60: 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65  t item */.  Name
6c70: 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20  Context *pTopNC 
6c80: 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a  = pNC;        /*
6c90: 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65   First nameconte
6ca0: 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  xt in the list *
6cb0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  /..  assert( pCo
6cc0: 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f  lumnToken && pCo
6cd0: 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20  lumnToken->z ); 
6ce0: 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e  /* The Z in X.Y.
6cf0: 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  Z cannot be NULL
6d00: 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69   */.  zDb = sqli
6d10: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
6d20: 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54  (pDbToken);.  zT
6d30: 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ab = sqlite3Name
6d40: 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65  FromToken(pTable
6d50: 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d  Token);.  zCol =
6d60: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
6d70: 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b  Token(pColumnTok
6d80: 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  en);.  if( sqlit
6d90: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
6da0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f   ){.    goto loo
6db0: 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d  kupname_end;.  }
6dc0: 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ..  pExpr->iTabl
6dd0: 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65 28  e = -1;.  while(
6de0: 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20 29   pNC && cnt==0 )
6df0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
6e00: 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 72 63 4c  pEList;.    SrcL
6e10: 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
6e20: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 0a  pNC->pSrcList;..
6e30: 20 20 20 20 69 66 28 20 70 53 72 63 4c 69 73 74      if( pSrcList
6e40: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
6e50: 30 2c 20 70 49 74 65 6d 3d 70 53 72 63 4c 69 73  0, pItem=pSrcLis
6e60: 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c 69 73 74  t->a; i<pSrcList
6e70: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
6e80: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54  em++){.        T
6e90: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
6ea0: 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
6eb0: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f       Column *pCo
6ec0: 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 70 54  l;.  .        pT
6ed0: 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
6ee0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6ef0: 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
6f00: 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74       iDb = sqlit
6f10: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
6f20: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
6f30: 61 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  a);.        asse
6f40: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
6f50: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
6f60: 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  zTab ){.        
6f70: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
6f80: 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ias ){.         
6f90: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
6fa0: 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  e = pItem->zAlia
6fb0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  s;.            i
6fc0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
6fd0: 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62  p(zTabName, zTab
6fe0: 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
6ff0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
7000: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
7010: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
7020: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
7030: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
7040: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  Name==0 || sqlit
7050: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
7060: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63  me, zTab)!=0 ) c
7070: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7080: 20 20 20 20 20 69 66 28 20 7a 44 62 21 3d 30 20       if( zDb!=0 
7090: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
70a0: 70 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  p(db->aDb[iDb].z
70b0: 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b  Name, zDb)!=0 ){
70c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
70d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
70e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
70f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7100: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74       if( 0==(cnt
7110: 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20  Tab++) ){.      
7120: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
7130: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
7140: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  or;.          pE
7150: 78 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70  xpr->pSchema = p
7160: 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  Tab->pSchema;.  
7170: 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
7180: 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20   pItem;.        
7190: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  }.        for(j=
71a0: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  0, pCol=pTab->aC
71b0: 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; j<pTab->nCol
71c0: 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; j++, pCol++){.
71d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
71e0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
71f0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  l->zName, zCol)=
7200: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7210: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
7220: 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
7230: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
7240: 20 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70         IdList *p
7250: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20  Using;.         
7260: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
7270: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
7280: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
7290: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rsor;.          
72a0: 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d    pMatch = pItem
72b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
72c0: 78 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70  xpr->pSchema = p
72d0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  Tab->pSchema;.  
72e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
72f0: 73 74 69 74 75 74 65 20 74 68 65 20 72 6f 77 69  stitute the rowi
7300: 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f  d (column -1) fo
7310: 72 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  r the INTEGER PR
7320: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20  IMARY KEY */.   
7330: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7340: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61  iColumn = j==pTa
7350: 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20  b->iPKey ? -1 : 
7360: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  j;.            p
7370: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
7380: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61   pTab->aCol[j].a
7390: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
73a0: 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
73b0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
73c0: 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20  ollate)==0 ){.  
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
73e0: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
73f0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
7400: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
7410: 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ,-1, 0);.       
7420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7430: 20 20 20 69 66 28 20 69 3c 70 53 72 63 4c 69 73     if( i<pSrcLis
7440: 74 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20  t->nSrc-1 ){.   
7450: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7460: 49 74 65 6d 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65  Item[1].jointype
7470: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
7480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7490: 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63   /* If this matc
74a0: 68 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74 68  h occurred in th
74b0: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
74c0: 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a  a natural join,.
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74e0: 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  ** then skip the
74f0: 20 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f 20   right table to 
7500: 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74  avoid a duplicat
7510: 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  e match */.     
7520: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
7530: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
7540: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
7550: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
7560: 20 28 70 55 73 69 6e 67 20 3d 20 70 49 74 65 6d   (pUsing = pItem
7570: 5b 31 5d 2e 70 55 73 69 6e 67 29 21 3d 30 20 29  [1].pUsing)!=0 )
7580: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7590: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74    /* If this mat
75a0: 63 68 20 6f 63 63 75 72 73 20 6f 6e 20 61 20 63  ch occurs on a c
75b0: 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e  olumn that is in
75c0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
75d0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
75e0: 20 20 2a 2a 20 6f 66 20 61 20 6a 6f 69 6e 2c 20    ** of a join, 
75f0: 73 6b 69 70 20 74 68 65 20 73 65 61 72 63 68 20  skip the search 
7600: 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
7610: 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 0a 20  le of the join. 
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
7630: 2a 20 74 6f 20 61 76 6f 69 64 20 61 20 64 75 70  * to avoid a dup
7640: 6c 69 63 61 74 65 20 6d 61 74 63 68 20 74 68 65  licate match the
7650: 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re. */.         
7660: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
7680: 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d  r(k=0; k<pUsing-
7690: 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  >nId; k++){.    
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
76b0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
76c0: 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e  (pUsing->a[k].zN
76d0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
76e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
76f0: 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20       pItem++;.  
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7710: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
7720: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
7730: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7740: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7750: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7770: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
7790: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
77a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
77b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
77c0: 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 2f 2a  T_TRIGGER.    /*
77d0: 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20   If we have not 
77e0: 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64  already resolved
77f0: 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20   the name, then 
7800: 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20 69 74  maybe .    ** it
7810: 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f   is a new.* or o
7820: 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72 67  ld.* trigger arg
7830: 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 0a  ument reference.
7840: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a      */.    if( z
7850: 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30  Db==0 && zTab!=0
7860: 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20 70 50   && cnt==0 && pP
7870: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 21  arse->trigStack!
7880: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72 69 67  =0 ){.      Trig
7890: 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69 67 67  gerStack *pTrigg
78a0: 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65  erStack = pParse
78b0: 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20 20  ->trigStack;.   
78c0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
78d0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   0;.      if( pT
78e0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77  riggerStack->new
78f0: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
7900: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e 65 77  ite3StrICmp("new
7910: 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b  ", zTab) == 0 ){
7920: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
7930: 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65  iTable = pTrigge
7940: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a  rStack->newIdx;.
7950: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7960: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
7970: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70  Tab );.        p
7980: 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74  Tab = pTriggerSt
7990: 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  ack->pTab;.     
79a0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69 67   }else if( pTrig
79b0: 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78  gerStack->oldIdx
79c0: 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65   != -1 && sqlite
79d0: 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20  3StrICmp("old", 
79e0: 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zTab)==0 ){.    
79f0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
7a00: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
7a10: 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20  k->oldIdx;.     
7a20: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
7a30: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29  gerStack->pTab )
7a40: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
7a50: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
7a60: 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pTab;.      }.. 
7a70: 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b       if( pTab ){
7a80: 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43   .        int iC
7a90: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75  ol;.        Colu
7aa0: 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d  mn *pCol = pTab-
7ab0: 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  >aCol;..        
7ac0: 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d  pExpr->pSchema =
7ad0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
7ae0: 20 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b          cntTab++
7af0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43  ;.        for(iC
7b00: 6f 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20 70 54 61  ol=0; iCol < pTa
7b10: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c  b->nCol; iCol++,
7b20: 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20   pCol++) {.     
7b30: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7b40: 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
7b50: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
7b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
7b70: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
7b80: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7b90: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
7ba0: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
7bb0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
7bc0: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70  Column = iCol==p
7bd0: 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20  Tab->iPKey ? -1 
7be0: 3a 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  : iCol;.        
7bf0: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
7c00: 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ity = pTab->aCol
7c10: 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b  [iCol].affinity;
7c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7c30: 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
7c40: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d   EP_ExpCollate)=
7c50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7c60: 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c      pExpr->pColl
7c70: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
7c80: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
7c90: 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b  ), zColl,-1, 0);
7ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7cb0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7cc0: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
7cd0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
7ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
7cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7d00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
7d10: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7d20: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f  OMIT_TRIGGER) */
7d30: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
7d40: 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65  Perhaps the name
7d50: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
7d60: 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20  to the ROWID.   
7d70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d   */.    if( cnt=
7d80: 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20  =0 && cntTab==1 
7d90: 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
7da0: 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  d(zCol) ){.     
7db0: 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   cnt = 1;.      
7dc0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
7dd0: 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72   -1;.      pExpr
7de0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
7df0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
7e00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
7e10: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70     ** If the inp
7e20: 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  ut is of the for
7e30: 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20  m Z (not Y.Z or 
7e40: 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20  X.Y.Z) then the 
7e50: 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69  name Z.    ** mi
7e60: 67 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20  ght refer to an 
7e70: 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73  result-set alias
7e80: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
7e90: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
7ea0: 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65  en.    ** we are
7eb0: 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73   resolving names
7ec0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
7ed0: 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ause of the foll
7ee0: 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20  owing command:. 
7ef0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
7f00: 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78   SELECT a+b AS x
7f10: 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52   FROM table WHER
7f20: 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20  E x<10;.    **. 
7f30: 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c     ** In cases l
7f40: 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63  ike this, replac
7f50: 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20 63  e pExpr with a c
7f60: 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
7f70: 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a  ssion that.    *
7f80: 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75  * forms the resu
7f90: 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61  lt set entry ("a
7fa0: 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70  +b" in the examp
7fb0: 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69  le) and return i
7fc0: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
7fd0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
7fe0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
7ff0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68  he result set sh
8000: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
8010: 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65  y been.    ** re
8020: 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69  solved by the ti
8030: 6d 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  me the WHERE cla
8040: 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e  use is resolved.
8050: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8060: 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73  cnt==0 && (pELis
8070: 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29  t = pNC->pEList)
8080: 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29  !=0 && zTab==0 )
8090: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  {.      for(j=0;
80a0: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
80b0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
80c0: 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69  char *zAs = pELi
80d0: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
80e0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21          if( zAs!
80f0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
8100: 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d  ICmp(zAs, zCol)=
8110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8120: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
8130: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
8140: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
8150: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8160: 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20  op = TK_AS;.    
8170: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
8180: 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
8190: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
81a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
81b0: 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  p(pEList->a[j].p
81c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
81d0: 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   cnt = 1;.      
81e0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62      assert( zTab
81f0: 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b  ==0 && zDb==0 );
8200: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
8210: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32  lookupname_end_2
8220: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8230: 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20    } .    }..    
8240: 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  /* Advance to th
8250: 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74  e next name cont
8260: 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77  ext.  The loop w
8270: 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69  ill exit when ei
8280: 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68  ther.    ** we h
8290: 61 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74  ave a match (cnt
82a0: 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72  >0) or when we r
82b0: 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63  un out of name c
82c0: 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a  ontexts..    */.
82d0: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29      if( cnt==0 )
82e0: 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e  {.      pNC = pN
82f0: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  C->pNext;.    }.
8300: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
8310: 66 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55  f X and Y are NU
8320: 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  LL (in other wor
8330: 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63  ds if only the c
8340: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a  olumn name Z is.
8350: 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61    ** supplied) a
8360: 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
8370: 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e  Z is enclosed in
8380: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20   double-quotes, 
8390: 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61  then.  ** Z is a
83a0: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
83b0: 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61  if it doesn't ma
83c0: 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e  tch any column n
83d0: 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20  ames.  In that. 
83e0: 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65   ** case, we nee
83f0: 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68  d to return righ
8400: 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d  t away and not m
8410: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ake any changes 
8420: 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20  to.  ** pExpr.. 
8430: 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65   **.  ** Because
8440: 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
8450: 73 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20  s made to outer 
8460: 63 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e  contexts, the pN
8470: 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65  C->nRef.  ** fie
8480: 6c 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e  lds are not chan
8490: 67 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65  ged in any conte
84a0: 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  xt..  */.  if( c
84b0: 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30  nt==0 && zTab==0
84c0: 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e   && pColumnToken
84d0: 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20  ->z[0]=='"' ){. 
84e0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43     sqliteFree(zC
84f0: 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ol);.    return 
8500: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  0;.  }..  /*.  *
8510: 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74  * cnt==0 means t
8520: 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74  here was not mat
8530: 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73  ch.  cnt>1 means
8540: 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f 20   there were two 
8550: 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74  or.  ** more mat
8560: 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77 61  ches.  Either wa
8570: 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65 72  y, we have an er
8580: 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ror..  */.  if( 
8590: 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 68  cnt!=1 ){.    ch
85a0: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63  ar *z = 0;.    c
85b0: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a  har *zErr;.    z
85c0: 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22  Err = cnt==0 ? "
85d0: 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20  no such column: 
85e0: 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73  %s" : "ambiguous
85f0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
8600: 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29  ";.    if( zDb )
8610: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
8620: 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62  etString(&z, zDb
8630: 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22  , ".", zTab, "."
8640: 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30  , zCol, (char*)0
8650: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8660: 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73   zTab ){.      s
8670: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
8680: 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  &z, zTab, ".", z
8690: 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Col, (char*)0);.
86a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
86b0: 20 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75   z = sqliteStrDu
86c0: 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  p(zCol);.    }. 
86d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
86e0: 73 67 28 70 50 61 72 73 65 2c 20 7a 45 72 72 2c  sg(pParse, zErr,
86f0: 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46   z);.    sqliteF
8700: 72 65 65 28 7a 29 3b 0a 20 20 20 20 70 54 6f 70  ree(z);.    pTop
8710: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a  NC->nErr++;.  }.
8720: 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d  .  /* If a colum
8730: 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 69  n from a table i
8740: 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20 72 65  n pSrcList is re
8750: 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e 20 72  ferenced, then r
8760: 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73 20  ecord.  ** this 
8770: 66 61 63 74 20 69 6e 20 74 68 65 20 70 53 72 63  fact in the pSrc
8780: 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64  List.a[].colUsed
8790: 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d   bitmask.  Colum
87a0: 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a 2a 20  n 0 causes.  ** 
87b0: 62 69 74 20 30 20 74 6f 20 62 65 20 73 65 74 2e  bit 0 to be set.
87c0: 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20    Column 1 sets 
87d0: 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f 20 66  bit 1.  And so f
87e0: 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20  orth.  If the.  
87f0: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  ** column number
8800: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
8810: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
8820: 69 74 73 20 69 6e 20 74 68 65 20 62 69 74 6d 61  its in the bitma
8830: 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74  sk.  ** then set
8840: 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20   the high-order 
8850: 62 69 74 20 6f 66 20 74 68 65 20 62 69 74 6d 61  bit of the bitma
8860: 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  sk..  */.  if( p
8870: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
8880: 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20 29 7b   && pMatch!=0 ){
8890: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78  .    int n = pEx
88a0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
88b0: 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42   if( n>=sizeof(B
88c0: 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20  itmask)*8 ){.   
88d0: 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69     n = sizeof(Bi
88e0: 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20  tmask)*8-1;.    
88f0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  }.    assert( pM
8900: 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70  atch->iCursor==p
8910: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
8920: 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55      pMatch->colU
8930: 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b  sed |= ((Bitmask
8940: 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f  )1)<<n;.  }..loo
8950: 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f  kupname_end:.  /
8960: 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72  * Clean up and r
8970: 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c  eturn.  */.  sql
8980: 69 74 65 46 72 65 65 28 7a 44 62 29 3b 0a 20 20  iteFree(zDb);.  
8990: 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29  sqliteFree(zTab)
89a0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
89b0: 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 4c 65  elete(pExpr->pLe
89c0: 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  ft);.  pExpr->pL
89d0: 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  eft = 0;.  sqlit
89e0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
89f0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70  pr->pRight);.  p
8a00: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30  Expr->pRight = 0
8a10: 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20  ;.  pExpr->op = 
8a20: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75  TK_COLUMN;.looku
8a30: 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20 20 73  pname_end_2:.  s
8a40: 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b  qliteFree(zCol);
8a50: 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b  .  if( cnt==1 ){
8a60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 43  .    assert( pNC
8a70: 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
8a80: 65 33 41 75 74 68 52 65 61 64 28 70 50 61 72 73  e3AuthRead(pPars
8a90: 65 2c 20 70 45 78 70 72 2c 20 70 4e 43 2d 3e 70  e, pExpr, pNC->p
8aa0: 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  SrcList);.    if
8ab0: 28 20 70 4d 61 74 63 68 20 26 26 20 21 70 4d 61  ( pMatch && !pMa
8ac0: 74 63 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tch->pSelect ){.
8ad0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61        pExpr->pTa
8ae0: 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62  b = pMatch->pTab
8af0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
8b00: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 52 65  ncrement the nRe
8b10: 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e  f value on all n
8b20: 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66 72 6f  ame contexts fro
8b30: 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20  m TopNC up to.  
8b40: 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 77    ** the point w
8b50: 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20 6d 61  here the name ma
8b60: 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f  tched. */.    fo
8b70: 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73 73  r(;;){.      ass
8b80: 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30 20 29  ert( pTopNC!=0 )
8b90: 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e  ;.      pTopNC->
8ba0: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nRef++;.      if
8bb0: 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20  ( pTopNC==pNC ) 
8bc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f  break;.      pTo
8bd0: 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e  pNC = pTopNC->pN
8be0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ext;.    }.    r
8bf0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73  eturn 0;.  } els
8c00: 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e {.    return 1
8c10: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
8c20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64  his routine is d
8c30: 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46  esigned as an xF
8c40: 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72  unc for walkExpr
8c50: 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65  Tree()..**.** Re
8c60: 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e  solve symbolic n
8c70: 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c  ames into TK_COL
8c80: 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f  UMN operators fo
8c90: 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  r the current.**
8ca0: 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70   node in the exp
8cb0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
8cc0: 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69  eturn 0 to conti
8cd0: 6e 75 65 20 74 68 65 20 73 65 61 72 63 68 20 64  nue the search d
8ce0: 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20  own.** the tree 
8cf0: 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68  or 2 to abort th
8d00: 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a  e tree walk..**.
8d10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8d20: 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20  also does error 
8d30: 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d  checking and nam
8d40: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72  e resolution for
8d50: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  .** function nam
8d60: 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f  es.  The operato
8d70: 72 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  r for aggregate 
8d80: 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61  functions is cha
8d90: 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47  nged.** to TK_AG
8da0: 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73  G_FUNCTION..*/.s
8db0: 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 52 65  tatic int nameRe
8dc0: 73 6f 6c 76 65 72 53 74 65 70 28 76 6f 69 64 20  solverStep(void 
8dd0: 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78  *pArg, Expr *pEx
8de0: 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  pr){.  NameConte
8df0: 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43  xt *pNC = (NameC
8e00: 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b 0a 20 20  ontext*)pArg;.  
8e10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a  Parse *pParse;..
8e20: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
8e30: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 73 73   return 1;.  ass
8e40: 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20  ert( pNC!=0 );. 
8e50: 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70   pParse = pNC->p
8e60: 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 45 78  Parse;..  if( Ex
8e70: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
8e80: 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c  (pExpr, EP_Resol
8e90: 76 65 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b  ved) ) return 1;
8ea0: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
8eb0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73  ty(pExpr, EP_Res
8ec0: 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20  olved);.#ifndef 
8ed0: 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70 4e 43  NDEBUG.  if( pNC
8ee0: 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20 70 4e  ->pSrcList && pN
8ef0: 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c  C->pSrcList->nAl
8f00: 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53 72 63  loc>0 ){.    Src
8f10: 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
8f20: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
8f30: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
8f40: 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70  or(i=0; i<pNC->p
8f50: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
8f60: 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
8f70: 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  t( pSrcList->a[i
8f80: 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20  ].iCursor>=0 && 
8f90: 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pSrcList->a[i].i
8fa0: 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e  Cursor<pParse->n
8fb0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
8fc0: 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28  #endif.  switch(
8fd0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
8fe0: 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74    /* Double-quot
8ff0: 65 64 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20  ed strings (ex: 
9000: 22 61 62 63 22 29 20 61 72 65 20 75 73 65 64 20  "abc") are used 
9010: 61 73 20 69 64 65 6e 74 69 66 69 65 72 73 20 69  as identifiers i
9020: 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c  f.    ** possibl
9030: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
9040: 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73 74 72  ey remain as str
9050: 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75  ings.  Single-qu
9060: 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74 72 69  oted.    ** stri
9070: 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27 29 20  ngs (ex: 'abc') 
9080: 61 72 65 20 61 6c 77 61 79 73 20 73 74 72 69 6e  are always strin
9090: 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20 20  g literals..    
90a0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  */.    case TK_S
90b0: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69  TRING: {.      i
90c0: 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
90d0: 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65  z[0]=='\'' ) bre
90e0: 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  ak;.      /* Fal
90f0: 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
9100: 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20 74 68  TK_ID case if th
9110: 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71  is is a double-q
9120: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  uoted string */.
9130: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c      }.    /* A l
9140: 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72 20 69  one identifier i
9150: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
9160: 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20  column..    */. 
9170: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b     case TK_ID: {
9180: 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d  .      lookupNam
9190: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  e(pParse, 0, 0, 
91a0: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70  &pExpr->token, p
91b0: 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  NC, pExpr);.    
91c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
91d0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61  }.  .    /* A ta
91e0: 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c  ble name and col
91f0: 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44  umn name:     ID
9200: 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20  .ID.    ** Or a 
9210: 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20  database, table 
9220: 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e  and column:  ID.
9230: 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20  ID.ID.    */.   
9240: 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a   case TK_DOT: {.
9250: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f        Token *pCo
9260: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65  lumn;.      Toke
9270: 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20 20  n *pTable;.     
9280: 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20   Token *pDb;.   
9290: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b     Expr *pRight;
92a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28 20 70  ..      /* if( p
92b0: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62 72 65  SrcList==0 ) bre
92c0: 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52 69  ak; */.      pRi
92d0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
92e0: 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ght;.      if( p
92f0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  Right->op==TK_ID
9300: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20   ){.        pDb 
9310: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61  = 0;.        pTa
9320: 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c  ble = &pExpr->pL
9330: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
9340: 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70      pColumn = &p
9350: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  Right->token;.  
9360: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9370: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
9380: 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b  t->op==TK_DOT );
9390: 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 26  .        pDb = &
93a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f  pExpr->pLeft->to
93b0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61  ken;.        pTa
93c0: 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70  ble = &pRight->p
93d0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
93e0: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26       pColumn = &
93f0: 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e  pRight->pRight->
9400: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  token;.      }. 
9410: 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28       lookupName(
9420: 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70 54 61  pParse, pDb, pTa
9430: 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e  ble, pColumn, pN
9440: 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  C, pExpr);.     
9450: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
9460: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ..    /* Resolve
9470: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a   function names.
9480: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
9490: 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
94a0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
94b0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
94c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
94d0: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20  Expr->pList;    
94e0: 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  /* The argument 
94f0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  list */.      in
9500: 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  t n = pList ? pL
9510: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20  ist->nExpr : 0; 
9520: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
9530: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
9540: 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e   int no_such_fun
9550: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  c = 0;       /* 
9560: 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20  True if no such 
9570: 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20  function exists 
9580: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f  */.      int wro
9590: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b  ng_num_args = 0;
95a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
95b0: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
95c0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
95d0: 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20     int is_agg = 
95e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
95f0: 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e 20  * True if is an 
9600: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
9610: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
9620: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 75 74  i;.      int aut
9630: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
9640: 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a       /* Authoriz
9650: 61 74 69 6f 6e 20 74 6f 20 75 73 65 20 74 68 65  ation to use the
9660: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
9670: 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20     int nId;     
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9690: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
96a0: 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69  acters in functi
96b0: 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  on name */.     
96c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
96d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
96e0: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
96f0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63  e. */.      Func
9700: 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20  Def *pDef;      
9710: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
9720: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
9730: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
9740: 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43     int enc = ENC
9750: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20 20 2f  (pParse->db);  /
9760: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 65  * The database e
9770: 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  ncoding */..    
9780: 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70    zId = (char*)p
9790: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20  Expr->token.z;. 
97a0: 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72       nId = pExpr
97b0: 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20  ->token.n;.     
97c0: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
97d0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
97e0: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
97f0: 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  , n, enc, 0);.  
9800: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
9810: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
9820: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
9830: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
9840: 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20  , zId, nId, -1, 
9850: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
9860: 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
9870: 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63            no_suc
9880: 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20  h_func = 1;.    
9890: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
98a0: 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61       wrong_num_a
98b0: 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  rgs = 1;.       
98c0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
98d0: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
98e0: 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b   pDef->xFunc==0;
98f0: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
9900: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
9910: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20  HORIZATION.     
9920: 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20 20 20   if( pDef ){.   
9930: 20 20 20 20 20 61 75 74 68 20 3d 20 73 71 6c 69       auth = sqli
9940: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
9950: 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  rse, SQLITE_FUNC
9960: 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a  TION, 0, pDef->z
9970: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
9980: 20 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c 49    if( auth!=SQLI
9990: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
99a0: 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c     if( auth==SQL
99b0: 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20  ITE_DENY ){.    
99c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
99d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
99e0: 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20  "not authorized 
99f0: 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a  to use function:
9a00: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e            pDef->
9a30: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
9a40: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
9a50: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9a60: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
9a70: 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
9a80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
9a90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9aa0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
9ab0: 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 70 4e  f( is_agg && !pN
9ac0: 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20  C->allowAgg ){. 
9ad0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
9ae0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9af0: 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
9b00: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a  ate function %.*
9b10: 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a  s()", nId,zId);.
9b20: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
9b30: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f  r++;.        is_
9b40: 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  agg = 0;.      }
9b50: 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68  else if( no_such
9b60: 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  _func ){.       
9b70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9b80: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
9b90: 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73  h function: %.*s
9ba0: 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20  ", nId, zId);.  
9bb0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
9bc0: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
9bd0: 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67  f( wrong_num_arg
9be0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
9bf0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9c00: 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65  rse,"wrong numbe
9c10: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
9c20: 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  o function %.*s(
9c30: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
9c40: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
9c50: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
9c60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9c70: 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20  f( is_agg ){.   
9c80: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
9c90: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
9ca0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 68  ;.        pNC->h
9cb0: 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  asAgg = 1;.     
9cc0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
9cd0: 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77  agg ) pNC->allow
9ce0: 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  Agg = 0;.      f
9cf0: 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72  or(i=0; pNC->nEr
9d00: 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b  r==0 && i<n; i++
9d10: 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c 6b 45  ){.        walkE
9d20: 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d 3e 61  xprTree(pList->a
9d30: 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52  [i].pExpr, nameR
9d40: 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43  esolverStep, pNC
9d50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9d60: 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e   if( is_agg ) pN
9d70: 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b  C->allowAgg = 1;
9d80: 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45  .      /* FIX ME
9d90: 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72  :  Compute pExpr
9da0: 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65 64  ->affinity based
9db0: 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65 64   on the expected
9dc0: 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a   return.      **
9dd0: 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e   type of the fun
9de0: 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a  ction .      */.
9df0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 73 5f        return is_
9e00: 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  agg;.    }.#ifnd
9e10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
9e20: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
9e30: 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
9e40: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
9e50: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
9e60: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
9e70: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
9e80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
9e90: 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65   nRef = pNC->nRe
9ea0: 66 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f;.#ifndef SQLIT
9eb0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20  E_OMIT_CHECK.   
9ec0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73       if( pNC->is
9ed0: 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  Check ){.       
9ee0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9ef0: 73 67 28 70 50 61 72 73 65 2c 22 73 75 62 71 75  sg(pParse,"subqu
9f00: 65 72 69 65 73 20 70 72 6f 68 69 62 69 74 65 64  eries prohibited
9f10: 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   in CHECK constr
9f20: 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20  aints");.       
9f30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
9f40: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52    sqlite3SelectR
9f50: 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
9f60: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Expr->pSelect, p
9f70: 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  NC);.        ass
9f80: 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d  ert( pNC->nRef>=
9f90: 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20 20 20  nRef );.        
9fa0: 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e  if( nRef!=pNC->n
9fb0: 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Ref ){.         
9fc0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
9fd0: 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
9fe0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  lect);.        }
9ff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
a000: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
a010: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a020: 43 48 45 43 4b 0a 20 20 20 20 63 61 73 65 20 54  CHECK.    case T
a030: 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
a040: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43      if( pNC->isC
a050: 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  heck ){.        
a060: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a070: 70 50 61 72 73 65 2c 22 70 61 72 61 6d 65 74 65  pParse,"paramete
a080: 72 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e  rs prohibited in
a090: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
a0a0: 74 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ts");.      }.  
a0b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a0c0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
a0d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
a0e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
a0f0: 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f  lks an expressio
a100: 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c  n tree and resol
a110: 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20 74  ves references t
a120: 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d  o.** table colum
a130: 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68  ns.  Nodes of th
a140: 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20  e form ID.ID or 
a150: 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20  ID resolve into 
a160: 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74  an.** index to t
a170: 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  he table in the 
a180: 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61  table list and a
a190: 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20   column offset. 
a1a0: 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70   The .** Expr.op
a1b0: 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f  code for such no
a1c0: 64 65 73 20 69 73 20 63 68 61 6e 67 65 64 20 74  des is changed t
a1d0: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68  o TK_COLUMN.  Th
a1e0: 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a  e Expr.iTable.**
a1f0: 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65   value is change
a200: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  d to the index o
a210: 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  f the referenced
a220: 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
a230: 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22  st.** plus the "
a240: 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68  base" value.  Th
a250: 65 20 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c  e base value wil
a260: 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63  l ultimately bec
a270: 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20  ome the.** VDBE 
a280: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
a290: 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
a2a0: 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f  is pointing into
a2b0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a   the referenced.
a2c0: 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45  ** table.  The E
a2d0: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  xpr.iColumn valu
a2e0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
a2f0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
a300: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74   column .** of t
a310: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
a320: 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ble.  The Expr.i
a330: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72  Column value for
a340: 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20   the special.** 
a350: 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20  ROWID column is 
a360: 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52  -1.  Any INTEGER
a370: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
a380: 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73 20  umn is tried as 
a390: 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20  an.** alias for 
a3a0: 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  ROWID..**.** Als
a3b0: 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63 74 69  o resolve functi
a3c0: 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63 68 65  on names and che
a3d0: 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73  ck the functions
a3e0: 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75   for proper.** u
a3f0: 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  sage.  Make sure
a400: 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61   all function na
a410: 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a  mes are recogniz
a420: 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74  ed and all funct
a430: 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68 65  ions.** have the
a440: 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
a450: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c  of arguments.  L
a460: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
a470: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
a480: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20 61  se->zErrMsg if a
a490: 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73  nything is amiss
a4a0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
a4b0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
a4c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
a4d0: 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ression contains
a4e0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
a4f0: 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20 74 68  ions then set th
a500: 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70  e EP_Agg.** prop
a510: 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72  erty on the expr
a520: 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ession..*/.int s
a530: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
a540: 65 4e 61 6d 65 73 28 0a 20 20 4e 61 6d 65 43 6f  eNames(.  NameCo
a550: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20  ntext *pNC,     
a560: 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74    /* Namespace t
a570: 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73  o resolve expres
a580: 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45  sions in. */.  E
a590: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
a5a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
a5b0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
a5c0: 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20  nalyzed. */.){. 
a5d0: 20 69 6e 74 20 73 61 76 65 64 48 61 73 41 67 67   int savedHasAgg
a5e0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
a5f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
a600: 61 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43  avedHasAgg = pNC
a610: 2d 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d  ->hasAgg;.  pNC-
a620: 3e 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77  >hasAgg = 0;.  w
a630: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
a640: 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53  r, nameResolverS
a650: 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 69 66 28  tep, pNC);.  if(
a660: 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a   pNC->nErr>0 ){.
a670: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
a680: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72  rty(pExpr, EP_Er
a690: 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ror);.  }.  if( 
a6a0: 70 4e 43 2d 3e 68 61 73 41 67 67 20 29 7b 0a 20  pNC->hasAgg ){. 
a6b0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
a6c0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67 67  ty(pExpr, EP_Agg
a6d0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
a6e0: 61 76 65 64 48 61 73 41 67 67 20 29 7b 0a 20 20  avedHasAgg ){.  
a6f0: 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20    pNC->hasAgg = 
a700: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
a710: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a720: 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29  pExpr, EP_Error)
a730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69  ;.}../*.** A poi
a740: 6e 74 65 72 20 69 6e 73 74 61 6e 63 65 20 6f 66  nter instance of
a750: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
a760: 69 73 20 75 73 65 64 20 74 6f 20 70 61 73 73 20  is used to pass 
a770: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
a780: 68 72 6f 75 67 68 20 77 61 6c 6b 45 78 70 72 54  hrough walkExprT
a790: 72 65 65 20 69 6e 74 6f 20 63 6f 64 65 53 75 62  ree into codeSub
a7a0: 71 75 65 72 79 53 74 65 70 28 29 2e 0a 2a 2f 0a  queryStep()..*/.
a7b0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 51  typedef struct Q
a7c0: 75 65 72 79 43 6f 64 65 72 20 51 75 65 72 79 43  ueryCoder QueryC
a7d0: 6f 64 65 72 3b 0a 73 74 72 75 63 74 20 51 75 65  oder;.struct Que
a7e0: 72 79 43 6f 64 65 72 20 7b 0a 20 20 50 61 72 73  ryCoder {.  Pars
a7f0: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
a800: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
a810: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d  context */.  Nam
a820: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20  eContext *pNC;  
a830: 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 6f    /* Namespace o
a840: 66 20 66 69 72 73 74 20 65 6e 63 6c 6f 73 69 6e  f first enclosin
a850: 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a  g query */.};...
a860: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
a870: 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
a880: 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
a890: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  s an expression.
a8a0: 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74  ** and IN operat
a8b0: 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
a8c0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
a8d0: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
a8e0: 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
a8f0: 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
a900: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
a910: 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
a920: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
a930: 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
a940: 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
a950: 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
a960: 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
a970: 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
a980: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
a990: 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
a9a0: 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
a9b0: 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
a9c0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
a9d0: 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
a9e0: 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
a9f0: 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
aa00: 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
aa10: 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
aa20: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
aa30: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
aa40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
aa50: 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65  eSubselect(Parse
aa60: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
aa70: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 74 65  pExpr){.  int te
aa80: 73 74 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20  stAddr = 0;     
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
aab0: 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
aac0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
aad0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
aae0: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
aaf0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 69  eturn;..  /* Thi
ab00: 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72  s code must be r
ab10: 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65  un in its entire
ab20: 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74  ty every time it
ab30: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
ab40: 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74    ** if any of t
ab50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
ab60: 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
ab70: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
ab80: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63  hand side is a c
ab90: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
aba0: 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  ry.  **    *  Th
abb0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
abc0: 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69  e is an expressi
abd0: 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  on list containi
abe0: 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  ng variables.  *
abf0: 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69  *    *  We are i
ac00: 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a  nside a trigger.
ac10: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c    **.  ** If all
ac20: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
ac30: 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65  e false, then we
ac40: 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f   can run this co
ac50: 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a  de just once.  *
ac60: 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c  * save the resul
ac70: 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68  ts, and reuse th
ac80: 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e  e same result on
ac90: 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f   subsequent invo
aca0: 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  cations..  */.  
acb0: 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  if( !ExprHasAnyP
acc0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
acd0: 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20  P_VarSelect) && 
ace0: 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  !pParse->trigSta
acf0: 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65  ck ){.    int me
ad00: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
ad10: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
ad20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
ad30: 65 6d 4c 6f 61 64 2c 20 6d 65 6d 2c 20 30 29 3b  emLoad, mem, 0);
ad40: 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20  .    testAddr = 
ad50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ad60: 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 30 29  (v, OP_If, 0, 0)
ad70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 65  ;.    assert( te
ad80: 73 74 41 64 64 72 3e 30 20 7c 7c 20 73 71 6c 69  stAddr>0 || sqli
ad90: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
ada0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
adb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
adc0: 4d 65 6d 49 6e 74 2c 20 31 2c 20 6d 65 6d 29 3b  MemInt, 1, mem);
add0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
ade0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
adf0: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
ae00: 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
ae10: 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  ty;.      KeyInf
ae20: 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20  o keyInfo;.     
ae30: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
ae40: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
ae50: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
ae60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
ae70: 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
ae80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
ae90: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
aea0: 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ft);..      /* W
aeb0: 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
aec0: 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
aed0: 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
aee0: 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
aef0: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
af00: 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
af10: 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20 76  he same way. A v
af20: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
af30: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
af40: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
af50: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
af60: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
af70: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
af80: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
af90: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
afa0: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
afb0: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
afc0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
afd0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
afe0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
aff0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
b000: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
b010: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
b020: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
b030: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
b040: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
b050: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
b060: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
b070: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
b080: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
b090: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
b0a0: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
b0b0: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
b0c0: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
b0d0: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
b0e0: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
b0f0: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
b100: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
b110: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
b120: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
b130: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
b140: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
b150: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
b160: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
b170: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
b180: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
b190: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
b1a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b1b0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  p(v, OP_OpenEphe
b1c0: 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54  meral, pExpr->iT
b1d0: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
b1e0: 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c  memset(&keyInfo,
b1f0: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e   0, sizeof(keyIn
b200: 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49  fo));.      keyI
b210: 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a  nfo.nField = 1;.
b220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b230: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
b240: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70  NumColumns, pExp
b250: 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a  r->iTable, 1);..
b260: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
b270: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
b280: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
b290: 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
b2a0: 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
b2b0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
b2c0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
b2d0: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
b2e0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
b2f0: 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
b300: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
b310: 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
b320: 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
b330: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
b340: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 45    int iParm = pE
b350: 78 70 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20 28  xpr->iTable +  (
b360: 28 28 69 6e 74 29 61 66 66 69 6e 69 74 79 29 3c  ((int)affinity)<
b370: 3c 31 36 29 3b 0a 20 20 20 20 20 20 20 20 45 78  <16);.        Ex
b380: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
b390: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b3a0: 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30  (pExpr->iTable&0
b3b0: 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70  x0000FFFF)==pExp
b3c0: 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
b3d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
b3e0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
b3f0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53  Expr->pSelect, S
b400: 52 54 5f 53 65 74 2c 20 69 50 61 72 6d 2c 20 30  RT_Set, iParm, 0
b410: 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  , 0, 0, 0) ){.  
b420: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
b430: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b440: 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
b450: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
b460: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
b470: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
b480: 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20  >nExpr>0 ){ .   
b490: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
b4a0: 43 6f 6c 6c 5b 30 5d 20 3d 20 62 69 6e 61 72 79  Coll[0] = binary
b4b0: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
b4c0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b4d0: 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eft,.           
b4e0: 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e     pEList->a[0].
b4f0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
b500: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
b510: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29  ( pExpr->pList )
b520: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
b530: 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
b540: 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
b550: 20 20 20 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65      **..** For e
b560: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
b570: 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
b580: 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
b590: 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
b5a0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
b5b0: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
b5c0: 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
b5d0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
b5e0: 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
b5f0: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
b600: 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
b610: 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
b620: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
b630: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
b640: 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
b650: 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
b660: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
b670: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
b680: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
b690: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
b6a0: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
b6b0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
b6c0: 74 65 6d 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  tem;..        if
b6d0: 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( !affinity ){. 
b6e0: 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
b6f0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
b700: 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
b710: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
b720: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d  Coll[0] = pExpr-
b730: 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a  >pLeft->pColl;..
b740: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
b750: 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
b760: 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
b770: 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
b780: 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
b790: 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
b7a0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
b7b0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
b7c0: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
b7d0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  pItem->pExpr;.. 
b7e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
b7f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b800: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
b810: 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
b820: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
b830: 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
b840: 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
b850: 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
b860: 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
b870: 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
b880: 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
b890: 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
b8a0: 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
b8b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
b8c0: 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
b8d0: 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
b8e0: 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
b8f0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
b900: 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64        if( testAd
b910: 64 72 3e 30 20 26 26 20 21 73 71 6c 69 74 65 33  dr>0 && !sqlite3
b920: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
b930: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
b940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
b950: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65  angeToNoop(v, te
b960: 73 74 41 64 64 72 2d 31 2c 20 33 29 3b 0a 20 20  stAddr-1, 3);.  
b970: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64            testAd
b980: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
b990: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
b9a0: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
b9b0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
b9c0: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
b9d0: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
b9e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b9f0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ba00: 20 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20   pE2);.         
ba10: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
ba20: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
ba30: 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 1, 0, &affinit
ba40: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 1);.         
ba50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ba60: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
ba70: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
ba80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
ba90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
baa0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
bab0: 33 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64  3(v, addr, (void
bac0: 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f   *)&keyInfo, P3_
bad0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
bae0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
baf0: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
bb00: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
bb10: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
bb20: 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20   This has to be 
bb30: 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e  a scalar SELECT.
bb40: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
bb50: 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20  to put the.     
bb60: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69   ** value of thi
bb70: 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65  s select in a me
bb80: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
bb90: 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a  cord the number.
bba0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
bbb0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69  memory cell in i
bbc0: 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f  Column..      */
bbd0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
bbe0: 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20  nst Token one = 
bbf0: 7b 20 28 75 38 2a 29 22 31 22 2c 20 30 2c 20 31  { (u8*)"1", 0, 1
bc00: 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   };.      Select
bc10: 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20 69 6e   *pSel;.      in
bc20: 74 20 69 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e  t iMem;.      in
bc30: 74 20 73 6f 70 3b 0a 0a 20 20 20 20 20 20 70 45  t sop;..      pE
bc40: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69  xpr->iColumn = i
bc50: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
bc60: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 6c  em++;.      pSel
bc70: 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63   = pExpr->pSelec
bc80: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  t;.      if( pEx
bc90: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
bca0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 70  T ){.        sop
bcb0: 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20   = SRT_Mem;.    
bcc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bcd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75  ddOp(v, OP_MemNu
bce0: 6c 6c 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  ll, iMem, 0);.  
bcf0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
bd00: 74 28 28 76 2c 20 22 23 20 49 6e 69 74 20 73 75  t((v, "# Init su
bd10: 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
bd20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
bd30: 20 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54         sop = SRT
bd40: 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
bd50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bd60: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
bd70: 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  0, iMem);.      
bd80: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
bd90: 2c 20 22 23 20 49 6e 69 74 20 45 58 49 53 54 53  , "# Init EXISTS
bda0: 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
bdb0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
bdc0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 53 65 6c  3ExprDelete(pSel
bdd0: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
bde0: 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSel->pLimit = 
bdf0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
be00: 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f  NTEGER, 0, 0, &o
be10: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ne);.      if( s
be20: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
be30: 72 73 65 2c 20 70 53 65 6c 2c 20 73 6f 70 2c 20  rse, pSel, sop, 
be40: 69 4d 65 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30  iMem, 0, 0, 0, 0
be50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
be60: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
be70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
be80: 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41    }..  if( testA
be90: 64 64 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ddr ){.    sqlit
bea0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
beb0: 2c 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20 7d  , testAddr);.  }
bec0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e  .  return;.}.#en
bed0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
bee0: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
bef0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
bf00: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
bf10: 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
bf20: 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
bf30: 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
bf40: 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74 61  .n-1] on the sta
bf50: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
bf60: 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56  id codeInteger(V
bf70: 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
bf80: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
bf90: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 73 71   int i;.  if( sq
bfa0: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 2c  lite3GetInt32(z,
bfb0: 20 26 69 29 20 29 7b 0a 20 20 20 20 73 71 6c 69   &i) ){.    sqli
bfc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bfd0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
bfe0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
bff0: 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42 69  qlite3FitsIn64Bi
c000: 74 73 28 7a 29 20 29 7b 0a 20 20 20 20 73 71 6c  ts(z) ){.    sql
c010: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
c020: 50 5f 49 6e 74 36 34 2c 20 30 2c 20 30 2c 20 7a  P_Int64, 0, 0, z
c030: 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , n);.  }else{. 
c040: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
c050: 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  3(v, OP_Real, 0,
c060: 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 7d   0, z, n);.  }.}
c070: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
c080: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
c090: 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
c0a0: 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
c0b0: 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
c0c0: 62 20 61 6e 64 20 70 75 73 68 20 74 68 61 74 20  b and push that 
c0d0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 6e 20  column value on 
c0e0: 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65 72  the stack.  Ther
c0f0: 65 0a 2a 2a 20 69 73 20 61 6e 20 6f 70 65 6e 20  e.** is an open 
c100: 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69  cursor to pTab i
c110: 6e 20 69 54 61 62 6c 65 2e 20 20 49 66 20 69 43  n iTable.  If iC
c120: 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 0a 2a 2a 20  olumn<0 then.** 
c130: 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
c140: 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20  d that extracts 
c150: 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f  the rowid..*/.vo
c160: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
c170: 64 65 47 65 74 43 6f 6c 75 6d 6e 28 56 64 62 65  deGetColumn(Vdbe
c180: 20 2a 76 2c 20 54 61 62 6c 65 20 2a 70 54 61 62   *v, Table *pTab
c190: 2c 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 69  , int iColumn, i
c1a0: 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 66  nt iTable){.  if
c1b0: 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ( iColumn<0 ){. 
c1c0: 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 54 61     int op = (pTa
c1d0: 62 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  b && IsVirtual(p
c1e0: 54 61 62 29 29 20 3f 20 4f 50 5f 56 52 6f 77 69  Tab)) ? OP_VRowi
c1f0: 64 20 3a 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20  d : OP_Rowid;.  
c200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c210: 4f 70 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65  Op(v, op, iTable
c220: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  , 0);.  }else if
c230: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
c240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c250: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
c260: 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 29  iTable, iColumn)
c270: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
c280: 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61  nt op = IsVirtua
c290: 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f  l(pTab) ? OP_VCo
c2a0: 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e  lumn : OP_Column
c2b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c2c0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 54  eAddOp(v, op, iT
c2d0: 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a  able, iColumn);.
c2e0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
c2f0: 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
c300: 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e  , iColumn);.#ifn
c310: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c320: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
c330: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f     if( pTab->aCo
c340: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
c350: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
c360: 52 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71  REAL ){.      sq
c370: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c380: 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
c390: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  y, 0, 0);.    }.
c3a0: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
c3b0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
c3c0: 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
c3d0: 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
c3e0: 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
c3f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
c400: 6c 65 61 76 65 20 74 68 65 20 72 65 73 75 6c 74  leave the result
c410: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 73   on the top of s
c420: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tack..**.** This
c430: 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
c440: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
c450: 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
c460: 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
c470: 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
c480: 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
c490: 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
c4a0: 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
c4b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
c4c0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
c4d0: 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
c4e0: 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
c4f0: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
c500: 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
c510: 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
c520: 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
c530: 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
c540: 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
c550: 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
c560: 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
c570: 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
c580: 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
c590: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c5a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
c5b0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56  xpr *pExpr){.  V
c5c0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c5d0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
c5e0: 3b 0a 20 20 69 6e 74 20 73 74 61 63 6b 43 68 6e  ;.  int stackChn
c5f0: 67 20 3d 20 31 3b 20 20 20 20 2f 2a 20 41 6d 6f  g = 1;    /* Amo
c600: 75 6e 74 20 6f 66 20 63 68 61 6e 67 65 20 74 6f  unt of change to
c610: 20 73 74 61 63 6b 20 64 65 70 74 68 20 2a 2f 0a   stack depth */.
c620: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
c630: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
c640: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
c650: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c660: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
c670: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c680: 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
c690: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
c6a0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
c6b0: 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
c6c0: 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
c6d0: 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
c6e0: 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
c6f0: 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
c700: 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
c710: 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
c720: 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
c730: 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
c740: 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
c750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c760: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
c770: 20 70 43 6f 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b   pCol->iMem, 0);
c780: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
c790: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c7a0: 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
c7b0: 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
c7c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c7d0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
c7e0: 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74  , pAggInfo->sort
c7f0: 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20  ingIdx,.        
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
c820: 74 65 72 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  terColumn);.    
c830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c840: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65   }.      /* Othe
c850: 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75  rwise, fall thru
c860: 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c   into the TK_COL
c870: 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  UMN case */.    
c880: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
c890: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
c8a0: 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c  ( pExpr->iTable<
c8b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
c8c0: 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
c8d0: 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68  s when coding ch
c8e0: 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  eck constraints 
c8f0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
c900: 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  t( pParse->ckOff
c910: 73 65 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  set>0 );.       
c920: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c930: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 70 50 61  p(v, OP_Dup, pPa
c940: 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 2d 70 45  rse->ckOffset-pE
c950: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 2c 20  xpr->iColumn-1, 
c960: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
c970: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c980: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
c990: 6e 28 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  n(v, pExpr->pTab
c9a0: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
c9b0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
c9c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c9d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c9e0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
c9f0: 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
ca00: 74 65 67 65 72 28 76 2c 20 28 63 68 61 72 2a 29  teger(v, (char*)
ca10: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
ca20: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
ca30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ca40: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ca50: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
ca60: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
ca70: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 46 4c     assert( TK_FL
ca80: 4f 41 54 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a  OAT==OP_Real );.
ca90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
caa0: 5f 53 54 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69  _STRING==OP_Stri
cab0: 6e 67 38 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ng8 );.      sql
cac0: 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28  ite3DequoteExpr(
cad0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
cae0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
caf0: 6f 70 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a  op, 0, 0, (char*
cb00: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
cb10: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
cb20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
cb30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
cb40: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
cb50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cb60: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
cb70: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
cb80: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
cb90: 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
cba0: 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
cbb0: 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
cbc0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
cbd0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
cbe0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 4c     assert( TK_BL
cbf0: 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c 6f 62 20 29  OB==OP_HexBlob )
cc00: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 78 70  ;.      n = pExp
cc10: 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a  r->token.n - 3;.
cc20: 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a        z = (char*
cc30: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20  )pExpr->token.z 
cc40: 2b 20 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72  + 2;.      asser
cc50: 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 20  t( n>=0 );.     
cc60: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
cc70: 20 20 20 20 20 7a 20 3d 20 22 22 3b 0a 20 20 20       z = "";.   
cc80: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
cc90: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c  e3VdbeOp3(v, op,
cca0: 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20   0, 0, z, n);.  
ccb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ccc0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
ccd0: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
cce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ccf0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 61 72  eAddOp(v, OP_Var
cd00: 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54  iable, pExpr->iT
cd10: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
cd20: 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
cd30: 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  .n>1 ){.        
cd40: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
cd50: 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
cd60: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
cd70: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
cd80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
cd90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
cda0: 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
cdb0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
cdc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cdd0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70  OP_MemLoad, pExp
cde0: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
cdf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ce00: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
ce10: 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
ce20: 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
ce30: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
ce40: 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
ce50: 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
ce60: 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
ce70: 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b   int aff, to_op;
ce80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
ce90: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
cea0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
ceb0: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
cec0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70  3AffinityType(&p
ced0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  Expr->token);.  
cee0: 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20      to_op = aff 
cef0: 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  - SQLITE_AFF_TEX
cf00: 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20  T + OP_ToText;. 
cf10: 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
cf20: 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20  op==OP_ToText   
cf30: 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
cf40: 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20  AFF_TEXT    );. 
cf50: 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
cf60: 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20  op==OP_ToBlob   
cf70: 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
cf80: 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20  AFF_NONE    );. 
cf90: 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
cfa0: 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63  op==OP_ToNumeric
cfb0: 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
cfc0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
cfd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
cfe0: 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20  op==OP_ToInt    
cff0: 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
d000: 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
d010: 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
d020: 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20  op==OP_ToReal   
d030: 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
d040: 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20  AFF_REAL    );. 
d050: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d060: 41 64 64 4f 70 28 76 2c 20 74 6f 5f 6f 70 2c 20  AddOp(v, to_op, 
d070: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61  0, 0);.      sta
d080: 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ckChng = 0;.    
d090: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
d0a0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d0b0: 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
d0c0: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
d0d0: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
d0e0: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
d0f0: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
d100: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
d110: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
d120: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
d130: 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
d140: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
d150: 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
d160: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
d170: 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
d180: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
d190: 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
d1a0: 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
d1b0: 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
d1c0: 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
d1d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d1e0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
d1f0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
d200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d210: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
d220: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
d230: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
d240: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
d250: 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
d260: 67 68 74 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  ght, op, 0, 0);.
d270: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
d280: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  = -1;.      brea
d290: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d2a0: 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
d2b0: 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
d2c0: 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
d2d0: 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
d2e0: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
d2f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
d300: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
d310: 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
d320: 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
d330: 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
d340: 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
d350: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
d360: 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
d370: 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
d380: 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
d390: 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20  =OP_And );.     
d3a0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d   assert( TK_OR==
d3b0: 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  OP_Or );.      a
d3c0: 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
d3d0: 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20  OP_Add );.      
d3e0: 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
d3f0: 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
d400: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
d410: 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
d420: 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  der );.      ass
d430: 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
d440: 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20  OP_BitAnd );.   
d450: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
d460: 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
d470: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
d480: 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
d490: 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  de );.      asse
d4a0: 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
d4b0: 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20  P_ShiftLeft );. 
d4c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
d4d0: 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  RSHIFT==OP_Shift
d4e0: 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61  Right );.      a
d4f0: 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
d500: 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20  ==OP_Concat );. 
d510: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d520: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
d530: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
d540: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d550: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
d560: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
d570: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d580: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
d590: 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
d5a0: 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   -1;.      break
d5b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d5c0: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
d5d0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
d5e0: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
d5f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
d600: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eft );.      if(
d610: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
d620: 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f  LOAT || pLeft->o
d630: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
d640: 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  .        Token *
d650: 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65  p = &pLeft->toke
d660: 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  n;.        char 
d670: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  *z = sqlite3MPri
d680: 6e 74 66 28 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e  ntf("-%.*s", p->
d690: 6e 2c 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  n, p->z);.      
d6a0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
d6b0: 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
d6c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d6d0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c  beOp3(v, OP_Real
d6e0: 2c 20 30 2c 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b  , 0, 0, z, p->n+
d6f0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
d700: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64  e{.          cod
d710: 65 49 6e 74 65 67 65 72 28 76 2c 20 7a 2c 20 70  eInteger(v, z, p
d720: 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ->n+1);.        
d730: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
d740: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  Free(z);.       
d750: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d760: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
d770: 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f  rough into TK_NO
d780: 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  T */.    }.    c
d790: 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
d7a0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
d7b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d7c0: 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69  TK_BITNOT==OP_Bi
d7d0: 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73  tNot );.      as
d7e0: 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
d7f0: 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 73 71  _Not );.      sq
d800: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d810: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
d820: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
d830: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
d840: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
d850: 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20  stackChng = 0;. 
d860: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d870: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
d880: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
d890: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
d8a0: 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20     int dest;.   
d8b0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
d8c0: 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
d8d0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d8e0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
d8f0: 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
d900: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d910: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
d920: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
d930: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d940: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
d950: 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20  ft);.      dest 
d960: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
d970: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
d980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d990: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
d9a0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
d9b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d9c0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
d9d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63  , 0);.      stac
d9e0: 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  kChng = 0;.     
d9f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
da00: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
da10: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
da20: 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
da30: 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
da40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
da50: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
da60: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
da70: 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
da80: 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 54  of aggregate: %T
da90: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  ",.            &
daa0: 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  pExpr->span);.  
dab0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dad0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
dae0: 64 2c 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  d, pInfo->aFunc[
daf0: 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
db00: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m, 0);.      }. 
db10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
db20: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
db30: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
db40: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
db50: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
db60: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
db70: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e  >pList;.      in
db80: 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20  t nExpr = pList 
db90: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
dba0: 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65   0;.      FuncDe
dbb0: 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69  f *pDef;.      i
dbc0: 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f  nt nId;.      co
dbd0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20  nst char *zId;. 
dbe0: 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61       int constMa
dbf0: 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  sk = 0;.      in
dc00: 74 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e  t i;.      u8 en
dc10: 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
dc20: 64 62 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  db);.      CollS
dc30: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
dc40: 20 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72       zId = (char
dc50: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
dc60: 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45  ;.      nId = pE
dc70: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  xpr->token.n;.  
dc80: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
dc90: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
dca0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
dcb0: 6e 49 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c  nId, nExpr, enc,
dcc0: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
dcd0: 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20  t( pDef!=0 );.  
dce0: 20 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69      nExpr = sqli
dcf0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
dd00: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
dd10: 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
dd20: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
dd30: 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ABLE.      /* Po
dd40: 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20  ssibly overload 
dd50: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  the function if 
dd60: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
dd70: 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  nt is.      ** a
dd80: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
dd90: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  olumn..      **.
dda0: 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66        ** For inf
ddb0: 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49  ix functions (LI
ddc0: 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50  KE, GLOB, REGEXP
ddd0: 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65  , and MATCH) use
dde0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
ddf0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e  cond argument, n
de00: 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73  ot the first, as
de10: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
de20: 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a   test to.      *
de30: 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61  * see if it is a
de40: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72   column in a vir
de50: 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69  tual table.  Thi
de60: 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73  s is done becaus
de70: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  e.      ** the l
de80: 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69  eft operand of i
de90: 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
dea0: 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77  the operand we w
deb0: 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ant to.      ** 
dec0: 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64  control overload
ded0: 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20  ing) ends up as 
dee0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
def0: 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ent to the.     
df00: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54   ** function.  T
df10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41  he expression "A
df20: 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69   glob B" is equi
df30: 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20  valent to .     
df40: 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20   ** "glob(B,A). 
df50: 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20   We want to use 
df60: 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62  the A in "A glob
df70: 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20   B" to test.    
df80: 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f    ** for functio
df90: 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20  n overloading.  
dfa0: 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42  But we use the B
dfb0: 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42   term in "glob(B
dfc0: 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ,A)"..      */. 
dfd0: 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3e 3d       if( nExpr>=
dfe0: 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61  2 && (pExpr->fla
dff0: 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e  gs & EP_InfixFun
e000: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
e010: 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
e020: 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
e030: 28 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c  (pDef, nExpr, pL
e040: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  ist->a[1].pExpr)
e050: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e060: 28 20 6e 45 78 70 72 3e 30 20 29 7b 0a 20 20 20  ( nExpr>0 ){.   
e070: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
e080: 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
e090: 75 6e 63 74 69 6f 6e 28 70 44 65 66 2c 20 6e 45  unction(pDef, nE
e0a0: 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr, pList->a[0]
e0b0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
e0c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
e0d0: 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26  r(i=0; i<nExpr &
e0e0: 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20  & i<32; i++){.  
e0f0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
e100: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
e110: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
e120: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
e130: 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c  constMask |= (1<
e140: 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <i);.        }. 
e150: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d         if( pDef-
e160: 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26 20  >needCollSeq && 
e170: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
e180: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
e190: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
e1a0: 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
e1b0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
e1c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e1d0: 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65     if( pDef->nee
e1e0: 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
e1f0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
e200: 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
e210: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20  >db->pDfltColl; 
e220: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e230: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
e240: 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68  llSeq, 0, 0, (ch
e250: 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43  ar *)pColl, P3_C
e260: 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
e270: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e280: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63  beOp3(v, OP_Func
e290: 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c  tion, constMask,
e2a0: 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29 70   nExpr, (char*)p
e2b0: 44 65 66 2c 20 50 33 5f 46 55 4e 43 44 45 46 29  Def, P3_FUNCDEF)
e2c0: 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e  ;.      stackChn
e2d0: 67 20 3d 20 31 2d 6e 45 78 70 72 3b 0a 20 20 20  g = 1-nExpr;.   
e2e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e2f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e300: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
e310: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
e320: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
e330: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ECT: {.      if(
e340: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
e350: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
e360: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
e370: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
e380: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e390: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e3a0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
e3b0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
e3c0: 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   0);.      VdbeC
e3d0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6c 6f  omment((v, "# lo
e3e0: 61 64 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ad subquery resu
e3f0: 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 62 72 65  lt"));.      bre
e400: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e410: 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
e420: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
e430: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
e440: 0a 20 20 20 20 20 20 69 6e 74 20 63 6b 4f 66 66  .      int ckOff
e450: 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b  set = pParse->ck
e460: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 73 71  Offset;.      sq
e470: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
e480: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
e490: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67  );..      /* Fig
e4a0: 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69  ure out the affi
e4b0: 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63  nity to use to c
e4c0: 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d  reate a key from
e4d0: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
e4e0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70     ** of the exp
e4f0: 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74  ression. affinit
e500: 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74  yStr stores a st
e510: 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74  atic string suit
e520: 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a  able for.      *
e530: 2a 20 50 33 20 6f 66 20 4f 50 5f 4d 61 6b 65 52  * P3 of OP_MakeR
e540: 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ecord..      */.
e550: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
e560: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
e570: 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 20  ity(pExpr);..   
e580: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e590: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
e5a0: 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 1, 0);.      
e5b0: 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
e5c0: 20 3d 20 63 6b 4f 66 66 73 65 74 2b 31 3b 0a 0a   = ckOffset+1;..
e5d0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
e5e0: 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c  e <expr> from "<
e5f0: 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e  expr> IN (...)".
e600: 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   The temporary t
e610: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45  able.      ** pE
e620: 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74  xpr->iTable cont
e630: 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20  ains the values 
e640: 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
e650: 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20   (...) set..    
e660: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
e670: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e680: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
e690: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
e6a0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
e6b0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
e6c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e6d0: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
e6e0: 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20 20 20 20  -1, addr+4);    
e6f0: 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20          /* addr 
e700: 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  + 0 */.      sql
e710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e720: 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a   OP_Pop, 2, 0);.
e730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e740: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
e750: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 0, 0);.      
e760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e770: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
e780: 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73  addr+7);.      s
e790: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
e7a0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
e7b0: 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c  1, 0, &affinity,
e7c0: 20 31 29 3b 20 20 20 2f 2a 20 61 64 64 72 20 2b   1);   /* addr +
e7d0: 20 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69   4 */.      sqli
e7e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e7f0: 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
e800: 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37 29  >iTable, addr+7)
e810: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e820: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
e830: 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20  ddImm, -1, 0);  
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a  /* addr + 6 */..
e860: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e870: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
e880: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
e890: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
e8a0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
e8b0: 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
e8c0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
e8d0: 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70  LItem = pExpr->p
e8e0: 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45  List->a;.      E
e8f0: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c  xpr *pRight = pL
e900: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
e910: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e920: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
e930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e940: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e950: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
e960: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e970: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
e980: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
e990: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
e9a0: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47  ft, pRight, OP_G
e9b0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
e9c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e9d0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
e9e0: 30 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d  0);.      pLItem
e9f0: 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  ++;.      pRight
ea00: 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
ea10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
ea20: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
ea30: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
ea40: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
ea50: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
ea60: 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a  , OP_Le, 0, 0);.
ea70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ea80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64  eAddOp(v, OP_And
ea90: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
eaa0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
eab0: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20  case TK_UPLUS:. 
eac0: 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
ead0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
eae0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
eaf0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
eb00: 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
eb10: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
eb20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
eb30: 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  K_CASE: {.      
eb40: 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62  int expr_end_lab
eb50: 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75  el;.      int ju
eb60: 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e  mpInst;.      in
eb70: 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  t nExpr;.      i
eb80: 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72  nt i;.      Expr
eb90: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
eba0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
ebb0: 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65  ist_item *aListe
ebc0: 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  lem;..      asse
ebd0: 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  rt(pExpr->pList)
ebe0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28  ;.      assert((
ebf0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
ec00: 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a  xpr % 2) == 0);.
ec10: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
ec20: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
ec30: 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
ec40: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
ec50: 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
ec60: 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
ec70: 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
ec80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
ec90: 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62      expr_end_lab
eca0: 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
ecb0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
ecc0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
ecd0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
ece0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
ecf0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ed00: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Left);.      }. 
ed10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ed20: 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
ed30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
ed40: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
ed50: 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
ed60: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
ed70: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
ed80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ed90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
eda0: 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20 20  _Dup, 1, 1);.   
edb0: 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20         jumpInst 
edc0: 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50  = codeCompare(pP
edd0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ede0: 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  ft, aListelem[i]
edf0: 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  .pExpr,.        
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c 20           OP_Ne, 
ee20: 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 1);.         
ee30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ee40: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
ee50: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
ee60: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d  e{.          jum
ee70: 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56  pInst = sqlite3V
ee80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
ee90: 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  fNot, 1, 0);.   
eea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
eeb0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
eec0: 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
eed0: 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  [i+1].pExpr);.  
eee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
eef0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
ef00: 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c  o, 0, expr_end_l
ef10: 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
ef20: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ef30: 72 65 28 76 2c 20 6a 75 6d 70 49 6e 73 74 29 3b  re(v, jumpInst);
ef40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ef50: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
ef60: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ef70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ef80: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
ef90: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
efa0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
efb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
efc0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
efd0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
efe0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
eff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f000: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
f010: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 0, 0);.      
f020: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
f030: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
f040: 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65  v, expr_end_labe
f050: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
f060: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
f070: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
f080: 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
f090: 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  AISE: {.      if
f0a0: 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53  ( !pParse->trigS
f0b0: 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  tack ){.        
f0c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f0d0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
f0f0: 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
f100: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
f110: 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
f120: 6d 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  m");..return;.  
f130: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f140: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
f150: 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
f160: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
f170: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45  xpr->iColumn==OE
f180: 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20  _Rollback ||.   
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
f1a0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
f1b0: 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20  OE_Abort ||.    
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
f1d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
f1e0: 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20  E_Fail );.      
f1f0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
f200: 65 45 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20  eExpr(pExpr);.  
f210: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f220: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74  beOp3(v, OP_Halt
f230: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
f240: 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  INT, pExpr->iCol
f250: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
f270: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
f280: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
f290: 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  .n);.      } els
f2a0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73  e {.         ass
f2b0: 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
f2c0: 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65  umn == OE_Ignore
f2d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   );.         sql
f2e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f2f0: 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20   OP_ContextPop, 
f300: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
f310: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f320: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
f330: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
f340: 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a  k->ignoreJump);.
f350: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
f360: 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 61 69 73  ment((v, "# rais
f370: 65 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20  e(IGNORE)"));.  
f380: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 63      }.      stac
f390: 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  kChng = 0;.     
f3a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
f3b0: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
f3c0: 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
f3d0: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
f3e0: 63 6b 4f 66 66 73 65 74 20 2b 3d 20 73 74 61 63  ckOffset += stac
f3f0: 6b 43 68 6e 67 3b 0a 20 20 20 20 61 73 73 65 72  kChng;.    asser
f400: 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  t( pParse->ckOff
f410: 73 65 74 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  set );.  }.}..#i
f420: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f430: 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20  T_TRIGGER./*.** 
f440: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
f450: 61 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20  at evalutes the 
f460: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
f470: 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68 65 20   and leaves the 
f480: 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65  result.** on the
f490: 20 73 74 61 63 6b 2e 20 20 53 65 65 20 61 6c 73   stack.  See als
f4a0: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
f4b0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  e()..**.** This 
f4c0: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c  routine might al
f4d0: 73 6f 20 63 61 63 68 65 20 74 68 65 20 72 65 73  so cache the res
f4e0: 75 6c 74 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  ult and modify t
f4f0: 68 65 20 70 45 78 70 72 20 74 72 65 65 0a 2a 2a  he pExpr tree.**
f500: 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
f510: 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 74 68 65   make use of the
f520: 20 63 61 63 68 65 64 20 72 65 73 75 6c 74 20 6f   cached result o
f530: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 65 76 61  n subsequent eva
f540: 6c 75 61 74 69 6f 6e 73 0a 2a 2a 20 72 61 74 68  luations.** rath
f550: 65 72 20 74 68 61 6e 20 65 76 61 6c 75 61 74 65  er than evaluate
f560: 20 74 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65   the whole expre
f570: 73 73 69 6f 6e 20 61 67 61 69 6e 2e 20 20 54 72  ssion again.  Tr
f580: 69 76 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ivial expression
f590: 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 63 61 63  s are.** not cac
f5a0: 68 65 64 2e 20 20 49 66 20 74 68 65 20 65 78 70  hed.  If the exp
f5b0: 72 65 73 73 69 6f 6e 20 69 73 20 63 61 63 68 65  ression is cache
f5c0: 64 2c 20 69 74 73 20 72 65 73 75 6c 74 20 69 73  d, its result is
f5d0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 0a 2a 2a   stored in a .**
f5e0: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
f5f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f600: 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
f610: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
f620: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
f630: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
f640: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
f650: 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 61 64 64 72  iMem;.  int addr
f660: 31 2c 20 61 64 64 72 32 3b 0a 20 20 69 66 28 20  1, addr2;.  if( 
f670: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
f680: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
f690: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
f6a0: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  v);.  sqlite3Exp
f6b0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
f6c0: 78 70 72 29 3b 0a 20 20 61 64 64 72 32 20 3d 20  xpr);.  addr2 = 
f6d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
f6e0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
f6f0: 20 61 64 64 72 32 3e 61 64 64 72 31 2b 31 20 7c   addr2>addr1+1 |
f700: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  | sqlite3VdbeGet
f710: 4f 70 28 76 2c 20 61 64 64 72 31 29 2d 3e 6f 70  Op(v, addr1)->op
f720: 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f  code==OP_Functio
f730: 6e 20 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20  n ){.    iMem = 
f740: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
f750: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
f760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f770: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
f780: 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20  ore, iMem, 0);. 
f790: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
f7a0: 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a  K_REGISTER;.  }.
f7b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f7c0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
f7d0: 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
f7e0: 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
f7f0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
f800: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
f810: 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74  list onto the st
f820: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ack..**.** Retur
f830: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
f840: 65 6c 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20  elements pushed 
f850: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
f860: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
f870: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
f880: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f890: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
f8a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
f8b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20  rList *pList    
f8c0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
f8d0: 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
f8e0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ed */.){.  struc
f8f0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
f900: 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
f910: 20 6e 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   n;.  if( pList=
f920: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
f930: 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   n = pList->nExp
f940: 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  r;.  for(pItem=p
f950: 4c 69 73 74 2d 3e 61 2c 20 69 3d 6e 3b 20 69 3e  List->a, i=n; i>
f960: 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
f970: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
f980: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49  rCode(pParse, pI
f990: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d  tem->pExpr);.  }
f9a0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
f9b0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
f9c0: 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
f9d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
f9e0: 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
f9f0: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
fa00: 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
fa10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
fa20: 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
fa30: 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
fa40: 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
fa50: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
fa60: 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
fa70: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
fa80: 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
fa90: 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
faa0: 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
fab0: 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
fac0: 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
fad0: 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
fae0: 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  true..**.** This
faf0: 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
fb00: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
fb10: 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
fb20: 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
fb30: 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
fb40: 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
fb50: 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
fb60: 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
fb70: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
fb80: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
fb90: 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
fba0: 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
fbb0: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
fbc0: 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
fbd0: 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
fbe0: 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
fbf0: 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
fc00: 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
fc10: 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
fc20: 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
fc30: 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
fc40: 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
fc50: 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
fc60: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
fc70: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
fc80: 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
fc90: 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
fca0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
fcb0: 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
fcc0: 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66 73 65 74  ;.  int ckOffset
fcd0: 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66   = pParse->ckOff
fce0: 73 65 74 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  set;.  if( v==0 
fcf0: 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  || pExpr==0 ) re
fd00: 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78  turn;.  op = pEx
fd10: 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
fd20: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
fd30: 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
fd40: 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
fd50: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
fd60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fd70: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
fd80: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
fd90: 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  , d2, !jumpIfNul
fda0: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
fdb0: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
fdc0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
fdd0: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
fde0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
fdf0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
fe00: 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
fe10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fe20: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
fe30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
fe40: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
fe50: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
fe60: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
fe70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
fe80: 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
fe90: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
fea0: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
feb0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
fec0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fed0: 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
fee0: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
fef0: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
ff00: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
ff10: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
ff20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ff30: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
ff40: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
ff50: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
ff60: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
ff70: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
ff80: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
ff90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
ffa0: 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
ffb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
ffc0: 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
ffd0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
ffe0: 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
fff0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
10000 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
10010 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
10020 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
10030 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
10040 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e );.      sqlit
10050 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10060 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
10070 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10080 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
10090 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
100a0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
100b0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
100c0 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
100d0 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c  Right, op, dest,
100e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
100f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10100 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
10110 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
10120 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
10130 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
10140 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
10150 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10160 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
10170 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
10180 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
10190 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
101a0 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
101b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
101c0 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20   op, 1, dest);. 
101d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
101e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
101f0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  TWEEN: {.      /
10200 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
10210 20 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e   "x BETWEEN y AN
10220 44 20 7a 22 20 69 73 20 69 6d 70 6c 65 6d 65 6e  D z" is implemen
10230 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a  ted as:.      **
10240 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28  .      ** 1 IF (
10250 78 20 3c 20 79 29 20 47 4f 54 4f 20 33 0a 20 20  x < y) GOTO 3.  
10260 20 20 20 20 2a 2a 20 32 20 49 46 20 28 78 20 3c      ** 2 IF (x <
10270 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e  = z) GOTO <dest>
10280 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a  .      ** 3 ....
10290 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
102a0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45  nt addr;.      E
102b0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
102c0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
102d0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
102e0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
102f0 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
10300 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
10310 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
10320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10330 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
10340 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
10350 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10360 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
10370 20 20 20 20 20 20 61 64 64 72 20 3d 20 63 6f 64        addr = cod
10380 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
10390 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
103a0 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d 70 49  OP_Lt, 0, !jumpI
103b0 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 70  fNull);..      p
103c0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
103d0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
103e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
103f0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
10400 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
10410 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
10420 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
10430 2c 20 4f 50 5f 4c 65 2c 20 64 65 73 74 2c 20 6a  , OP_Le, dest, j
10440 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20  umpIfNull);..   
10450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10460 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
10470 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
10480 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10490 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
104a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
104b0 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
104c0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
104d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
104e0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
104f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10500 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
10510 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10520 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
10530 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74  jumpIfNull, dest
10540 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10550 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
10560 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63  se->ckOffset = c
10570 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  kOffset;.}../*.*
10580 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
10590 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
105a0 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
105b0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
105c0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
105d0 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
105e0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
105f0 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
10600 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
10610 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
10620 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
10630 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
10640 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10650 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
10660 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
10670 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
10680 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
10690 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 20 6f 72  fNull is true or
106a0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66   fall through if
106b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66   jumpIfNull is f
106c0 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  alse..*/.void sq
106d0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
106e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
106f0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
10700 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
10710 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
10720 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
10730 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
10740 0a 20 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20  .  int ckOffset 
10750 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73  = pParse->ckOffs
10760 65 74 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c  et;.  if( v==0 |
10770 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  | pExpr==0 ) ret
10780 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76  urn;..  /* The v
10790 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f  alue of pExpr->o
107a0 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c  p and op are rel
107b0 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
107c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
107d0 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
107e0 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20        op.  **   
107f0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20      ---------   
10800 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
10810 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  -.  **       TK_
10820 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20  ISNULL          
10830 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20  OP_NotNull.  ** 
10840 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c        TK_NOTNULL
10850 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75           OP_IsNu
10860 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
10870 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _NE             
10880 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20   OP_Eq.  **     
10890 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20    TK_EQ         
108a0 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20       OP_Ne.  ** 
108b0 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20        TK_GT     
108c0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20           OP_Le. 
108d0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20   **       TK_LE 
108e0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
108f0 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Gt.  **       TK
10900 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _GE             
10910 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Lt.  **     
10920 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20    TK_LT         
10930 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a       OP_Ge.  **.
10940 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76    ** For other v
10950 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e  alues of pExpr->
10960 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69  op, op is undefi
10970 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a  ned and unused..
10980 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    ** The value o
10990 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
109a0 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61  nstants are arra
109b0 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77  nged such that w
109c0 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75  e.  ** can compu
109d0 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61  te the mapping a
109e0 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66  bove using the f
109f0 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
10a00 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74  ion..  ** Assert
10a10 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20  ()s verify that 
10a20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
10a30 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f  is correct..  */
10a40 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d  .  op = ((pExpr-
10a50 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  >op+(TK_ISNULL&1
10a60 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c  ))^1)-(TK_ISNULL
10a70 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  &1);..  /* Verif
10a80 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d  y correct alignm
10a90 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  ent of TK_ and O
10aa0 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a  P_ constants.  *
10ab0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  /.  assert( pExp
10ac0 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  r->op!=TK_ISNULL
10ad0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75   || op==OP_NotNu
10ae0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
10af0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f  pExpr->op!=TK_NO
10b00 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TNULL || op==OP_
10b10 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  IsNull );.  asse
10b20 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
10b30 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45  K_NE || op==OP_E
10b40 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  q );.  assert( p
10b50 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
10b60 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  || op==OP_Ne );.
10b70 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
10b80 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70  >op!=TK_LT || op
10b90 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ge );.  ass
10ba0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
10bb0 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LE || op==OP_
10bc0 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Gt );.  assert( 
10bd0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54  pExpr->op!=TK_GT
10be0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b   || op==OP_Le );
10bf0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
10c00 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f  ->op!=TK_GE || o
10c10 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73  p==OP_Lt );..  s
10c20 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
10c30 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
10c40 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AND: {.      sql
10c50 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
10c60 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
10c70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
10c80 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
10c90 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
10ca0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
10cb0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
10cc0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
10cd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10ce0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
10cf0 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
10d00 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
10d10 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
10d20 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
10d30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10d40 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70  pLeft, d2, !jump
10d50 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
10d60 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
10d70 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
10d80 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
10d90 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
10da0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
10db0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
10dc0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10dd0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
10de0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  _NOT: {.      sq
10df0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
10e00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
10e10 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
10e20 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
10e30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10e40 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
10e50 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
10e60 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
10e70 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
10e80 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
10e90 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
10ea0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10eb0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
10ec0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
10ed0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10ee0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10ef0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
10f00 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
10f10 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10f20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
10f30 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  op, dest, jumpIf
10f40 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
10f50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10f60 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
10f70 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
10f80 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
10f90 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10fa0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
10fb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10fc0 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
10fd0 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
10fe0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10ff0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
11000 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
11010 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 22   expression is "
11020 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
11030 7a 22 2e 20 49 74 20 69 73 20 69 6d 70 6c 65 6d  z". It is implem
11040 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20  ented as:.      
11050 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46  **.      ** 1 IF
11060 20 28 78 20 3e 3d 20 79 29 20 47 4f 54 4f 20 33   (x >= y) GOTO 3
11070 0a 20 20 20 20 20 20 2a 2a 20 32 20 47 4f 54 4f  .      ** 2 GOTO
11080 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a   <dest>.      **
11090 20 33 20 49 46 20 28 78 20 3e 20 7a 29 20 47 4f   3 IF (x > z) GO
110a0 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20  TO <dest>.      
110b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
110c0 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  r;.      Expr *p
110d0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
110e0 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
110f0 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
11100 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
11110 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
11120 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
11130 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  , pLeft);.      
11140 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11150 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
11160 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11170 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
11180 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
11190 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
111a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
111b0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
111c0 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
111d0 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65  t, pRight, OP_Ge
111e0 2c 20 61 64 64 72 2b 33 2c 20 21 6a 75 6d 70 49  , addr+3, !jumpI
111f0 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73  fNull);..      s
11200 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11210 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
11220 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11230 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
11240 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20  oto, 0, dest);. 
11250 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
11260 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
11270 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  .pExpr;.      sq
11280 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
11290 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
112a0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
112b0 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
112c0 70 52 69 67 68 74 2c 20 4f 50 5f 47 74 2c 20 64  pRight, OP_Gt, d
112d0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
112e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
112f0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
11300 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
11310 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
11320 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
11330 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11340 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75  (v, OP_IfNot, ju
11350 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b  mpIfNull, dest);
11360 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11370 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65    }.  }.  pParse
11380 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f  ->ckOffset = ckO
11390 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
113a0 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72  Do a deep compar
113b0 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72  ison of two expr
113c0 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52  ession trees.  R
113d0 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d  eturn TRUE (non-
113e0 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79  zero).** if they
113f0 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
11400 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20  nd return FALSE 
11410 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
11420 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
11430 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20   Sometimes this 
11440 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
11450 75 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20 69  urn FALSE even i
11460 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
11470 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
11480 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
11490 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
114a0 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
114b0 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
114c0 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
114d0 74 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74 20  turn FALSE just 
114e0 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
114f0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
11500 2a 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ** returns false
11510 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
11520 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
11530 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
11540 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
11550 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
11560 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
11570 74 20 61 20 54 52 55 45 20 72 65 74 75 72 6e 2c  t a TRUE return,
11580 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e   then you.** can
11590 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70   be sure the exp
115a0 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
115b0 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70   same.  In the p
115c0 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74  laces where.** t
115d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
115e0 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  sed, it does not
115f0 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20   hurt to get an 
11600 65 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74 68  extra FALSE - th
11610 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
11620 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
11630 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
11640 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
11650 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
11660 72 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64 20  rect TRUE could 
11670 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
11680 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
11690 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
116a0 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
116b0 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *pB){.  int i;. 
116c0 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d   if( pA==0||pB==
116d0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
116e0 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66  pB==pA;.  }.  if
116f0 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
11700 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
11710 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
11720 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
11730 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
11740 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
11750 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
11760 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
11770 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65  ->pLeft, pB->pLe
11780 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ft) ) return 0;.
11790 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
117a0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
117b0 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
117c0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
117d0 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b  if( pA->pList ){
117e0 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69  .    if( pB->pLi
117f0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
11800 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c  ;.    if( pA->pL
11810 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e  ist->nExpr!=pB->
11820 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72  pList->nExpr ) r
11830 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72  eturn 0;.    for
11840 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73  (i=0; i<pA->pLis
11850 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
11860 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
11870 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
11880 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
11890 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr, pB->pList->
118a0 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
118b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
118c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
118d0 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70   }else if( pB->p
118e0 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  List ){.    retu
118f0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
11900 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70  pA->pSelect || p
11910 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74  B->pSelect ) ret
11920 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
11930 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
11940 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75  ble || pA->iColu
11950 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
11960 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
11970 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  ( pA->op!=TK_COL
11980 55 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e  UMN && pA->token
11990 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  .z ){.    if( pB
119a0 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72  ->token.z==0 ) r
119b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
119c0 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41   pB->token.n!=pA
119d0 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75  ->token.n ) retu
119e0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 0;.    if( sq
119f0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
11a00 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a  har*)pA->token.z
11a10 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65  ,(char*)pB->toke
11a20 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29  n.z,pB->token.n)
11a30 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
11a40 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
11a50 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
11a60 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
11a70 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
11a80 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
11a90 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
11aa0 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
11ab0 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
11ac0 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
11ad0 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
11ae0 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
11af0 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
11b00 49 6e 66 6f 43 6f 6c 75 6d 6e 28 41 67 67 49 6e  InfoColumn(AggIn
11b10 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
11b20 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43  t i;.  pInfo->aC
11b30 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  ol = sqlite3Arra
11b40 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
11b50 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20    pInfo->aCol,. 
11b60 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
11b70 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20  fo->aCol[0]),.  
11b80 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26       3,.       &
11b90 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
11ba0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
11bb0 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20  ColumnAlloc,.   
11bc0 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
11bd0 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
11be0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
11bf0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
11c00 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
11c10 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
11c20 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
11c30 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
11c40 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
11c50 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
11c60 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
11c70 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
11c80 6e 66 6f 46 75 6e 63 28 41 67 67 49 6e 66 6f 20  nfoFunc(AggInfo 
11c90 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
11ca0 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
11cb0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
11cc0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
11cd0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
11ce0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
11cf0 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
11d00 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26       3,.       &
11d10 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
11d20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
11d30 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20  ncAlloc,.       
11d40 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
11d50 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
11d60 20 54 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e   This is an xFun
11d70 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
11d80 65 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70  ee() used to imp
11d90 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74  lement .** sqlit
11da0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
11db0 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
11dc0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
11dd0 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
11de0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
11df0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
11e00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
11e10 6e 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72  nalyzes the aggr
11e20 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61  egate function a
11e30 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74  t pExpr..*/.stat
11e40 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
11e50 67 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41  gregate(void *pA
11e60 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  rg, Expr *pExpr)
11e70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
11e80 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
11e90 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29 70  (NameContext *)p
11ea0 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Arg;.  Parse *pP
11eb0 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
11ec0 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
11ed0 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
11ee0 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
11ef0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
11f00 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  NC->pAggInfo;.  
11f10 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
11f20 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
11f30 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
11f40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
11f50 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
11f60 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
11f70 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
11f80 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
11f90 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
11fa0 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
11fb0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
11fc0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
11fd0 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
11fe0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
11ff0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
12000 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
12010 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
12020 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
12030 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
12040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
12050 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
12060 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
12070 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
12080 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
12090 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
120a0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
120b0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
120c0 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
120d0 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
120e0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
120f0 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
12100 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
12110 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
12120 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
12130 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
12140 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
12150 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
12160 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
12170 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
12180 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
12190 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
121a0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
121b0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
121c0 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
121d0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
121e0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
121f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
12200 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
12210 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
12220 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
12230 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
12240 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
12250 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
12270 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
12280 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
122a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
122b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
122c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
122d0 66 28 20 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( k>=pAggInfo->
122e0 6e 43 6f 6c 75 6d 6e 20 26 26 20 28 6b 20 3d 20  nColumn && (k = 
122f0 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
12300 28 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 29  (pAggInfo))>=0 )
12310 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12320 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
12330 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20  ->aCol[k];.     
12340 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
12350 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
12360 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
12370 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
12380 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
123a0 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
123b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
123c0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
123d0 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
123e0 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nMem++;.        
123f0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
12400 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
12420 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
12430 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
12440 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
12450 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
12460 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
12470 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
12480 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
12490 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
124a0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
124b0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
124c0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
124d0 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
124f0 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
12510 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
12520 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
12540 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
12550 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
12560 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
12570 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
12580 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
12590 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125b0 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
125c0 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
125d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
125e0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
125f0 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
12600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12610 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12640 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
12650 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
12660 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
12670 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
12690 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
126a0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
126b0 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
126d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
126e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
126f0 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
12700 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
12710 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
12720 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
12730 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
12740 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
12750 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
12760 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
12770 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
12780 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
12790 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
127a0 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
127b0 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
127c0 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
127d0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
127e0 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
127f0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  /.            pE
12800 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
12810 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
12820 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
12830 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b  = TK_AGG_COLUMN;
12840 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
12850 70 72 2d 3e 69 41 67 67 20 3d 20 6b 3b 0a 20 20  pr->iAgg = k;.  
12860 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
12870 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  .          } /* 
12880 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61  endif pExpr->iTa
12890 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
128a0 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  sor */.        }
128b0 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* end loop ove
128c0 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  r pSrcList */.  
128d0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
128e0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
128f0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
12900 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  TION: {.      /*
12910 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68   The pNC->nDepth
12920 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65 73 20  ==0 test causes 
12930 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
12940 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69 65  ons in subquerie
12950 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65  s.      ** to be
12960 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20   ignored */.    
12970 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74    if( pNC->nDept
12980 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h==0 ){.        
12990 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
129a0 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
129b0 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
129c0 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
129d0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
129e0 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
129f0 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
12a00 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
12a10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
12a20 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
12a30 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
12a40 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
12a50 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12a60 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
12a70 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
12a80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
12a90 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
12aa0 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70  (pItem->pExpr, p
12ab0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
12ac0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12ae0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
12af0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  =pAggInfo->nFunc
12b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
12b10 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e   pExpr is origin
12b20 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20  al.  Make a new 
12b30 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66  entry in pAggInf
12b40 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20  o->aFunc[].     
12b50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
12b60 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
12b70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
12b80 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67        i = addAgg
12b90 49 6e 66 6f 46 75 6e 63 28 70 41 67 67 49 6e 66  InfoFunc(pAggInf
12ba0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
12bb0 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i>=0 ){.      
12bc0 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
12bd0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
12be0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
12bf0 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
12c00 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
12c10 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 70   pItem->iMem = p
12c20 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
12c30 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
12c40 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->pFunc = sqlite
12c50 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
12c60 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
12c80 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
12c90 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
12ca0 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  .n,.            
12cb0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
12cc0 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69  ist ? pExpr->pLi
12cd0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
12ce0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
12cf0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
12d00 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
12d10 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
12d20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
12d30 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
12d40 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
12d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12d60 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
12d70 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
12d80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
12d90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12da0 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   }.        /* Ma
12db0 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74  ke pExpr point t
12dc0 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
12dd0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
12de0 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20  c[] entry.      
12df0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78    */.        pEx
12e00 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20  pr->iAgg = i;.  
12e10 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
12e20 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
12e30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
12e40 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
12e50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 75  }.  }..  /* Recu
12e60 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 73 75 62  rsively walk sub
12e70 71 75 65 72 69 65 73 20 6c 6f 6f 6b 69 6e 67 20  queries looking 
12e80 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  for TK_COLUMN no
12e90 64 65 73 20 74 68 61 74 20 6e 65 65 64 0a 20 20  des that need.  
12ea0 2a 2a 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ** to be changed
12eb0 20 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d   to TK_AGG_COLUM
12ec0 4e 2e 20 20 42 75 74 20 69 6e 63 72 65 6d 65 6e  N.  But incremen
12ed0 74 20 6e 44 65 70 74 68 20 73 6f 20 74 68 61 74  t nDepth so that
12ee0 0a 20 20 2a 2a 20 54 4b 5f 41 47 47 5f 46 55 4e  .  ** TK_AGG_FUN
12ef0 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 73  CTION nodes in s
12f00 75 62 71 75 65 72 69 65 73 20 77 69 6c 6c 20 62  ubqueries will b
12f10 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  e unchanged..  *
12f20 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  /.  if( pExpr->p
12f30 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 4e  Select ){.    pN
12f40 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20  C->nDepth++;.   
12f50 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28   walkSelectExpr(
12f60 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
12f70 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
12f80 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d  , pNC);.    pNC-
12f90 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20  >nDepth--;.  }. 
12fa0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
12fb0 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
12fc0 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
12fd0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
12fe0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
12ff0 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
13000 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
13010 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
13020 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
13030 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65  ] array..** Make
13040 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   additional entr
13050 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73  ies to the pPars
13060 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20  e->aAgg[] array 
13070 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
13080 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13090 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
130a0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
130b0 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
130c0 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
130d0 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 52   by sqlite3ExprR
130e0 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a  esolveNames()..*
130f0 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61  *.** If errors a
13100 72 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61  re seen, leave a
13110 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
13120 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72  in zErrMsg and r
13130 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
13140 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
13150 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
13160 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
13170 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  es(NameContext *
13180 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pNC, Expr *pExpr
13190 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  ){.  int nErr = 
131a0 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72  pNC->pParse->nEr
131b0 72 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  r;.  walkExprTre
131c0 65 28 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65  e(pExpr, analyze
131d0 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b  Aggregate, pNC);
131e0 0a 20 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70  .  return pNC->p
131f0 50 61 72 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45  Parse->nErr - nE
13200 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  rr;.}../*.** Cal
13210 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
13220 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
13230 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
13240 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
13250 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
13260 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
13270 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
13280 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
13290 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
132a0 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
132b0 6f 72 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ort..*/.int sqli
132c0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
132d0 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
132e0 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
132f0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
13300 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
13310 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
13320 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  ;.  int nErr = 0
13330 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
13340 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
13350 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 6e 45  List->a, i=0; nE
13360 72 72 3d 3d 30 20 26 26 20 69 3c 70 4c 69 73 74  rr==0 && i<pList
13370 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
13380 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 45  tem++){.      nE
13390 72 72 20 2b 3d 20 73 71 6c 69 74 65 33 45 78 70  rr += sqlite3Exp
133a0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
133b0 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70  es(pNC, pItem->p
133c0 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
133d0 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a  .  return nErr;.
133e0 7d 0a                                            }.