/ Hex Artifact Content
Login

Artifact 2283be0ae4186fa9bb2a8a3f6b545a51ea7632bd:


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 39 32 20 32 30 30 37 2f 30 35 2f 31 32 20  .292 2007/05/12 
0220: 30 36 3a 31 31 3a 31 32 20 64 61 6e 69 65 6c 6b  06:11:12 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 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ..  sqlite3ExprS
1e50: 65 74 48 65 69 67 68 74 28 70 4e 65 77 29 3b 0a  etHeight(pNew);.
1e60: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
1e70: 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69  ../*.** Works li
1e80: 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 28 29  ke sqlite3Expr()
1e90: 20 62 75 74 20 66 72 65 65 73 20 69 74 73 20 70   but frees its p
1ea0: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
1eb0: 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 69 66 20  arguments.** if 
1ec0: 69 74 20 66 61 69 6c 73 20 64 75 65 20 74 6f 20  it fails due to 
1ed0: 61 20 6d 61 6c 6c 6f 63 20 70 72 6f 62 6c 65 6d  a malloc problem
1ee0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
1ef0: 65 33 45 78 70 72 4f 72 46 72 65 65 28 69 6e 74  e3ExprOrFree(int
1f00: 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66 74   op, Expr *pLeft
1f10: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20  , Expr *pRight, 
1f20: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
1f30: 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  ken){.  Expr *pN
1f40: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1f50: 28 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  (op, pLeft, pRig
1f60: 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  ht, pToken);.  i
1f70: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1f80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1f90: 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ete(pLeft);.    
1fa0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1fb0: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  e(pRight);.  }. 
1fc0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1fd0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e  ./*.** When doin
1fe0: 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65  g a nested parse
1ff0: 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64  , you can includ
2000: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78  e terms in an ex
2010: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74  pression.** that
2020: 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a   look like this:
2030: 20 20 20 23 30 20 23 31 20 23 32 20 2e 2e 2e 20     #0 #1 #2 ... 
2040: 20 54 68 65 73 65 20 74 65 72 6d 73 20 72 65 66   These terms ref
2050: 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73 0a 2a  er to elements.*
2060: 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  * on the stack. 
2070: 20 22 23 30 22 20 6d 65 61 6e 73 20 74 68 65 20   "#0" means the 
2080: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
2090: 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61 6e 73 20  ..** "#1" means 
20a0: 74 68 65 20 6e 65 78 74 20 64 6f 77 6e 20 6f 6e  the next down on
20b0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 41 6e 64   the stack.  And
20c0: 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a   so forth..**.**
20d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
20e0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
20f0: 61 72 73 65 72 20 74 6f 20 64 65 61 6c 20 77 69  arser to deal wi
2100: 74 68 20 6f 6e 20 6f 66 20 74 68 6f 73 65 20 74  th on of those t
2110: 65 72 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65  erms..** It imme
2120: 64 69 61 74 65 6c 79 20 67 65 6e 65 72 61 74 65  diately generate
2130: 73 20 63 6f 64 65 20 74 6f 20 73 74 6f 72 65 20  s code to store 
2140: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 61 20 6d  the value in a m
2150: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  emory location..
2160: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 73 20 61  ** The returns a
2170: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
2180: 74 20 77 69 6c 6c 20 63 6f 64 65 20 74 6f 20 65  t will code to e
2190: 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
21a0: 20 66 72 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d 65   from.** that me
21b0: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 61 73  mory location as
21c0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45 78 70 72   needed..*/.Expr
21d0: 20 2a 73 71 6c 69 74 65 33 52 65 67 69 73 74 65   *sqlite3Registe
21e0: 72 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61  rExpr(Parse *pPa
21f0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
2200: 65 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  en){.  Vdbe *v =
2210: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
2220: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 6e 74    Expr *p;.  int
2230: 20 64 65 70 74 68 3b 0a 20 20 69 66 28 20 70 50   depth;.  if( pP
2240: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
2250: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
2260: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2270: 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e  near \"%T\": syn
2280: 74 61 78 20 65 72 72 6f 72 22 2c 20 70 54 6f 6b  tax error", pTok
2290: 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  en);.    return 
22a0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e  sqlite3Expr(TK_N
22b0: 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ULL, 0, 0, 0);. 
22c0: 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20   }.  if( v==0 ) 
22d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20  return 0;.  p = 
22e0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52  sqlite3Expr(TK_R
22f0: 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20 70  EGISTER, 0, 0, p
2300: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 3d  Token);.  if( p=
2310: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2320: 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66   0;  /* Malloc f
2330: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 64  ailed */.  }.  d
2340: 65 70 74 68 20 3d 20 61 74 6f 69 28 28 63 68 61  epth = atoi((cha
2350: 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  r*)&pToken->z[1]
2360: 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  );.  p->iTable =
2370: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
2380: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
2390: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64  dOp(v, OP_Dup, d
23a0: 65 70 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c 69  epth, 0);.  sqli
23b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
23c0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d 3e  OP_MemStore, p->
23d0: 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72 65  iTable, 1);.  re
23e0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
23f0: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
2400: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
2410: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
2420: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
2430: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
2440: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
2450: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
2460: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
2470: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 45 78  qlite3ExprAnd(Ex
2480: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
2490: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
24a0: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
24b0: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
24c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
24d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
24e0: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
24f0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
2500: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
2510: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
2520: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
2530: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73  * Set the Expr.s
2540: 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65  pan field of the
2550: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
2560: 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a  n to span all.**
2570: 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68   text between th
2580: 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65  e two given toke
2590: 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
25a0: 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72  te3ExprSpan(Expr
25b0: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
25c0: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
25d0: 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28  ight){.  assert(
25e0: 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
25f0: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
2600: 20 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   );.  if( !sqlit
2610: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
2620: 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26 26   && pRight->z &&
2630: 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20   pLeft->z ){.   
2640: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
2650: 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74 2d  dyn==0 || pLeft-
2660: 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20  >z[pLeft->n]==0 
2670: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  );.    if( pLeft
2680: 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67  ->dyn==0 && pRig
2690: 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20  ht->dyn==0 ){.  
26a0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
26b0: 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20  z = pLeft->z;.  
26c0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
26d0: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20  n = pRight->n + 
26e0: 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65  (pRight->z - pLe
26f0: 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  ft->z);.    }els
2700: 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e{.      pExpr->
2710: 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  span.z = 0;.    
2720: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
2730: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
2740: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
2750: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69  or a function wi
2760: 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61  th multiple.** a
2770: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70  rguments..*/.Exp
2780: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75  r *sqlite3ExprFu
2790: 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20  nction(ExprList 
27a0: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
27b0: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
27c0: 70 4e 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20  pNew;.  assert( 
27d0: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
27e0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
27f0: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
2800: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
2810: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2820: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
2830: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61  t); /* Avoid lea
2840: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 77 68 65 6e  king memory when
2850: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
2860: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2870: 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20   }.  pNew->op = 
2880: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70  TK_FUNCTION;.  p
2890: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69  New->pList = pLi
28a0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  st;.  assert( pT
28b0: 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a  oken->dyn==0 );.
28c0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
28d0: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d  *pToken;.  pNew-
28e0: 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f  >span = pNew->to
28f0: 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33 45  ken;..  sqlite3E
2900: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 4e 65  xprSetHeight(pNe
2910: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
2920: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
2930: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
2940: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
2950: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
2960: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
2970: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
2980: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
2990: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
29a0: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
29b0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
29c0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
29d0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
29e0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
29f0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
2a00: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
2a10: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
2a20: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
2a30: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
2a40: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
2a50: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
2a60: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
2a70: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
2a80: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
2a90: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
2aa0: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
2ab0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
2ac0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
2ad0: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
2ae0: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
2af0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
2b00: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
2b10: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
2b20: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
2b30: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
2b40: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
2b50: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
2b60: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
2b70: 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61   sequenial varia
2b80: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
2b90: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
2ba0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
2bb0: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
2bc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2bd0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f 6b  r *pExpr){.  Tok
2be0: 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 69 66  en *pToken;.  if
2bf0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
2c00: 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d 20  urn;.  pToken = 
2c10: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20  &pExpr->token;. 
2c20: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
2c30: 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  >n>=1 );.  asser
2c40: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
2c50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  );.  assert( pTo
2c60: 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  ken->z[0]!=0 );.
2c70: 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d    if( pToken->n=
2c80: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =1 ){.    /* Wil
2c90: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
2ca0: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
2cb0: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
2cc0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 70   number */.    p
2cd0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b  Expr->iTable = +
2ce0: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20  +pParse->nVar;. 
2cf0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b 65   }else if( pToke
2d00: 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  n->z[0]=='?' ){.
2d10: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
2d20: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
2d30: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
2d40: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
2d50: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65 20   and.    ** use 
2d60: 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61 62  it as the variab
2d70: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
2d80: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78 70   int i;.    pExp
2d90: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d 20  r->iTable = i = 
2da0: 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f  atoi((char*)&pTo
2db0: 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20  ken->z[1]);.    
2dc0: 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51 4c  if( i<1 || i>SQL
2dd0: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
2de0: 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 20  _NUMBER ){.     
2df0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2e00: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
2e10: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
2e20: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
2e30: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
2e40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
2e50: 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20  ABLE_NUMBER);.  
2e60: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50    }.    if( i>pP
2e70: 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20  arse->nVar ){.  
2e80: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
2e90: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = i;.    }.  }e
2ea0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  lse{.    /* Wild
2eb0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
2ec0: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
2ed0: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
2ee0: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
2ef0: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
2f00: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
2f10: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
2f20: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
2f30: 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ame.    ** has n
2f40: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
2f50: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
2f60: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
2f70: 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mber.    */.    
2f80: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20  int i, n;.    n 
2f90: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20  = pToken->n;.   
2fa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
2fb0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b  se->nVarExpr; i+
2fc0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
2fd0: 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  pE;.      if( (p
2fe0: 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56 61  E = pParse->apVa
2ff0: 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20  rExpr[i])!=0.   
3000: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74 6f         && pE->to
3010: 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20  ken.n==n.       
3020: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d     && memcmp(pE-
3030: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e  >token.z, pToken
3040: 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ->z, n)==0 ){.  
3050: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
3060: 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65  ble = pE->iTable
3070: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3090: 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65     if( i>=pParse
30a0: 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20 20  ->nVarExpr ){.  
30b0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
30c0: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
30d0: 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ar;.      if( pP
30e0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d  arse->nVarExpr>=
30f0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
3100: 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20  Alloc-1 ){.     
3110: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45     pParse->nVarE
3120: 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72  xprAlloc += pPar
3130: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
3140: 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20  c + 10;.        
3150: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
3160: 72 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  r = sqliteReallo
3170: 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e  cOrFree(pParse->
3180: 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20 20 20  apVarExpr,.     
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78    pParse->nVarEx
31b0: 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  prAlloc*sizeof(p
31c0: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
31d0: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a  [0]) );.      }.
31e0: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
31f0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
3200: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
3210: 72 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61  rt( pParse->apVa
3220: 72 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  rExpr!=0 );.    
3230: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61      pParse->apVa
3240: 72 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56  rExpr[pParse->nV
3250: 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70  arExpr++] = pExp
3260: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
3270: 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61  .  } .  if( !pPa
3280: 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61  rse->nErr && pPa
3290: 72 73 65 2d 3e 6e 56 61 72 3e 53 51 4c 49 54 45  rse->nVar>SQLITE
32a0: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
32b0: 4d 42 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69  MBER ){.    sqli
32c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
32d0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51  se, "too many SQ
32e0: 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20  L variables");. 
32f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75   }.}../*.** Recu
3300: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
3310: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
3320: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
3330: 65 33 45 78 70 72 44 65 6c 65 74 65 28 45 78 70  e3ExprDelete(Exp
3340: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
3350: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
3360: 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20  ( p->span.dyn ) 
3370: 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72  sqliteFree((char
3380: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20  *)p->span.z);.  
3390: 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  if( p->token.dyn
33a0: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63   ) sqliteFree((c
33b0: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  har*)p->token.z)
33c0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
33d0: 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b  elete(p->pLeft);
33e0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
33f0: 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b  lete(p->pRight);
3400: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
3410: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73  stDelete(p->pLis
3420: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
3430: 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65  ectDelete(p->pSe
3440: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  lect);.  sqliteF
3450: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
3460: 20 54 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20   The Expr.token 
3470: 66 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20 61  field might be a
3480: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
3490: 74 68 61 74 20 69 73 20 71 75 6f 74 65 64 2e 0a  that is quoted..
34a0: 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d 6f 76 65  ** If so, remove
34b0: 20 74 68 65 20 71 75 6f 74 61 74 69 6f 6e 20 6d   the quotation m
34c0: 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arks..*/.void sq
34d0: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
34e0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
34f0: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
3500: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
3510: 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed) ){.    retur
3520: 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65 74  n;.  }.  ExprSet
3530: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44  Property(p, EP_D
3540: 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28 20  equoted);.  if( 
3550: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20  p->token.dyn==0 
3560: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  ){.    sqlite3To
3570: 6b 65 6e 43 6f 70 79 28 26 70 2d 3e 74 6f 6b 65  kenCopy(&p->toke
3580: 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  n, &p->token);. 
3590: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75   }.  sqlite3Dequ
35a0: 6f 74 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f  ote((char*)p->to
35b0: 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ken.z);.}.../*.*
35c0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
35d0: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
35e0: 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69  s make deep copi
35f0: 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  es of expression
3600: 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s,.** expression
3610: 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73   lists, ID lists
3620: 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61  , and select sta
3630: 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f  tements.  The co
3640: 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64  pies can.** be d
3650: 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67  eleted (by being
3660: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72   passed to their
3670: 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44   respective ...D
3680: 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73  elete() routines
3690: 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66  ).** without eff
36a0: 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  ecting the origi
36b0: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nals..**.** The 
36c0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
36d0: 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20   ID, and source 
36e0: 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20  lists return by 
36f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3700: 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  up(),.** sqlite3
3710: 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64  IdListDup(), and
3720: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
3730: 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20  up() can not be 
3740: 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64  further expanded
3750: 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65   .** by subseque
3760: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
3770: 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20  te*ListAppend() 
3780: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20  routines..**.** 
3790: 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20  Any tables that 
37a0: 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68  the SrcList migh
37b0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e  t point to are n
37c0: 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  ot duplicated..*
37d0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
37e0: 78 70 72 44 75 70 28 45 78 70 72 20 2a 70 29 7b  xprDup(Expr *p){
37f0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
3800: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3810: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
3820: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
3830: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
3840: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
3850: 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79  turn 0;.  memcpy
3860: 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66  (pNew, p, sizeof
3870: 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
3880: 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b  p->token.z!=0 ){
3890: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
38a0: 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65  .z = (u8*)sqlite
38b0: 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70  StrNDup((char*)p
38c0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f  ->token.z, p->to
38d0: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77  ken.n);.    pNew
38e0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b  ->token.dyn = 1;
38f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
3900: 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65  sert( pNew->toke
3910: 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  n.z==0 );.  }.  
3920: 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  pNew->span.z = 0
3930: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20  ;.  pNew->pLeft 
3940: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3950: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e  (p->pLeft);.  pN
3960: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
3970: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
3980: 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  Right);.  pNew->
3990: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
39a0: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4c  xprListDup(p->pL
39b0: 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ist);.  pNew->pS
39c0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
39d0: 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 53 65 6c  electDup(p->pSel
39e0: 65 63 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 54  ect);.  pNew->pT
39f0: 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 23 69  ab = p->pTab;.#i
3a00: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
3a10: 52 5f 44 45 50 54 48 3e 30 0a 20 20 70 4e 65 77  R_DEPTH>0.  pNew
3a20: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e  ->nHeight = p->n
3a30: 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20  Height;.#endif. 
3a40: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
3a50: 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65  void sqlite3Toke
3a60: 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f  nCopy(Token *pTo
3a70: 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b  , Token *pFrom){
3a80: 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20  .  if( pTo->dyn 
3a90: 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68  ) sqliteFree((ch
3aa0: 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69  ar*)pTo->z);.  i
3ab0: 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20  f( pFrom->z ){. 
3ac0: 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f     pTo->n = pFro
3ad0: 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a  m->n;.    pTo->z
3ae0: 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 53 74   = (u8*)sqliteSt
3af0: 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70 46 72  rNDup((char*)pFr
3b00: 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29  om->z, pFrom->n)
3b10: 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d  ;.    pTo->dyn =
3b20: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
3b30: 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d   pTo->z = 0;.  }
3b40: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
3b50: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
3b60: 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20  ExprList *p){.  
3b70: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
3b80: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
3b90: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
3ba0: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
3bb0: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
3bc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
3bd0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
3be0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
3bf0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
3c00: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3c10: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77  ew->nExpr = pNew
3c20: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45  ->nAlloc = p->nE
3c30: 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  xpr;.  pNew->a =
3c40: 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 4d   pItem = sqliteM
3c50: 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a  alloc( p->nExpr*
3c60: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
3c70: 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d  );.  if( pItem==
3c80: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  0 ){.    sqliteF
3c90: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72  ree(pNew);.    r
3ca0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20  eturn 0;.  } .  
3cb0: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
3cc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
3cd0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
3ce0: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
3cf0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
3d00: 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72  wExpr, *pOldExpr
3d10: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
3d20: 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20  pr = pNewExpr = 
3d30: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
3d40: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
3d50: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
3d60: 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70  if( pOldExpr->sp
3d70: 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45  an.z!=0 && pNewE
3d80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  xpr ){.      /* 
3d90: 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f  Always make a co
3da0: 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66  py of the span f
3db0: 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70  or top-level exp
3dc0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a  ressions in the.
3dd0: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
3de0: 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c  ion list.  The l
3df0: 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70  ogic in SELECT p
3e00: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64  rocessing that d
3e10: 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20  etermines.      
3e20: 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** the names of 
3e30: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
3e40: 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20  esult set needs 
3e50: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
3e60: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3e70: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77  3TokenCopy(&pNew
3e80: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c  Expr->span, &pOl
3e90: 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  dExpr->span);.  
3ea0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
3eb0: 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70  pNewExpr==0 || p
3ec0: 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21  NewExpr->span.z!
3ed0: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
3ee0: 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  || pOldExpr->spa
3ef0: 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  n.z==0.         
3f00: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c     || sqlite3Mal
3f10: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20  locFailed() );. 
3f20: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
3f30: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
3f40: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
3f50: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74  .    pItem->sort
3f60: 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d  Order = pOldItem
3f70: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
3f80: 20 70 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20   pItem->isAgg = 
3f90: 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67 67 3b  pOldItem->isAgg;
3fa0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
3fb0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
3fc0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
3fd0: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
3fe0: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
3ff0: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
4000: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
4010: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
4020: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
4030: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
4040: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
4050: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
4060: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
4070: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
4080: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
4090: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
40a0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
40b0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
40c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
40d0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
40e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
40f0: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
4100: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4110: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
4120: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
4130: 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69 73  rcListDup(SrcLis
4140: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
4150: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
4160: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
4170: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
4180: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
4190: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
41a0: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
41b0: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
41c0: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
41d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
41e0: 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a  ocRaw( nByte );.
41f0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
4200: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
4210: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
4220: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
4230: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4240: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
4250: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
4260: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
4270: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
4280: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
4290: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
42a0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
42b0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
42c0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61   pNewItem->zData
42d0: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72  base = sqliteStr
42e0: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44  Dup(pOldItem->zD
42f0: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e  atabase);.    pN
4300: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
4310: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
4320: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
4330: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
4340: 69 61 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ias = sqliteStrD
4350: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  up(pOldItem->zAl
4360: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
4370: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  em->jointype = p
4380: 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  OldItem->jointyp
4390: 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  e;.    pNewItem-
43a0: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
43b0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
43c0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f    pNewItem->isPo
43d0: 70 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74  pulated = pOldIt
43e0: 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b  em->isPopulated;
43f0: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77  .    pTab = pNew
4400: 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c  Item->pTab = pOl
4410: 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  dItem->pTab;.   
4420: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
4430: 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
4440: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
4450: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
4460: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
4470: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
4480: 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  t);.    pNewItem
4490: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
44a0: 78 70 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  xprDup(pOldItem-
44b0: 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49  >pOn);.    pNewI
44c0: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
44d0: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 70  lite3IdListDup(p
44e0: 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  OldItem->pUsing)
44f0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
4500: 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74  colUsed = pOldIt
4510: 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d  em->colUsed;.  }
4520: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
4530: 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  }.IdList *sqlite
4540: 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69 73  3IdListDup(IdLis
4550: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
4560: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
4570: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4580: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
4590: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
45a0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
45b0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
45c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
45d0: 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e  ew->nId = pNew->
45e0: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b  nAlloc = p->nId;
45f0: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
4600: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d  iteMallocRaw( p-
4610: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
4620: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
4630: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
4640: 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29  sqliteFree(pNew)
4650: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
4660: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
4670: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
4680: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
4690: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
46a0: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
46b0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
46c0: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
46d0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
46e0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
46f0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
4700: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
4710: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
4720: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
4730: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
4740: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
4750: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
4760: 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  p(Select *p){.  
4770: 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
4780: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
4790: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
47a0: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
47b0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
47c0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
47d0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  urn 0;.  pNew->i
47e0: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
47f0: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65  sDistinct;.  pNe
4800: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
4810: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
4820: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65  ->pEList);.  pNe
4830: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
4840: 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70  3SrcListDup(p->p
4850: 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  Src);.  pNew->pW
4860: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
4870: 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29  prDup(p->pWhere)
4880: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
4890: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
48a0: 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75  ListDup(p->pGrou
48b0: 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  pBy);.  pNew->pH
48c0: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
48d0: 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e  xprDup(p->pHavin
48e0: 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  g);.  pNew->pOrd
48f0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
4900: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72  prListDup(p->pOr
4910: 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  derBy);.  pNew->
4920: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
4930: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c  ew->pPrior = sql
4940: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d  ite3SelectDup(p-
4950: 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77  >pPrior);.  pNew
4960: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
4970: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 69  e3ExprDup(p->pLi
4980: 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  mit);.  pNew->pO
4990: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
49a0: 78 70 72 44 75 70 28 70 2d 3e 70 4f 66 66 73 65  xprDup(p->pOffse
49b0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  t);.  pNew->iLim
49c0: 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  it = -1;.  pNew-
49d0: 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20  >iOffset = -1;. 
49e0: 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65   pNew->isResolve
49f0: 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  d = p->isResolve
4a00: 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67  d;.  pNew->isAgg
4a10: 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70   = p->isAgg;.  p
4a20: 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20  New->usesEphm = 
4a30: 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61 6c  0;.  pNew->disal
4a40: 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  lowOrderBy = 0;.
4a50: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f    pNew->pRightmo
4a60: 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  st = 0;.  pNew->
4a70: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
4a80: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
4a90: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
4aa0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
4ab0: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
4ac0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
4ad0: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
4ae0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
4af0: 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  p(Select *p){.  
4b00: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
4b10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
4b20: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
4b30: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
4b40: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
4b50: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
4b60: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
4b70: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
4b80: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
4b90: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
4ba0: 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  st..*/.ExprList 
4bb0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
4bc0: 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20  Append(ExprList 
4bd0: 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45  *pList, Expr *pE
4be0: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  xpr, Token *pNam
4bf0: 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  e){.  if( pList=
4c00: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
4c10: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
4c20: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
4c30: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
4c40: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
4c50: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
4c60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
4c70: 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b  st->nAlloc==0 );
4c80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
4c90: 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d  ->nAlloc<=pList-
4ca0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74  >nExpr ){.    st
4cb0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
4cc0: 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e  em *a;.    int n
4cd0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
4ce0: 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20  *2 + 4;.    a = 
4cf0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
4d00: 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66  ist->a, n*sizeof
4d10: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
4d20: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
4d30: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
4d40: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
4d50: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70  st->a = a;.    p
4d60: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e  List->nAlloc = n
4d70: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4d80: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
4d90: 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e   if( pExpr || pN
4da0: 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ame ){.    struc
4db0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
4dc0: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
4dd0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
4de0: 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  +];.    memset(p
4df0: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
4e00: 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49  *pItem));.    pI
4e10: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
4e20: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4e30: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  n(pName);.    pI
4e40: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
4e50: 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  pr;.  }.  return
4e60: 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a   pList;..no_mem:
4e70: 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64       .  /* Avoid
4e80: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
4e90: 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61  if malloc has fa
4ea0: 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  iled. */.  sqlit
4eb0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
4ec0: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
4ed0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
4ee0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
4ef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
4f00: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
4f10: 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73   pEList contains
4f20: 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69   more than iLimi
4f30: 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c  t elements,.** l
4f40: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
4f50: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
4f60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4f70: 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e  ExprListCheckLen
4f80: 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gth(.  Parse *pP
4f90: 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74  arse,.  ExprList
4fa0: 20 2a 70 45 4c 69 73 74 2c 0a 20 20 69 6e 74 20   *pEList,.  int 
4fb0: 69 4c 69 6d 69 74 2c 0a 20 20 63 6f 6e 73 74 20  iLimit,.  const 
4fc0: 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b  char *zObject.){
4fd0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26  .  if( pEList &&
4fe0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 69   pEList->nExpr>i
4ff0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
5000: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5010: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
5020: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
5030: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
5040: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
5050: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 20  EXPR_DEPTH>0./* 
5060: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
5070: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68  ree functions, h
5080: 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68  eightOfExpr(), h
5090: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
50a0: 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f  ).** and heightO
50b0: 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75  fSelect(), are u
50c0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
50d0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
50e0: 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78  ght.** of any ex
50f0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
5100: 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
5110: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
5120: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
5130: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
5140: 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d   If this maximum
5150: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
5160: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
5170: 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ent value pointe
5180: 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69  d.** to by pnHei
5190: 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ght, the second 
51a0: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20  parameter, then 
51b0: 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f  set *pnHeight to
51c0: 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a   that.** value..
51d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
51e0: 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72  eightOfExpr(Expr
51f0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
5200: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
5210: 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67      if( p->nHeig
5220: 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a  ht>*pnHeight ){.
5230: 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
5240: 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  = p->nHeight;.  
5250: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
5260: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
5270: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
5280: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
5290: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
52a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
52b0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
52c0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68  r; i++){.      h
52d0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61  eightOfExpr(p->a
52e0: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69  [i].pExpr, pnHei
52f0: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
5300: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
5310: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c  ightOfSelect(Sel
5320: 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ect *p, int *pnH
5330: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5340: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
5350: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
5360: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5370: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48  ightOfExpr(p->pH
5380: 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29  aving, pnHeight)
5390: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
53a0: 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e  pr(p->pLimit, pn
53b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
53c0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66  ghtOfExpr(p->pOf
53d0: 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  fset, pnHeight);
53e0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
53f0: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
5400: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5410: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5420: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
5430: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5440: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
5450: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
5460: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5470: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69  OfSelect(p->pPri
5480: 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  or, pnHeight);. 
5490: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
54a0: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
54b0: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
54c0: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
54d0: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
54e0: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
54f0: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
5500: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
5510: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
5520: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
5530: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
5540: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
5550: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
5560: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
5570: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
5580: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
5590: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
55a0: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 76 6f   plus one..*/.vo
55b0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
55c0: 74 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29  tHeight(Expr *p)
55d0: 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20  {.  int nHeight 
55e0: 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  = 0;.  heightOfE
55f0: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e  xpr(p->pLeft, &n
5600: 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68  Height);.  heigh
5610: 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68  tOfExpr(p->pRigh
5620: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5630: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5640: 28 70 2d 3e 70 4c 69 73 74 2c 20 26 6e 48 65 69  (p->pList, &nHei
5650: 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66  ght);.  heightOf
5660: 53 65 6c 65 63 74 28 70 2d 3e 70 53 65 6c 65 63  Select(p->pSelec
5670: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5680: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
5690: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
56a0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61  ** Return the ma
56b0: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20  ximum height of 
56c0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
56d0: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a  ree referenced.*
56e0: 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20  * by the select 
56f0: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
5700: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
5710: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
5720: 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
5730: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
5740: 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  t nHeight = 0;. 
5750: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5760: 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  p, &nHeight);.  
5770: 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a  return nHeight;.
5780: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5790: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
57a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
57b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
57c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
57d0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
57e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
57f0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
5800: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
5810: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
5820: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  n;.  assert( pLi
5830: 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69  st->a!=0 || (pLi
5840: 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20  st->nExpr==0 && 
5850: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30  pList->nAlloc==0
5860: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5870: 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69  List->nExpr<=pLi
5880: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20  st->nAlloc );.  
5890: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
58a0: 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
58b0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
58c0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
58d0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 49  te3ExprDelete(pI
58e0: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
58f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65   sqliteFree(pIte
5900: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  m->zName);.  }. 
5910: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
5920: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
5930: 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
5940: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
5950: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 43  ression tree.  C
5960: 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20 65 61  all xFunc for ea
5970: 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65 64 2e  ch node visited.
5980: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
5990: 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46 75  n value from xFu
59a0: 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  nc determines wh
59b0: 65 74 68 65 72 20 74 68 65 20 74 72 65 65 20 77  ether the tree w
59c0: 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a  alk continues..*
59d0: 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69 6e  * 0 means contin
59e0: 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 74  ue walking the t
59f0: 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64 6f  ree.  1 means do
5a00: 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64 72   not walk childr
5a10: 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75 72  en.** of the cur
5a20: 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63 6f  rent node but co
5a30: 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69 62 6c  ntinue with sibl
5a40: 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20 61  ings.  2 means a
5a50: 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74 72  bandon.** the tr
5a60: 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74 65  ee walk complete
5a70: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ly..**.** The re
5a80: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
5a90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5aa0: 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65  1 to abandon the
5ab0: 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e   tree walk.** an
5ac0: 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  d 0 to continue.
5ad0: 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20 20  .**.** NOTICE:  
5ae0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
5af0: 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64 20  s *not* descend 
5b00: 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65 73 2e  into subqueries.
5b10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5b20: 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72  alkExprList(Expr
5b30: 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29 28  List *, int (*)(
5b40: 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20  void *, Expr*), 
5b50: 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20  void *);.static 
5b60: 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72 65 65  int walkExprTree
5b70: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
5b80: 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 2a  t (*xFunc)(void*
5b90: 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70  ,Expr*), void *p
5ba0: 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Arg){.  int rc;.
5bb0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
5bc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20   return 0;.  rc 
5bd0: 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67 2c  = (*xFunc)(pArg,
5be0: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 72   pExpr);.  if( r
5bf0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
5c00: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78  walkExprTree(pEx
5c10: 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63  pr->pLeft, xFunc
5c20: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
5c30: 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b   1;.    if( walk
5c40: 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e  ExprTree(pExpr->
5c50: 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20 70  pRight, xFunc, p
5c60: 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Arg) ) return 1;
5c70: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
5c80: 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69  rList(pExpr->pLi
5c90: 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  st, xFunc, pArg)
5ca0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
5cb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31 3b 0a  .  return rc>1;.
5cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61  }../*.** Call wa
5cd0: 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f 72  lkExprTree() for
5ce0: 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
5cf0: 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a  n in list p..*/.
5d00: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45  static int walkE
5d10: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
5d20: 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63   *p, int (*xFunc
5d30: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
5d40: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
5d50: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
5d60: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
5d70: 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21 70 20  pItem;.  if( !p 
5d80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
5d90: 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70 49  r(i=p->nExpr, pI
5da0: 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20 69  tem=p->a; i>0; i
5db0: 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
5dc0: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72    if( walkExprTr
5dd0: 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ee(pItem->pExpr,
5de0: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
5df0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
5e00: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
5e10: 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72  ** Call walkExpr
5e20: 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79  Tree() for every
5e30: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 53   expression in S
5e40: 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e 63  elect p, not inc
5e50: 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73  luding.** expres
5e60: 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 70  sions that are p
5e70: 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65 63  art of sub-selec
5e80: 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20 63  ts in any FROM c
5e90: 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c 49 4d  lause or the LIM
5ea0: 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54 20  IT.** or OFFSET 
5eb0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f  expressions...*/
5ec0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b  .static int walk
5ed0: 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c 65 63  SelectExpr(Selec
5ee0: 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e  t *p, int (*xFun
5ef0: 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a  c)(void *, Expr*
5f00: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
5f10: 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70    walkExprList(p
5f20: 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e 63 2c  ->pEList, xFunc,
5f30: 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78   pArg);.  walkEx
5f40: 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65 72 65  prTree(p->pWhere
5f50: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a  , xFunc, pArg);.
5f60: 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70    walkExprList(p
5f70: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46 75 6e  ->pGroupBy, xFun
5f80: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
5f90: 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48 61 76  ExprTree(p->pHav
5fa0: 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ing, xFunc, pArg
5fb0: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73  );.  walkExprLis
5fc0: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 78  t(p->pOrderBy, x
5fd0: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 72  Func, pArg);.  r
5fe0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
5ff0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6000: 69 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61  is designed as a
6010: 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b  n xFunc for walk
6020: 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a  ExprTree()..**.*
6030: 2a 20 70 41 72 67 20 69 73 20 72 65 61 6c 6c 79  * pArg is really
6040: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
6050: 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 77 65   integer.  If we
6060: 20 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f   can tell by loo
6070: 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70 72  king.** at pExpr
6080: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
6090: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
60a0: 6e 73 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20  ns pExpr is not 
60b0: 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78  a constant.** ex
60c0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73  pression, then s
60d0: 65 74 20 2a 70 41 72 67 20 74 6f 20 30 20 61 6e  et *pArg to 0 an
60e0: 64 20 72 65 74 75 72 6e 20 32 20 74 6f 20 61 62  d return 2 to ab
60f0: 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77  andon the tree w
6100: 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72  alk..** If pExpr
6110: 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20 64   does does not d
6120: 69 73 71 75 61 6c 69 66 79 20 74 68 65 20 65 78  isqualify the ex
6130: 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65  pression from be
6140: 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a  ing a constant.*
6150: 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  * then do nothin
6160: 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77  g..**.** After w
6170: 61 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c 65  alking the whole
6180: 20 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64   tree, if no nod
6190: 65 73 20 61 72 65 20 66 6f 75 6e 64 20 74 68 61  es are found tha
61a0: 74 20 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20  t disqualify.** 
61b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
61c0: 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  s constant, then
61d0: 20 77 65 20 61 73 73 75 6d 65 20 74 68 65 20 77   we assume the w
61e0: 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 0a  hole expression.
61f0: 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  ** is constant. 
6200: 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
6210: 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72  IsConstant() for
6220: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
6230: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
6240: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
6250: 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a  sConstant(void *
6260: 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70  pArg, Expr *pExp
6270: 72 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 45  r){.  switch( pE
6280: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
6290: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
62a0: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
62b0: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
62c0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
62d0: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
62e0: 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a 2f 0a 20  nd *pArg==2 */. 
62f0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
6300: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 2a  ION:.      if( *
6310: 28 28 69 6e 74 2a 29 70 41 72 67 29 3d 3d 32 20  ((int*)pArg)==2 
6320: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
6330: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
6340: 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  h */.    case TK
6350: 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _ID:.    case TK
6360: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
6370: 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61  e TK_DOT:.    ca
6380: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
6390: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
63a0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e  AGG_COLUMN:.#ifn
63b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
63c0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
63d0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
63e0: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
63f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 2a 28  .#endif.      *(
6400: 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20 30 3b  (int*)pArg) = 0;
6410: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
6420: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
6430: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
6440: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
6450: 20 20 20 20 20 2a 28 28 69 6e 74 2a 29 70 41 72       *((int*)pAr
6460: 67 29 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  g) = 0;.        
6470: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20  return 2;.      
6480: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  }.    default:. 
6490: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
64a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b   }.}../*.** Walk
64b0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
64c0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
64d0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
64e0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
64f0: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
6500: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
6510: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
6520: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
6530: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
6540: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
6550: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
6560: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
6570: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
6580: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
6590: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
65a0: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
65b0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
65c0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
65d0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
65e0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
65f0: 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20 77  isConst = 1;.  w
6600: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65  alkExprTree(p, e
6610: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
6620: 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20  t, &isConst);.  
6630: 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 3b 0a  return isConst;.
6640: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
6650: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6660: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
6670: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
6680: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20   constant.** or 
6690: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  a function call 
66a0: 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72  with constant ar
66b0: 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
66c0: 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a   and 0 if there.
66d0: 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61  ** are any varia
66e0: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  bles..**.** For 
66f0: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
6700: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
6710: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
6720: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
6730: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
6740: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
6750: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
6760: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
6770: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
6780: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
6790: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
67a0: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78  antOrFunction(Ex
67b0: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73  pr *p){.  int is
67c0: 43 6f 6e 73 74 20 3d 20 32 3b 0a 20 20 77 61 6c  Const = 2;.  wal
67d0: 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65 78 70  kExprTree(p, exp
67e0: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c  rNodeIsConstant,
67f0: 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65   &isConst);.  re
6800: 74 75 72 6e 20 69 73 43 6f 6e 73 74 21 3d 30 3b  turn isConst!=0;
6810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
6820: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
6830: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
6840: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
6850: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
6860: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
6870: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
6880: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
6890: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
68a0: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
68b0: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
68c0: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
68d0: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
68e0: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
68f0: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
6900: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
6910: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
6920: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
6930: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
6940: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
6950: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
6960: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77  t *pValue){.  sw
6970: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
6980: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
6990: 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ER: {.      if( 
69a0: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
69b0: 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e  (char*)p->token.
69c0: 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a 20 20  z, pValue) ){.  
69d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
69e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
69f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6a00: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
6a10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
6a20: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
6a30: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c  r(p->pLeft, pVal
6a40: 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ue);.    }.    c
6a50: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
6a60: 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20  .      int v;.  
6a70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
6a80: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
6a90: 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20  pLeft, &v) ){.  
6aa0: 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
6ab0: 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  -v;.        retu
6ac0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
6ad0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6ae0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
6af0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
6b00: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
6b10: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
6b20: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
6b30: 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
6b40: 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
6b50: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
6b60: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
6b70: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
6b80: 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
6b90: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
6ba0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6bb0: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
6bc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
6bd0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6be0: 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
6bf0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
6c00: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
6c10: 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  * Given the name
6c20: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20   of a column of 
6c30: 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f  the form X.Y.Z o
6c40: 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c  r Y.Z or just Z,
6c50: 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74   look up.** that
6c60: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74   name in the set
6c70: 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65   of source table
6c80: 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e  s in pSrcList an
6c90: 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72  d make the pExpr
6ca0: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20   .** expression 
6cb0: 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b 20  node refer back 
6cc0: 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20 63  to that source c
6cd0: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c  olumn.  The foll
6ce0: 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a  owing changes.**
6cf0: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78   are made to pEx
6d00: 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78  pr:.**.**    pEx
6d10: 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20  pr->iDb         
6d20: 20 20 53 65 74 20 74 68 65 20 69 6e 64 65 78 20    Set the index 
6d30: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20  in db->aDb[] of 
6d40: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c  the database hol
6d50: 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ding.**         
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d70: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  the table..**   
6d80: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20   pExpr->iTable  
6d90: 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65        Set to the
6da0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
6db0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74  or the table obt
6dc0: 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  ained.**        
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6de0: 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a   from pSrcList..
6df0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f  **    pExpr->iCo
6e00: 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74  lumn       Set t
6e10: 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  o the column num
6e20: 62 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 74  ber within the t
6e30: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70  able..**    pExp
6e40: 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
6e50: 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d   Set to TK_COLUM
6e60: 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  N..**    pExpr->
6e70: 70 4c 65 66 74 20 20 20 20 20 20 20 20 20 41 6e  pLeft         An
6e80: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69  y expression thi
6e90: 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64  s points to is d
6ea0: 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78  eleted.**    pEx
6eb0: 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20  pr->pRight      
6ec0: 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e    Any expression
6ed0: 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20   this points to 
6ee0: 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
6ef0: 2a 20 54 68 65 20 70 44 62 54 6f 6b 65 6e 20 69  * The pDbToken i
6f00: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
6f10: 65 20 64 61 74 61 62 61 73 65 20 28 74 68 65 20  e database (the 
6f20: 22 58 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75  "X").  This valu
6f30: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c  e may be.** NULL
6f40: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61   meaning that na
6f50: 6d 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  me is of the for
6f60: 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79  m Y.Z or Z.  Any
6f70: 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62   available datab
6f80: 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ase.** can be us
6f90: 65 64 2e 20 20 54 68 65 20 70 54 61 62 6c 65 54  ed.  The pTableT
6fa0: 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  oken is the name
6fb0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 74   of the table (t
6fc0: 68 65 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a  he "Y").  This.*
6fd0: 2a 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e  * value can be N
6fe0: 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e 20  ULL if pDbToken 
6ff0: 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49  is also NULL.  I
7000: 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  f pTableToken is
7010: 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e   NULL it.** mean
7020: 73 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20  s that the form 
7030: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a  of the name is Z
7040: 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e   and that column
7050: 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65  s from any table
7060: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e  .** can be used.
7070: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61  .**.** If the na
7080: 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73  me cannot be res
7090: 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75  olved unambiguou
70a0: 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  sly, leave an er
70b0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
70c0: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
70d0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52  urn non-zero.  R
70e0: 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73 75  eturn zero on su
70f0: 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccess..*/.static
7100: 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28   int lookupName(
7110: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7120: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
7130: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
7140: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f  /.  Token *pDbTo
7150: 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ken,     /* Name
7160: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
7170: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
7180: 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
7190: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b  Token *pTableTok
71a0: 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  en,  /* Name of 
71b0: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
71c0: 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c   column, or NULL
71d0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
71e0: 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61  lumnToken, /* Na
71f0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
7200: 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
7210: 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54  xt *pNC,    /* T
7220: 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20  he name context 
7230: 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20  used to resolve 
7240: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78  the name */.  Ex
7250: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
7260: 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20     /* Make this 
7270: 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20  EXPR node point 
7280: 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  to the selected 
7290: 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63  column */.){.  c
72a0: 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20  har *zDb = 0;   
72b0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
72c0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
72d0: 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20 2a  e "X" in X.Y.Z *
72e0: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  /.  char *zTab =
72f0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65   0;      /* Name
7300: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
7310: 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59 2e 5a  The "Y" in X.Y.Z
7320: 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68 61   or Y.Z */.  cha
7330: 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20  r *zCol = 0;    
7340: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7350: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22 5a   column.  The "Z
7360: 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  " */.  int i, j;
7370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7380: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
7390: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20    int cnt = 0;  
73a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
73b0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
73c0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
73d0: 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20  nt cntTab = 0;  
73e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
73f0: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
7400: 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  names */.  sqlit
7410: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7420: 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  >db;  /* The dat
7430: 61 62 61 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  abase */.  struc
7440: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
7450: 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  pItem;       /* 
7460: 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  Use for looping 
7470: 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 69 74  over pSrcList it
7480: 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ems */.  struct 
7490: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d  SrcList_item *pM
74a0: 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68  atch = 0;  /* Th
74b0: 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c  e matching pSrcL
74c0: 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61  ist item */.  Na
74d0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e  meContext *pTopN
74e0: 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20  C = pNC;        
74f0: 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e  /* First namecon
7500: 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74  text in the list
7510: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
7520: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70  ColumnToken && p
7530: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29  ColumnToken->z )
7540: 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e  ; /* The Z in X.
7550: 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55  Y.Z cannot be NU
7560: 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71  LL */.  zDb = sq
7570: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
7580: 65 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20  en(pDbToken);.  
7590: 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61  zTab = sqlite3Na
75a0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62  meFromToken(pTab
75b0: 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c  leToken);.  zCol
75c0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
75d0: 6f 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54  omToken(pColumnT
75e0: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c  oken);.  if( sql
75f0: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
7600: 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6c  () ){.    goto l
7610: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20  ookupname_end;. 
7620: 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61   }..  pExpr->iTa
7630: 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c  ble = -1;.  whil
7640: 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30  e( pNC && cnt==0
7650: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
7660: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 72   *pEList;.    Sr
7670: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
7680: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
7690: 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 4c 69  ..    if( pSrcLi
76a0: 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  st ){.      for(
76b0: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63 4c  i=0, pItem=pSrcL
76c0: 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c 69  ist->a; i<pSrcLi
76d0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
76e0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
76f0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
7700: 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
7710: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70         Column *p
7720: 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Col;.  .        
7730: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
7740: 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ab;.        asse
7750: 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
7760: 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
7770: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
7780: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
7790: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ema);.        as
77a0: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
77b0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
77c0: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
77d0: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
77e0: 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
77f0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
7800: 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c  ame = pItem->zAl
7810: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ias;.           
7820: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
7830: 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54  Cmp(zTabName, zT
7840: 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ab)!=0 ) continu
7850: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
7860: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
7870: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
7880: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
7890: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
78a0: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c  abName==0 || sql
78b0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62  ite3StrICmp(zTab
78c0: 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29  Name, zTab)!=0 )
78d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
78e0: 20 20 20 20 20 20 20 69 66 28 20 7a 44 62 21 3d         if( zDb!=
78f0: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
7900: 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  Cmp(db->aDb[iDb]
7910: 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20  .zName, zDb)!=0 
7920: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
7930: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7940: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7950: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7960: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63         if( 0==(c
7970: 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20  ntTab++) ){.    
7980: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
7990: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
79a0: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rsor;.          
79b0: 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d  pExpr->pSchema =
79c0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
79d0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
79e0: 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20   = pItem;.      
79f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
7a00: 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  j=0, pCol=pTab->
7a10: 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  aCol; j<pTab->nC
7a20: 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; j++, pCol++)
7a30: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
7a40: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
7a50: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
7a60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7a70: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
7a80: 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  zColl = pTab->aC
7a90: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
7aa0: 20 20 20 20 20 20 20 20 20 49 64 4c 69 73 74 20           IdList 
7ab0: 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 20  *pUsing;.       
7ac0: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
7ad0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
7ae0: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
7af0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
7b00: 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74      pMatch = pIt
7b10: 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
7b20: 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d  pExpr->pSchema =
7b30: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7b50: 75 62 73 74 69 74 75 74 65 20 74 68 65 20 72 6f  ubstitute the ro
7b60: 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20  wid (column -1) 
7b70: 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52 20  for the INTEGER 
7b80: 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20  PRIMARY KEY */. 
7b90: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7ba0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70  ->iColumn = j==p
7bb0: 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20  Tab->iPKey ? -1 
7bc0: 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  : j;.           
7bd0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
7be0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
7bf0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
7c00: 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70         if( (pExp
7c10: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  r->flags & EP_Ex
7c20: 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a  pCollate)==0 ){.
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
7c40: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  xpr->pColl = sql
7c50: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
7c60: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
7c70: 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll,-1, 0);.     
7c80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7c90: 20 20 20 20 20 69 66 28 20 69 3c 70 53 72 63 4c       if( i<pSrcL
7ca0: 69 73 74 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20  ist->nSrc-1 ){. 
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
7cc0: 20 70 49 74 65 6d 5b 31 5d 2e 6a 6f 69 6e 74 79   pItem[1].jointy
7cd0: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
7ce0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
7cf0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61     /* If this ma
7d00: 74 63 68 20 6f 63 63 75 72 72 65 64 20 69 6e 20  tch occurred in 
7d10: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
7d20: 66 20 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e  f a natural join
7d30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7d40: 20 20 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74    ** then skip t
7d50: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 74  he right table t
7d60: 6f 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63  o avoid a duplic
7d70: 61 74 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  ate match */.   
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
7d90: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  em++;.          
7da0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
7db0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
7dc0: 66 28 20 28 70 55 73 69 6e 67 20 3d 20 70 49 74  f( (pUsing = pIt
7dd0: 65 6d 5b 31 5d 2e 70 55 73 69 6e 67 29 21 3d 30  em[1].pUsing)!=0
7de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7df0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d      /* If this m
7e00: 61 74 63 68 20 6f 63 63 75 72 73 20 6f 6e 20 61  atch occurs on a
7e10: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20   column that is 
7e20: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
7e30: 75 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  use.            
7e40: 20 20 20 20 2a 2a 20 6f 66 20 61 20 6a 6f 69 6e      ** of a join
7e50: 2c 20 73 6b 69 70 20 74 68 65 20 73 65 61 72 63  , skip the searc
7e60: 68 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  h of the right t
7e70: 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
7e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7e90: 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61 20 64   ** to avoid a d
7ea0: 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20 74  uplicate match t
7eb0: 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
7ec0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e  for(k=0; k<pUsin
7ef0: 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20  g->nId; k++){.  
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
7f20: 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e  mp(pUsing->a[k].
7f30: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
7f40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
7f50: 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a         pItem++;.
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f70: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
7f90: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
7fa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7fb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7fc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7fe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
8000: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8010: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8020: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
8030: 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f  /* If we have no
8040: 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76  t already resolv
8050: 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65  ed the name, the
8060: 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20  n maybe .    ** 
8070: 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72  it is a new.* or
8080: 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61   old.* trigger a
8090: 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  rgument referenc
80a0: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
80b0: 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21   zDb==0 && zTab!
80c0: 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20  =0 && cnt==0 && 
80d0: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
80e0: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72  k!=0 ){.      Tr
80f0: 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69  iggerStack *pTri
8100: 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72  ggerStack = pPar
8110: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20  se->trigStack;. 
8120: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
8130: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
8140: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
8150: 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73  ewIdx != -1 && s
8160: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e  qlite3StrICmp("n
8170: 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20  ew", zTab) == 0 
8180: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
8190: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67  ->iTable = pTrig
81a0: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
81b0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
81c0: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
81d0: 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  >pTab );.       
81e0: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
81f0: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
8200: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72     }else if( pTr
8210: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49  iggerStack->oldI
8220: 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69  dx != -1 && sqli
8230: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  te3StrICmp("old"
8240: 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , zTab)==0 ){.  
8250: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
8260: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
8270: 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20  ack->oldIdx;.   
8280: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
8290: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
82a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
82b0: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
82c0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a  ->pTab;.      }.
82d0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20  .      if( pTab 
82e0: 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ){ .        int 
82f0: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f  iCol;.        Co
8300: 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61  lumn *pCol = pTa
8310: 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  b->aCol;..      
8320: 20 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61    pExpr->pSchema
8330: 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61   = pTab->pSchema
8340: 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61 62  ;.        cntTab
8350: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ++;.        for(
8360: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20 70  iCol=0; iCol < p
8370: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
8380: 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20  +, pCol++) {.   
8390: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
83a0: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
83b0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
83c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
83d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
83e0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
83f0: 6f 6c 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  ol].zColl;.     
8400: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
8410: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8420: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3d  >iColumn = iCol=
8430: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d  =pTab->iPKey ? -
8440: 31 20 3a 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  1 : iCol;.      
8450: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
8460: 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43  inity = pTab->aC
8470: 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74  ol[iCol].affinit
8480: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  y;.            i
8490: 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  f( (pExpr->flags
84a0: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
84b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
84c0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f        pExpr->pCo
84d0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
84e0: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
84f0: 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30  db), zColl,-1, 0
8500: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
8510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
8520: 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b  pr->pTab = pTab;
8530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
8540: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
8550: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8560: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  }.    }.#endif /
8570: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
8580: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
8590: 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  */..    /*.    *
85a0: 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61  * Perhaps the na
85b0: 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  me is a referenc
85c0: 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20  e to the ROWID. 
85d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
85e0: 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d  t==0 && cntTab==
85f0: 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f  1 && sqlite3IsRo
8600: 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20  wid(zCol) ){.   
8610: 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20     cnt = 1;.    
8620: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
8630: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78   = -1;.      pEx
8640: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  pr->affinity = S
8650: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
8660: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
8670: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69  .    ** If the i
8680: 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66  nput is of the f
8690: 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f  orm Z (not Y.Z o
86a0: 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68  r X.Y.Z) then th
86b0: 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20  e name Z.    ** 
86c0: 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f 20 61  might refer to a
86d0: 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69  n result-set ali
86e0: 61 73 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  as.  This happen
86f0: 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
8700: 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61  when.    ** we a
8710: 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d  re resolving nam
8720: 65 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  es in the WHERE 
8730: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
8740: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a  llowing command:
8750: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
8760: 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53     SELECT a+b AS
8770: 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48   x FROM table WH
8780: 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a  ERE x<10;.    **
8790: 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73  .    ** In cases
87a0: 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c   like this, repl
87b0: 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61  ace pExpr with a
87c0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
87d0: 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20  ression that.   
87e0: 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65   ** forms the re
87f0: 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28  sult set entry (
8800: 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61  "a+b" in the exa
8810: 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e  mple) and return
8820: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
8830: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
8840: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  he expression in
8850: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
8860: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
8870: 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  ady been.    ** 
8880: 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20  resolved by the 
8890: 74 69 6d 65 20 74 68 65 20 57 48 45 52 45 20 63  time the WHERE c
88a0: 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65  lause is resolve
88b0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
88c0: 28 20 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c  ( cnt==0 && (pEL
88d0: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73  ist = pNC->pELis
88e0: 74 29 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30  t)!=0 && zTab==0
88f0: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   ){.      for(j=
8900: 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; j<pEList->nEx
8910: 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
8920: 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45    char *zAs = pE
8930: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
8940: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 41  ;.        if( zA
8950: 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  s!=0 && sqlite3S
8960: 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c  trICmp(zAs, zCol
8970: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8980: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
8990: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
89a0: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
89b0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
89c0: 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20 20  ->op = TK_AS;.  
89d0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
89e0: 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
89f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
8a00: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
8a10: 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  Dup(pEList->a[j]
8a20: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
8a30: 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20     cnt = 1;.    
8a40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54        assert( zT
8a50: 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20  ab==0 && zDb==0 
8a60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
8a70: 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  o lookupname_end
8a80: 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _2;.        }.  
8a90: 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20      } .    }..  
8aa0: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20    /* Advance to 
8ab0: 74 68 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f  the next name co
8ac0: 6e 74 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70  ntext.  The loop
8ad0: 20 77 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20   will exit when 
8ae0: 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65  either.    ** we
8af0: 20 68 61 76 65 20 61 20 6d 61 74 63 68 20 28 63   have a match (c
8b00: 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65  nt>0) or when we
8b10: 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65   run out of name
8b20: 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a   contexts..    *
8b30: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
8b40: 20 29 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d 20   ){.      pNC = 
8b50: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
8b60: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
8b70: 20 49 66 20 58 20 61 6e 64 20 59 20 61 72 65 20   If X and Y are 
8b80: 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77  NULL (in other w
8b90: 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65  ords if only the
8ba0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69   column name Z i
8bb0: 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29  s.  ** supplied)
8bc0: 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
8bd0: 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20  f Z is enclosed 
8be0: 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  in double-quotes
8bf0: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73  , then.  ** Z is
8c00: 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61   a string litera
8c10: 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  l if it doesn't 
8c20: 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e  match any column
8c30: 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74   names.  In that
8c40: 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e  .  ** case, we n
8c50: 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69  eed to return ri
8c60: 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74  ght away and not
8c70: 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65   make any change
8c80: 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e  s to.  ** pExpr.
8c90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75  .  **.  ** Becau
8ca0: 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  se no reference 
8cb0: 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75 74 65  was made to oute
8cc0: 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68 65 20  r contexts, the 
8cd0: 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66  pNC->nRef.  ** f
8ce0: 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 63 68  ields are not ch
8cf0: 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e  anged in any con
8d00: 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  text..  */.  if(
8d10: 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d   cnt==0 && zTab=
8d20: 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b  =0 && pColumnTok
8d30: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b  en->z[0]=='"' ){
8d40: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
8d50: 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  zCol);.    retur
8d60: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  n 0;.  }..  /*. 
8d70: 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73   ** cnt==0 means
8d80: 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d   there was not m
8d90: 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61  atch.  cnt>1 mea
8da0: 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77  ns there were tw
8db0: 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d  o or.  ** more m
8dc0: 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20  atches.  Either 
8dd0: 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20  way, we have an 
8de0: 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  error..  */.  if
8df0: 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20  ( cnt!=1 ){.    
8e00: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20  char *z = 0;.   
8e10: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
8e20: 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f   zErr = cnt==0 ?
8e30: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e   "no such column
8e40: 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f  : %s" : "ambiguo
8e50: 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  us column name: 
8e60: 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  %s";.    if( zDb
8e70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8e80: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a  3SetString(&z, z
8e90: 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22  Db, ".", zTab, "
8ea0: 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a  .", zCol, (char*
8eb0: 29 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )0);.    }else i
8ec0: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
8ed0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
8ee0: 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c  g(&z, zTab, ".",
8ef0: 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29   zCol, (char*)0)
8f00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8f10: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74 72     z = sqliteStr
8f20: 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  Dup(zCol);.    }
8f30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8f40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45 72  rMsg(pParse, zEr
8f50: 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, z);.    sqlit
8f60: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 70 54  eFree(z);.    pT
8f70: 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  opNC->nErr++;.  
8f80: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c  }..  /* If a col
8f90: 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  umn from a table
8fa0: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20   in pSrcList is 
8fb0: 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e  referenced, then
8fc0: 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69   record.  ** thi
8fd0: 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53  s fact in the pS
8fe0: 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73  rcList.a[].colUs
8ff0: 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c  ed bitmask.  Col
9000: 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a  umn 0 causes.  *
9010: 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65  * bit 0 to be se
9020: 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74  t.  Column 1 set
9030: 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f  s bit 1.  And so
9040: 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a   forth.  If the.
9050: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62    ** column numb
9060: 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
9070: 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  an the number of
9080: 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74   bits in the bit
9090: 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73  mask.  ** then s
90a0: 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65  et the high-orde
90b0: 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74  r bit of the bit
90c0: 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mask..  */.  if(
90d0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
90e0: 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20  =0 && pMatch!=0 
90f0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
9100: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
9110: 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66     if( n>=sizeof
9120: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20  (Bitmask)*8 ){. 
9130: 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28       n = sizeof(
9140: 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20  Bitmask)*8-1;.  
9150: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
9160: 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d  pMatch->iCursor=
9170: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
9180: 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f  ;.    pMatch->co
9190: 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61  lUsed |= ((Bitma
91a0: 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c  sk)1)<<n;.  }..l
91b0: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20  ookupname_end:. 
91c0: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64   /* Clean up and
91d0: 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
91e0: 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b 0a  qliteFree(zDb);.
91f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61    sqliteFree(zTa
9200: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  b);.  sqlite3Exp
9210: 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70  rDelete(pExpr->p
9220: 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  Left);.  pExpr->
9230: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pLeft = 0;.  sql
9240: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
9250: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
9260: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
9270: 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20   0;.  pExpr->op 
9280: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f  = TK_COLUMN;.loo
9290: 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20  kupname_end_2:. 
92a0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
92b0: 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20  );.  if( cnt==1 
92c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
92d0: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  NC!=0 );.    sql
92e0: 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50 61  ite3AuthRead(pPa
92f0: 72 73 65 2c 20 70 45 78 70 72 2c 20 70 4e 43 2d  rse, pExpr, pNC-
9300: 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20  >pSrcList);.    
9310: 69 66 28 20 70 4d 61 74 63 68 20 26 26 20 21 70  if( pMatch && !p
9320: 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20 29  Match->pSelect )
9330: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  {.      pExpr->p
9340: 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54  Tab = pMatch->pT
9350: 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ab;.    }.    /*
9360: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e   Increment the n
9370: 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c  Ref value on all
9380: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66   name contexts f
9390: 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a  rom TopNC up to.
93a0: 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74      ** the point
93b0: 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20   where the name 
93c0: 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20  matched. */.    
93d0: 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61  for(;;){.      a
93e0: 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30  ssert( pTopNC!=0
93f0: 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43   );.      pTopNC
9400: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
9410: 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20  if( pTopNC==pNC 
9420: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
9430: 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e  TopNC = pTopNC->
9440: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
9450: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 65   return 0;.  } e
9460: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
9470: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
9480: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9490: 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20   designed as an 
94a0: 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78  xFunc for walkEx
94b0: 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  prTree()..**.** 
94c0: 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63  Resolve symbolic
94d0: 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43   names into TK_C
94e0: 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20  OLUMN operators 
94f0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
9500: 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65  ** node in the e
9510: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9520: 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e   Return 0 to con
9530: 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63 68  tinue the search
9540: 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65   down.** the tre
9550: 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20  e or 2 to abort 
9560: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
9570: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9580: 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f  e also does erro
9590: 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e  r checking and n
95a0: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66  ame resolution f
95b0: 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e  or.** function n
95c0: 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61  ames.  The opera
95d0: 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61 74  tor for aggregat
95e0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63  e functions is c
95f0: 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f  hanged.** to TK_
9600: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f  AGG_FUNCTION..*/
9610: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65  .static int name
9620: 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f 69  ResolverStep(voi
9630: 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
9640: 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  Expr){.  NameCon
9650: 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d  text *pNC = (Nam
9660: 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b 0a  eContext*)pArg;.
9670: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
9680: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
9690: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
96a0: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
96b0: 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  .  pParse = pNC-
96c0: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20  >pParse;..  if( 
96d0: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
96e0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73  ty(pExpr, EP_Res
96f0: 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e 20  olved) ) return 
9700: 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  1;.  ExprSetProp
9710: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52  erty(pExpr, EP_R
9720: 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65  esolved);.#ifnde
9730: 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70  f NDEBUG.  if( p
9740: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20  NC->pSrcList && 
9750: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e  pNC->pSrcList->n
9760: 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53  Alloc>0 ){.    S
9770: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
9780: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
9790: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
97a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d   for(i=0; i<pNC-
97b0: 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  >pSrcList->nSrc;
97c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
97d0: 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61  ert( pSrcList->a
97e0: 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26  [i].iCursor>=0 &
97f0: 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  & pSrcList->a[i]
9800: 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d  .iCursor<pParse-
9810: 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >nTab);.    }.  
9820: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  }.#endif.  switc
9830: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
9840: 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75      /* Double-qu
9850: 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78  oted strings (ex
9860: 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65  : "abc") are use
9870: 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73  d as identifiers
9880: 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69   if.    ** possi
9890: 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ble.  Otherwise 
98a0: 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73  they remain as s
98b0: 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d  trings.  Single-
98c0: 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74  quoted.    ** st
98d0: 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27  rings (ex: 'abc'
98e0: 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72  ) are always str
98f0: 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20  ing literals..  
9900: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
9910: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
9920: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
9930: 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62  n.z[0]=='\'' ) b
9940: 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46  reak;.      /* F
9950: 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
9960: 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20  e TK_ID case if 
9970: 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65  this is a double
9980: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a  -quoted string *
9990: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  /.    }.    /* A
99a0: 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72   lone identifier
99b0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
99c0: 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  a column..    */
99d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
99e0: 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e   {.      lookupN
99f0: 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  ame(pParse, 0, 0
9a00: 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  , &pExpr->token,
9a10: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
9a20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9a30: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20    }.  .    /* A 
9a40: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63  table name and c
9a50: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20  olumn name:     
9a60: 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20  ID.ID.    ** Or 
9a70: 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c  a database, tabl
9a80: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49  e and column:  I
9a90: 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20  D.ID.ID.    */. 
9aa0: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20     case TK_DOT: 
9ab0: 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
9ac0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f  Column;.      To
9ad0: 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20  ken *pTable;.   
9ae0: 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20     Token *pDb;. 
9af0: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
9b00: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28  t;..      /* if(
9b10: 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62   pSrcList==0 ) b
9b20: 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70  reak; */.      p
9b30: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
9b40: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
9b50: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
9b60: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ID ){.        pD
9b70: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
9b80: 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e  Table = &pExpr->
9b90: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
9ba0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
9bb0: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a  &pRight->token;.
9bc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9bd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69       assert( pRi
9be0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ght->op==TK_DOT 
9bf0: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d  );.        pDb =
9c00: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
9c10: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
9c20: 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d  Table = &pRight-
9c30: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
9c40: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
9c50: 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74   &pRight->pRight
9c60: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
9c70: 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d  .      lookupNam
9c80: 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70  e(pParse, pDb, p
9c90: 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20  Table, pColumn, 
9ca0: 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pNC, pExpr);.   
9cb0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
9cc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c   }..    /* Resol
9cd0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ve function name
9ce0: 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  s.    */.    cas
9cf0: 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a  e TK_CONST_FUNC:
9d00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
9d10: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
9d20: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
9d30: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20   pExpr->pList;  
9d40: 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
9d50: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  t list */.      
9d60: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20  int n = pList ? 
9d70: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
9d80: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
9d90: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
9da0: 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66     int no_such_f
9db0: 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  unc = 0;       /
9dc0: 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63  * True if no suc
9dd0: 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  h function exist
9de0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77  s */.      int w
9df0: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
9e00: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
9e10: 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  f wrong number o
9e20: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
9e30: 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20       int is_agg 
9e40: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9e50: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61   /* True if is a
9e60: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
9e70: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
9e80: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  t i;.      int a
9e90: 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  uth;            
9ea0: 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72         /* Author
9eb0: 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20 74  ization to use t
9ec0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
9ed0: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
9f00: 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63  aracters in func
9f10: 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  tion name */.   
9f20: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9f30: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Id;            /
9f40: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
9f50: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75  ame. */.      Fu
9f60: 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
9f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
9f80: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
9f90: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
9fa0: 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 45       int enc = E
9fb0: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20  NC(pParse->db); 
9fc0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
9fd0: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20   encoding */..  
9fe0: 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a      zId = (char*
9ff0: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b  )pExpr->token.z;
a000: 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78  .      nId = pEx
a010: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
a020: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
a030: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
a040: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
a050: 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a  Id, n, enc, 0);.
a060: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
a070: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
a080: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
a090: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
a0a0: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31  db, zId, nId, -1
a0b0: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
a0c0: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
a0d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73  {.          no_s
a0e0: 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20  uch_func = 1;.  
a0f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a100: 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d         wrong_num
a110: 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20  _args = 1;.     
a120: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
a130: 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  {.        is_agg
a140: 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d   = pDef->xFunc==
a150: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
a160: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
a170: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
a180: 20 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20     if( pDef ){. 
a190: 20 20 20 20 20 20 20 61 75 74 68 20 3d 20 73 71         auth = sq
a1a0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
a1b0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55  Parse, SQLITE_FU
a1c0: 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d  NCTION, 0, pDef-
a1d0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
a1e0: 20 20 20 20 69 66 28 20 61 75 74 68 21 3d 53 51      if( auth!=SQ
a1f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a200: 20 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53       if( auth==S
a210: 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20  QLITE_DENY ){.  
a220: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a230: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a240: 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65  , "not authorize
a250: 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f  d to use functio
a260: 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  n: %s",.        
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a280: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66              pDef
a290: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
a2a0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
a2b0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
a2c0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
a2d0: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
a2e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
a2f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a300: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
a310: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21   if( is_agg && !
a320: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b  pNC->allowAgg ){
a330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a340: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a350: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
a360: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25  egate function %
a370: 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29  .*s()", nId,zId)
a380: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
a390: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Err++;.        i
a3a0: 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  s_agg = 0;.     
a3b0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75   }else if( no_su
a3c0: 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20  ch_func ){.     
a3d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a3e0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
a3f0: 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  uch function: %.
a400: 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  *s", nId, zId);.
a410: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
a420: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
a430: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
a440: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
a450: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a460: 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d  Parse,"wrong num
a470: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
a480: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a   to function %.*
a490: 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s()",.          
a4a0: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
a4b0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
a4c0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
a4d0: 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20   if( is_agg ){. 
a4e0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
a4f0: 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49   = TK_AGG_FUNCTI
a500: 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  ON;.        pNC-
a510: 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20  >hasAgg = 1;.   
a520: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
a530: 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c  s_agg ) pNC->all
a540: 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  owAgg = 0;.     
a550: 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e   for(i=0; pNC->n
a560: 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69  Err==0 && i<n; i
a570: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c  ++){.        wal
a580: 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d  kExprTree(pList-
a590: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d  >a[i].pExpr, nam
a5a0: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70  eResolverStep, p
a5b0: 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NC);.      }.   
a5c0: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
a5d0: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
a5e0: 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20  1;.      /* FIX 
a5f0: 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78  ME:  Compute pEx
a600: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73  pr->affinity bas
a610: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74  ed on the expect
a620: 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20  ed return.      
a630: 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  ** type of the f
a640: 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  unction .      *
a650: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  /.      return i
a660: 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66  s_agg;.    }.#if
a670: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a680: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
a690: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
a6a0: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
a6b0: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
a6c0: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
a6d0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
a6e0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
a6f0: 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e  nt nRef = pNC->n
a700: 52 65 66 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Ref;.#ifndef SQL
a710: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
a720: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
a730: 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20  isCheck ){.     
a740: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
a750: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 73 75 62  rMsg(pParse,"sub
a760: 71 75 65 72 69 65 73 20 70 72 6f 68 69 62 69 74  queries prohibit
a770: 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73  ed in CHECK cons
a780: 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20  traints");.     
a790: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
a7a0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
a7b0: 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
a7c0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
a7d0: 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 61   pNC);.        a
a7e0: 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66  ssert( pNC->nRef
a7f0: 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20  >=nRef );.      
a800: 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d    if( nRef!=pNC-
a810: 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20  >nRef ){.       
a820: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
a830: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
a840: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
a850: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a860: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
a870: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a880: 54 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73 65  T_CHECK.    case
a890: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
a8a0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69        if( pNC->i
a8b0: 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20  sCheck ){.      
a8c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
a8d0: 67 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d 65  g(pParse,"parame
a8e0: 74 65 72 73 20 70 72 6f 68 69 62 69 74 65 64 20  ters prohibited 
a8f0: 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  in CHECK constra
a900: 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ints");.      }.
a910: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a920: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
a930: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
a940: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a950: 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73  walks an express
a960: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73  ion tree and res
a970: 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73  olves references
a980: 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c   to.** table col
a990: 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20  umns.  Nodes of 
a9a0: 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f  the form ID.ID o
a9b0: 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74  r ID resolve int
a9c0: 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  o an.** index to
a9d0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
a9e0: 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64  e table list and
a9f0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74   a column offset
aa00: 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e  .  The .** Expr.
aa10: 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20  opcode for such 
aa20: 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64  nodes is changed
aa30: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20   to TK_COLUMN.  
aa40: 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a  The Expr.iTable.
aa50: 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  ** value is chan
aa60: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
aa70: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
aa80: 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  ed table in pTab
aa90: 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65  List.** plus the
aaa0: 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20   "base" value.  
aab0: 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77  The base value w
aac0: 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
aad0: 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42  ecome the.** VDB
aae0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
aaf0: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
ab00: 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
ab10: 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
ab20: 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65  d.** table.  The
ab30: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
ab40: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
ab50: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
ab60: 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66  he column .** of
ab70: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
ab80: 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72  table.  The Expr
ab90: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66  .iColumn value f
aba0: 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  or the special.*
abb0: 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69  * ROWID column i
abc0: 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47  s -1.  Any INTEG
abd0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
abe0: 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61  olumn is tried a
abf0: 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f  s an.** alias fo
ac00: 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41  r ROWID..**.** A
ac10: 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63  lso resolve func
ac20: 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63  tion names and c
ac30: 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f  heck the functio
ac40: 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a  ns for proper.**
ac50: 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75   usage.  Make su
ac60: 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  re all function 
ac70: 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e  names are recogn
ac80: 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e  ized and all fun
ac90: 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74  ctions.** have t
aca0: 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
acb0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
acc0: 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
acd0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
ace0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66  arse->zErrMsg if
acf0: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
ad00: 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ss.  Return the 
ad10: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
ad20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
ad30: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
ad40: 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ns aggregate fun
ad50: 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20  ctions then set 
ad60: 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72  the EP_Agg.** pr
ad70: 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78  operty on the ex
ad80: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  pression..*/.int
ad90: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
ada0: 6c 76 65 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d  lveNames( .  Nam
adb0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
adc0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63       /* Namespac
add0: 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70  e to resolve exp
ade0: 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a  ressions in. */.
adf0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
ae00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ae10: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
ae20: 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29  e analyzed. */.)
ae30: 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48 61 73  {.  int savedHas
ae40: 41 67 67 3b 0a 20 20 69 66 28 20 70 45 78 70 72  Agg;.  if( pExpr
ae50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ae60: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
ae70: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 69 66  XPR_DEPTH>0.  if
ae80: 28 20 28 70 45 78 70 72 2d 3e 6e 48 65 69 67 68  ( (pExpr->nHeigh
ae90: 74 2b 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e  t+pNC->pParse->n
aea0: 48 65 69 67 68 74 29 3e 53 51 4c 49 54 45 5f 4d  Height)>SQLITE_M
aeb0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29 7b  AX_EXPR_DEPTH ){
aec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
aed0: 72 4d 73 67 28 70 4e 43 2d 3e 70 50 61 72 73 65  rMsg(pNC->pParse
aee0: 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72 65  , .       "Expre
aef0: 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f  ssion tree is to
af00: 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d  o large (maximum
af10: 20 64 65 70 74 68 20 25 64 29 22 2c 0a 20 20 20   depth %d)",.   
af20: 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45      SQLITE_MAX_E
af30: 58 50 52 5f 44 45 50 54 48 0a 20 20 20 20 29 3b  XPR_DEPTH.    );
af40: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
af50: 20 7d 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73 65   }.  pNC->pParse
af60: 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45 78  ->nHeight += pEx
af70: 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e  pr->nHeight;.#en
af80: 64 69 66 0a 20 20 73 61 76 65 64 48 61 73 41 67  dif.  savedHasAg
af90: 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67 67 3b  g = pNC->hasAgg;
afa0: 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d  .  pNC->hasAgg =
afb0: 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   0;.  walkExprTr
afc0: 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65 52 65  ee(pExpr, nameRe
afd0: 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29  solverStep, pNC)
afe0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
aff0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
b000: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65  pNC->pParse->nHe
b010: 69 67 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e 6e  ight -= pExpr->n
b020: 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20  Height;.#endif. 
b030: 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30   if( pNC->nErr>0
b040: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
b050: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
b060: 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20  P_Error);.  }.  
b070: 69 66 28 20 70 4e 43 2d 3e 68 61 73 41 67 67 20  if( pNC->hasAgg 
b080: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
b090: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
b0a0: 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69  _Agg);.  }else i
b0b0: 66 28 20 73 61 76 65 64 48 61 73 41 67 67 20 29  f( savedHasAgg )
b0c0: 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67  {.    pNC->hasAg
b0d0: 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  g = 1;.  }.  ret
b0e0: 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65  urn ExprHasPrope
b0f0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72  rty(pExpr, EP_Er
b100: 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ror);.}../*.** A
b110: 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e 63   pointer instanc
b120: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
b130: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 70  ure is used to p
b140: 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ass information.
b150: 2a 2a 20 74 68 72 6f 75 67 68 20 77 61 6c 6b 45  ** through walkE
b160: 78 70 72 54 72 65 65 20 69 6e 74 6f 20 63 6f 64  xprTree into cod
b170: 65 53 75 62 71 75 65 72 79 53 74 65 70 28 29 2e  eSubqueryStep().
b180: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
b190: 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 51 75  ct QueryCoder Qu
b1a0: 65 72 79 43 6f 64 65 72 3b 0a 73 74 72 75 63 74  eryCoder;.struct
b1b0: 20 51 75 65 72 79 43 6f 64 65 72 20 7b 0a 20 20   QueryCoder {.  
b1c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
b1d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
b1e0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b1f0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
b200: 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61  C;    /* Namespa
b210: 63 65 20 6f 66 20 66 69 72 73 74 20 65 6e 63 6c  ce of first encl
b220: 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d  osing query */.}
b230: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ;.../*.** Genera
b240: 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
b250: 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
b260: 65 64 20 61 73 20 61 6e 20 65 78 70 72 65 73 73  ed as an express
b270: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70  ion.** and IN op
b280: 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
b290: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
b2a0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
b2b0: 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
b2c0: 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
b2d0: 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
b2e0: 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
b2f0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
b300: 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
b310: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
b320: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
b330: 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
b340: 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
b350: 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
b360: 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
b370: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
b380: 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
b390: 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
b3a0: 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
b3b0: 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
b3c0: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
b3d0: 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
b3e0: 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
b3f0: 65 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ery..*/.#ifndef 
b400: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b410: 55 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74 65  UERY.void sqlite
b420: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50  3CodeSubselect(P
b430: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
b440: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
b450: 74 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 20  t testAddr = 0; 
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d        /* One-tim
b480: 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a  e test address *
b490: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
b4a0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
b4b0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
b4c0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20 20 2f   ) return;...  /
b4d0: 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74  * This code must
b4e0: 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65   be run in its e
b4f0: 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69  ntirety every ti
b500: 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
b510: 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79  ered.  ** if any
b520: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b530: 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  g is true:.  **.
b540: 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
b550: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
b560: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
b570: 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20  ubquery.  **    
b580: 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
b590: 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70  d side is an exp
b5a0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
b5b0: 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65  taining variable
b5c0: 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20  s.  **    *  We 
b5d0: 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69  are inside a tri
b5e0: 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gger.  **.  ** I
b5f0: 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
b600: 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68  ve are false, th
b610: 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68  en we can run th
b620: 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63  is code just onc
b630: 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20  e.  ** save the 
b640: 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75  results, and reu
b650: 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  se the same resu
b660: 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  lt on subsequent
b670: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20   invocations..  
b680: 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  */.  if( !ExprHa
b690: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
b6a0: 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
b6b0: 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72  ) && !pParse->tr
b6c0: 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 69  igStack ){.    i
b6d0: 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72 73 65 2d  nt mem = pParse-
b6e0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nMem++;.    sql
b6f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b700: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d   OP_MemLoad, mem
b710: 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 41 64  , 0);.    testAd
b720: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
b730: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
b740: 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  0, 0);.    asser
b750: 74 28 20 74 65 73 74 41 64 64 72 3e 30 20 7c 7c  t( testAddr>0 ||
b760: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
b770: 69 6c 65 64 28 29 20 29 3b 0a 20 20 20 20 73 71  iled() );.    sq
b780: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b790: 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20  , OP_MemInt, 1, 
b7a0: 6d 65 6d 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  mem);.  }..  swi
b7b0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
b7c0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
b7d0: 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61  : {.      char a
b7e0: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b  ffinity;.      K
b7f0: 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a  eyInfo keyInfo;.
b800: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20        int addr; 
b810: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
b820: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
b830: 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
b840: 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69  n */..      affi
b850: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
b860: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
b870: 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  ->pLeft);..     
b880: 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
b890: 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
b8a0: 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
b8b0: 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
b8c0: 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
b8d0: 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
b8e0: 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
b8f0: 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  . A virtual tabl
b900: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
b910: 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c  illed with singl
b920: 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65  e-field index ke
b930: 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
b940: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
b950: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45    ** from the SE
b960: 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
b970: 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
b980: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
b990: 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
b9a0: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
b9b0: 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
b9c0: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
b9d0: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
b9e0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
b9f0: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
ba00: 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
ba10: 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
ba20: 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
ba30: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
ba40: 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
ba50: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
ba60: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
ba70: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
ba80: 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
ba90: 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
baa0: 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
bab0: 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
bac0: 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
bad0: 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
bae0: 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
baf0: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
bb00: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
bb10: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
bb20: 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
bb30: 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
bb40: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
bb50: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
bb60: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
bb70: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
bb80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
bb90: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70  nEphemeral, pExp
bba0: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
bbb0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79       memset(&key
bbc0: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
bbd0: 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  keyInfo));.     
bbe0: 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20   keyInfo.nField 
bbf0: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
bc00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bc10: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
bc20: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
bc30: 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  1);..      if( p
bc40: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
bc50: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
bc60: 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
bc70: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
bc80: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
bc90: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
bca0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
bcb0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
bcc0: 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
bcd0: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
bce0: 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
bcf0: 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
bd00: 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
bd10: 20 20 20 20 20 20 20 69 6e 74 20 69 50 61 72 6d         int iParm
bd20: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
bd30: 20 2b 20 20 28 28 28 69 6e 74 29 61 66 66 69 6e   +  (((int)affin
bd40: 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20 20 20  ity)<<16);.     
bd50: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
bd60: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ist;.        ass
bd70: 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
bd80: 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
bd90: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
bda0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
bdb0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
bdc0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  se, pExpr->pSele
bdd0: 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 50 61  ct, SRT_Set, iPa
bde0: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 20  rm, 0, 0, 0, 0) 
bdf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
be00: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
be10: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
be20: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
be30: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
be40: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
be50: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b  List->nExpr>0 ){
be60: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
be70: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 62  nfo.aColl[0] = b
be80: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
be90: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
bea0: 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20  r->pLeft,.      
beb0: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e          pEList->
bec0: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
bed0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
bee0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  se if( pExpr->pL
bef0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
bf00: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
bf10: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
bf20: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a 2a 20  .        **..** 
bf30: 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
bf40: 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
bf50: 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
bf60: 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
bf70: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
bf80: 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
bf90: 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
bfa0: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
bfb0: 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
bfc0: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
bfd0: 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
bfe0: 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
bff0: 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
c000: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
c010: 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
c020: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
c030: 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
c040: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
c050: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
c060: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
c070: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
c080: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
c090: 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 20 20 20  m *pItem;..     
c0a0: 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
c0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
c0c0: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
c0d0: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
c0e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49    }.        keyI
c0f0: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70  nfo.aColl[0] = p
c100: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f  Expr->pLeft->pCo
c110: 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ll;..        /* 
c120: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
c130: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
c140: 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20  <exprlist>. */. 
c150: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69         for(i=pLi
c160: 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
c170: 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20  =pList->a; i>0; 
c180: 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
c190: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
c1a0: 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  E2 = pItem->pExp
c1b0: 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  r;..          /*
c1c0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
c1d0: 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  on is not consta
c1e0: 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  nt then we will 
c1f0: 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
c200: 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65    ** disable the
c210: 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67   test that was g
c220: 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74  enerated above t
c230: 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20  hat makes sure. 
c240: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
c250: 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75   code only execu
c260: 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75  tes once.  Becau
c270: 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e  se for a non-con
c280: 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20  stant.          
c290: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65  ** expression we
c2a0: 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74   need to rerun t
c2b0: 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69  his code each ti
c2c0: 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  me..          */
c2d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74  .          if( t
c2e0: 65 73 74 41 64 64 72 3e 30 20 26 26 20 21 73 71  estAddr>0 && !sq
c2f0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
c300: 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
c310: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c320: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
c330: 76 2c 20 74 65 73 74 41 64 64 72 2d 31 2c 20 33  v, testAddr-1, 3
c340: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
c350: 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  estAddr = 0;.   
c360: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
c370: 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
c380: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
c390: 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
c3a0: 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
c3b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
c3c0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c3d0: 61 72 73 65 2c 20 70 45 32 29 3b 0a 20 20 20 20  arse, pE2);.    
c3e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c3f0: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
c400: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
c410: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
c420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c430: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
c440: 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
c450: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
c460: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
c470: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
c480: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
c490: 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f  (void *)&keyInfo
c4a0: 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P3_KEYINFO);. 
c4b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c4c0: 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  }..    case TK_E
c4d0: 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
c4e0: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
c4f0: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74     /* This has t
c500: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45  o be a scalar SE
c510: 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20  LECT.  Generate 
c520: 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a  code to put the.
c530: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
c540: 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e  f this select in
c550: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61   a memory cell a
c560: 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75  nd record the nu
c570: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66  mber.      ** of
c580: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
c590: 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20   in iColumn..   
c5a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74     */.      stat
c5b0: 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f  ic const Token o
c5c0: 6e 65 20 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c  ne = { (u8*)"1",
c5d0: 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 53   0, 1 };.      S
c5e0: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
c5f0: 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20     int iMem;.   
c600: 20 20 20 69 6e 74 20 73 6f 70 3b 0a 0a 20 20 20     int sop;..   
c610: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
c620: 6e 20 3d 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  n = iMem = pPars
c630: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
c640: 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 70   pSel = pExpr->p
c650: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66  Select;.      if
c660: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
c670: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
c680: 20 20 73 6f 70 20 3d 20 53 52 54 5f 4d 65 6d 3b    sop = SRT_Mem;
c690: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c6a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c6b0: 4d 65 6d 4e 75 6c 6c 2c 20 69 4d 65 6d 2c 20 30  MemNull, iMem, 0
c6c0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
c6d0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 49 6e  omment((v, "# In
c6e0: 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75  it subquery resu
c6f0: 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lt"));.      }el
c700: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20  se{.        sop 
c710: 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
c720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c730: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
c740: 49 6e 74 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20  Int, 0, iMem);. 
c750: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
c760: 6e 74 28 28 76 2c 20 22 23 20 49 6e 69 74 20 45  nt((v, "# Init E
c770: 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
c780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
c790: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
c7a0: 28 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a  (pSel->pLimit);.
c7b0: 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d        pSel->pLim
c7c0: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
c7d0: 28 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20  (TK_INTEGER, 0, 
c7e0: 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20  0, &one);.      
c7f0: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
c800: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
c810: 73 6f 70 2c 20 69 4d 65 6d 2c 20 30 2c 20 30 2c  sop, iMem, 0, 0,
c820: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
c830: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
c840: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
c850: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
c860: 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20 20  testAddr ){.    
c870: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
c880: 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72 29  ere(v, testAddr)
c890: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 3b  ;.  }..  return;
c8a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
c8b0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
c8c0: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  Y */../*.** Gene
c8d0: 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
c8e0: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
c8f0: 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65  t the integer de
c900: 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78  scribe by.** tex
c910: 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74  t z[0..n-1] on t
c920: 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61  he stack..*/.sta
c930: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
c940: 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f  eger(Vdbe *v, co
c950: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
c960: 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   n){.  int i;.  
c970: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e  if( sqlite3GetIn
c980: 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20  t32(z, &i) ){.  
c990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c9a0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
c9b0: 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , i, 0);.  }else
c9c0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73   if( sqlite3Fits
c9d0: 49 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20  In64Bits(z) ){. 
c9e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
c9f0: 33 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  3(v, OP_Int64, 0
ca00: 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65  , 0, z, n);.  }e
ca10: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
ca20: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65  VdbeOp3(v, OP_Re
ca30: 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b  al, 0, 0, z, n);
ca40: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
ca50: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
ca60: 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74  t will extract t
ca70: 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
ca80: 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  lumn from.** tab
ca90: 6c 65 20 70 54 61 62 20 61 6e 64 20 70 75 73 68  le pTab and push
caa0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 76 61 6c   that column val
cab0: 75 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ue on the stack.
cac0: 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e    There.** is an
cad0: 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20   open cursor to 
cae0: 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 2e 20  pTab in iTable. 
caf0: 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
cb00: 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65  en.** code is ge
cb10: 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74  nerated that ext
cb20: 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e  racts the rowid.
cb30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cb40: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
cb50: 6e 28 56 64 62 65 20 2a 76 2c 20 54 61 62 6c 65  n(Vdbe *v, Table
cb60: 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c   *pTab, int iCol
cb70: 75 6d 6e 2c 20 69 6e 74 20 69 54 61 62 6c 65 29  umn, int iTable)
cb80: 7b 0a 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c  {.  if( iColumn<
cb90: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  0 ){.    int op 
cba0: 3d 20 28 70 54 61 62 20 26 26 20 49 73 56 69 72  = (pTab && IsVir
cbb0: 74 75 61 6c 28 70 54 61 62 29 29 20 3f 20 4f 50  tual(pTab)) ? OP
cbc0: 5f 56 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77  _VRowid : OP_Row
cbd0: 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  id;.    sqlite3V
cbe0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
cbf0: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 7d 65  iTable, 0);.  }e
cc00: 6c 73 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20  lse if( pTab==0 
cc10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
cc20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
cc30: 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43  lumn, iTable, iC
cc40: 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  olumn);.  }else{
cc50: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
cc60: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
cc70: 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
cc80: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
cc90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cca0: 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  op, iTable, iCol
ccb0: 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  umn);.    sqlite
ccc0: 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
ccd0: 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 29  , pTab, iColumn)
cce0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
ccf0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
cd00: 4f 49 4e 54 0a 20 20 20 20 69 66 28 20 70 54 61  OINT.    if( pTa
cd10: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  b->aCol[iColumn]
cd20: 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
cd30: 45 5f 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20  E_AFF_REAL ){.  
cd40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cd50: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 6c 41  ddOp(v, OP_RealA
cd60: 66 66 69 6e 69 74 79 2c 20 30 2c 20 30 29 3b 0a  ffinity, 0, 0);.
cd70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
cd80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
cd90: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
cda0: 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
cdb0: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
cdc0: 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
cdd0: 6e 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20  n and leave the 
cde0: 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f  result on the to
cdf0: 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a  p of stack..**.*
ce00: 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
ce10: 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
ce20: 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
ce30: 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
ce40: 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
ce50: 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
ce60: 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
ce70: 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
ce80: 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
ce90: 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
cea0: 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
ceb0: 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
cec0: 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
ced0: 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
cee0: 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
cef0: 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
cf00: 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
cf10: 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
cf20: 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
cf30: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
cf40: 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
cf50: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
cf60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
cf70: 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
cf80: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
cf90: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
cfa0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
cfb0: 69 6e 74 20 6f 70 3b 0a 20 20 69 6e 74 20 73 74  int op;.  int st
cfc0: 61 63 6b 43 68 6e 67 20 3d 20 31 3b 20 20 20 20  ackChng = 1;    
cfd0: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 63 68 61  /* Amount of cha
cfe0: 6e 67 65 20 74 6f 20 73 74 61 63 6b 20 64 65 70  nge to stack dep
cff0: 74 68 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d  th */..  if( v==
d000: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
d010: 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
d020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d030: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
d040: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
d050: 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78  ;.  }.  op = pEx
d060: 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
d070: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
d080: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
d090: 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
d0a0: 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
d0b0: 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
d0c0: 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
d0d0: 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
d0e0: 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
d0f0: 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
d100: 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
d110: 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
d120: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d130: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
d140: 6d 4c 6f 61 64 2c 20 70 43 6f 6c 2d 3e 69 4d 65  mLoad, pCol->iMe
d150: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  m, 0);.        b
d160: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
d170: 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
d180: 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
d190: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d1a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d1b0: 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
d1c0: 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  ->sortingIdx,.  
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
d1f0: 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 29  ->iSorterColumn)
d200: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
d210: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
d220: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  * Otherwise, fal
d230: 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
d240: 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a  TK_COLUMN case *
d250: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
d260: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
d270: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
d280: 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20  Table<0 ){.     
d290: 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20     /* This only 
d2a0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64  happens when cod
d2b0: 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72  ing check constr
d2c0: 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  aints */.       
d2d0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
d2e0: 3e 63 6b 4f 66 66 73 65 74 3e 30 20 29 3b 0a 20  >ckOffset>0 );. 
d2f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d300: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
d310: 70 2c 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  p, pParse->ckOff
d320: 73 65 74 2d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  set-pExpr->iColu
d330: 6d 6e 2d 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  mn-1, 1);.      
d340: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
d350: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
d360: 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 45 78 70 72  tColumn(v, pExpr
d370: 2d 3e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69  ->pTab, pExpr->i
d380: 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69  Column, pExpr->i
d390: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Table);.      }.
d3a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d3b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
d3c0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
d3d0: 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28  codeInteger(v, (
d3e0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
d3f0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
d400: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  en.n);.      bre
d410: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
d420: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
d430: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
d440: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
d450: 20 54 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65   TK_FLOAT==OP_Re
d460: 61 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  al );.      asse
d470: 72 74 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f  rt( TK_STRING==O
d480: 50 5f 53 74 72 69 6e 67 38 20 29 3b 0a 20 20 20  P_String8 );.   
d490: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
d4a0: 65 45 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20  eExpr(pExpr);.  
d4b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
d4c0: 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(v, op, 0, 0, 
d4d0: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
d4e0: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
d4f0: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72  ken.n);.      br
d500: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
d510: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
d520: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d530: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
d540: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
d550: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
d560: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d570: 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
d580: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
d590: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
d5a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d5b0: 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
d5c0: 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78   TK_BLOB==OP_Hex
d5d0: 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 6e 20  Blob );.      n 
d5e0: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
d5f0: 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20   - 3;.      z = 
d600: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
d610: 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20  ken.z + 2;.     
d620: 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b   assert( n>=0 );
d630: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
d640: 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 22  ){.        z = "
d650: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
d660: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
d670: 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 2c 20  v, op, 0, 0, z, 
d680: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
d690: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d6a0: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
d6b0: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
d6c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d6d0: 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
d6e0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
d6f0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
d700: 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20  >token.n>1 ){.  
d710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d720: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
d730: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
d740: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
d750: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  oken.n);.      }
d760: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d770: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
d780: 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
d790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d7a0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
d7b0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
d7c0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
d7d0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
d7e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
d7f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
d800: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
d810: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
d820: 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
d830: 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
d840: 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20  .      int aff, 
d850: 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  to_op;.      sql
d860: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d870: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
d880: 74 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20  t);.      aff = 
d890: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
d8a0: 79 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65  ype(&pExpr->toke
d8b0: 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20  n);.      to_op 
d8c0: 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41  = aff - SQLITE_A
d8d0: 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54  FF_TEXT + OP_ToT
d8e0: 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ext;.      asser
d8f0: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54  t( to_op==OP_ToT
d900: 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  ext    || aff!=S
d910: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
d920: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
d930: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42  t( to_op==OP_ToB
d940: 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  lob    || aff!=S
d950: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20  QLITE_AFF_NONE  
d960: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
d970: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  t( to_op==OP_ToN
d980: 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53  umeric || aff!=S
d990: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
d9a0: 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  C );.      asser
d9b0: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49  t( to_op==OP_ToI
d9c0: 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  nt     || aff!=S
d9d0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
d9e0: 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
d9f0: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52  t( to_op==OP_ToR
da00: 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  eal    || aff!=S
da10: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
da20: 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
da30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74  e3VdbeAddOp(v, t
da40: 6f 5f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  o_op, 0, 0);.   
da50: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30     stackChng = 0
da60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
da70: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
da80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
da90: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
daa0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
dab0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
dac0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
dad0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
dae0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
daf0: 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
db00: 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
db10: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
db20: 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
db30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
db40: 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
db50: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
db60: 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
db70: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
db80: 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
db90: 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
dba0: 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73  OP_Ne );.      s
dbb0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
dbc0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
dbd0: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
dbe0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
dbf0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
dc00: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
dc10: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
dc20: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
dc30: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 30  r->pRight, op, 0
dc40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63  , 0);.      stac
dc50: 6b 43 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20  kChng = -1;.    
dc60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
dc70: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
dc80: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
dc90: 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
dca0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
dcb0: 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
dcc0: 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
dcd0: 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
dce0: 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
dcf0: 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
dd00: 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
dd10: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
dd20: 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
dd30: 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
dd40: 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
dd50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
dd60: 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
dd70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
dd80: 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20  K_OR==OP_Or );. 
dd90: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
dda0: 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a  PLUS==OP_Add );.
ddb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
ddc0: 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
ddd0: 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  act );.      ass
dde0: 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f  ert( TK_REM==OP_
ddf0: 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20  Remainder );.   
de00: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
de10: 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
de20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
de30: 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
de40: 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  tOr );.      ass
de50: 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
de60: 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20  P_Divide );.    
de70: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
de80: 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
de90: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
dea0: 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
deb0: 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20  _ShiftRight );. 
dec0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
ded0: 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
dee0: 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t );.      sqlit
def0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
df00: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
df10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
df20: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
df30: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
df40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
df50: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
df60: 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b   0);.      stack
df70: 43 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20  Chng = -1;.     
df80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
df90: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
dfa0: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
dfb0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
dfc0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
dfd0: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
dfe0: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
dff0: 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c  ==TK_FLOAT || pL
e000: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
e010: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54  GER ){.        T
e020: 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74  oken *p = &pLeft
e030: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
e040: 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
e050: 65 33 4d 50 72 69 6e 74 66 28 22 2d 25 2e 2a 73  e3MPrintf("-%.*s
e060: 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a  ", p->n, p->z);.
e070: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66          if( pLef
e080: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
e090: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
e0a0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
e0b0: 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c  P_Real, 0, 0, z,
e0c0: 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20   p->n+1);.      
e0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e0e0: 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76     codeInteger(v
e0f0: 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20  , z, p->n+1);.  
e100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e110: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
e120: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e130: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
e140: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
e150: 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d   TK_NOT */.    }
e160: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
e170: 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
e180: 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
e190: 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
e1a0: 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20  =OP_BitNot );.  
e1b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
e1c0: 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20  OT==OP_Not );.  
e1d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e1e0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
e1f0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
e200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e210: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
e220: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
e230: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
e240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e250: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
e260: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
e270: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
e280: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
e290: 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
e2a0: 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
e2b0: 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
e2c0: 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
e2d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e2e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
e2f0: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20  teger, 1, 0);.  
e300: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e310: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
e320: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
e330: 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56   dest = sqlite3V
e340: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
e350: 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 2;.      sql
e360: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e370: 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20   op, 1, dest);. 
e380: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e390: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
e3a0: 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  mm, -1, 0);.    
e3b0: 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b    stackChng = 0;
e3c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e3d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e3e0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
e3f0: 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
e400: 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
e410: 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  ggInfo;.      if
e420: 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  ( pInfo==0 ){.  
e430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
e440: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
e450: 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
e460: 74 65 3a 20 25 54 22 2c 0a 20 20 20 20 20 20 20  te: %T",.       
e470: 20 20 20 20 20 26 70 45 78 70 72 2d 3e 73 70 61       &pExpr->spa
e480: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
e490: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e4a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e4b0: 4d 65 6d 4c 6f 61 64 2c 20 70 49 6e 66 6f 2d 3e  MemLoad, pInfo->
e4c0: 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67  aFunc[pExpr->iAg
e4d0: 67 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  g].iMem, 0);.   
e4e0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
e4f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e500: 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a   TK_CONST_FUNC:.
e510: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
e520: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
e530: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
e540: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
e550: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
e560: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
e570: 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
e580: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
e590: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20       int nId;.  
e5a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e5b0: 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  zId;.      int c
e5c0: 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  onstMask = 0;.  
e5d0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
e5e0: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
e5f0: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  arse->db);.     
e600: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
e610: 3d 20 30 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  = 0;.      zId =
e620: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
e630: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49  oken.z;.      nI
e640: 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  d = pExpr->token
e650: 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  .n;.      pDef =
e660: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
e670: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
e680: 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72   zId, nId, nExpr
e690: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
e6a0: 20 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30   assert( pDef!=0
e6b0: 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20   );.      nExpr 
e6c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
e6d0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
e6e0: 2c 20 70 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65  , pList);.#ifnde
e6f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
e700: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
e710: 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
e720: 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
e730: 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
e740: 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
e750: 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
e760: 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
e770: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
e780: 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
e790: 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
e7a0: 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
e7b0: 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
e7c0: 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
e7d0: 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
e7e0: 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
e7f0: 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
e800: 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
e810: 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
e820: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
e830: 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
e840: 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
e850: 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
e860: 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
e870: 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
e880: 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
e890: 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
e8a0: 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
e8b0: 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
e8c0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
e8d0: 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
e8e0: 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
e8f0: 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
e900: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
e910: 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
e920: 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
e930: 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
e940: 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
e950: 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
e960: 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
e970: 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
e980: 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
e990: 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
e9a0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
e9b0: 45 78 70 72 3e 3d 32 20 26 26 20 28 70 45 78 70  Expr>=2 && (pExp
e9c0: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
e9d0: 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
e9e0: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
e9f0: 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
ea00: 6e 63 74 69 6f 6e 28 70 44 65 66 2c 20 6e 45 78  nction(pDef, nEx
ea10: 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr, pList->a[1].
ea20: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
ea30: 6c 73 65 20 69 66 28 20 6e 45 78 70 72 3e 30 20  lse if( nExpr>0 
ea40: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
ea50: 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
ea60: 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 70 44  rloadFunction(pD
ea70: 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74  ef, nExpr, pList
ea80: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
ea90: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
eaa0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
eab0: 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b  Expr && i<32; i+
eac0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
ead0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
eae0: 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69  stant(pList->a[i
eaf0: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
eb00: 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
eb10: 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20  |= (1<<i);.     
eb20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
eb30: 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53   pDef->needCollS
eb40: 65 71 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  eq && !pColl ){.
eb50: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
eb60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
eb70: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
eb80: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
eb90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eba0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   }.      if( pDe
ebb0: 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  f->needCollSeq )
ebc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
ebd0: 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70  Coll ) pColl = p
ebe0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
ebf0: 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
ec00: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
ec10: 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
ec20: 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
ec30: 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P3_COLLSEQ);. 
ec40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ec50: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
ec60: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73  P_Function, cons
ec70: 74 4d 61 73 6b 2c 20 6e 45 78 70 72 2c 20 28 63  tMask, nExpr, (c
ec80: 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46 55  har*)pDef, P3_FU
ec90: 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 74  NCDEF);.      st
eca0: 61 63 6b 43 68 6e 67 20 3d 20 31 2d 6e 45 78 70  ackChng = 1-nExp
ecb0: 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  r;.      break;.
ecc0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
ecd0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
ece0: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
ecf0: 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
ed00: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
ed10: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
ed20: 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
ed30: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
ed40: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
ed50: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d   pExpr);.      }
ed60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ed70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
ed80: 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 43  mLoad, pExpr->iC
ed90: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
eda0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
edb0: 20 22 23 20 6c 6f 61 64 20 73 75 62 71 75 65 72   "# load subquer
edc0: 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
edd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ede0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
edf0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
ee00: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  ;.      char aff
ee10: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 69 6e 74  inity;.      int
ee20: 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72   ckOffset = pPar
ee30: 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20  se->ckOffset;.  
ee40: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
ee50: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
ee60: 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20   pExpr);..      
ee70: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
ee80: 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  e affinity to us
ee90: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65  e to create a ke
eea0: 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  y from the resul
eeb0: 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ts.      ** of t
eec0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61  he expression. a
eed0: 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65  ffinityStr store
eee0: 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  s a static strin
eef0: 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20  g suitable for. 
ef00: 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50       ** P3 of OP
ef10: 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20  _MakeRecord..   
ef20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69     */.      affi
ef30: 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f  nity = compariso
ef40: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
ef50: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
ef60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ef70: 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a  Integer, 1, 0);.
ef80: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b        pParse->ck
ef90: 4f 66 66 73 65 74 20 3d 20 28 63 6b 4f 66 66 73  Offset = (ckOffs
efa0: 65 74 20 3f 20 28 63 6b 4f 66 66 73 65 74 2b 31  et ? (ckOffset+1
efb0: 29 20 3a 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f  ) : 0);..      /
efc0: 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72  * Code the <expr
efd0: 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
efe0: 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65  N (...)". The te
eff0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20  mporary table.  
f000: 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54      ** pExpr->iT
f010: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  able contains th
f020: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
f030: 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20  ke up the (...) 
f040: 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  set..      */.  
f050: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
f060: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
f070: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
f080: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
f090: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
f0a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f0b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f0c0: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
f0d0: 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20 20 20  r+4);           
f0e0: 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a   /* addr + 0 */.
f0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f100: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
f110: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 2, 0);.      s
f120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f130: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
f140: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f150: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f160: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29  Goto, 0, addr+7)
f170: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f180: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
f190: 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26  eRecord, 1, 0, &
f1a0: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 20 20 20  affinity, 1);   
f1b0: 2f 2a 20 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20  /* addr + 4 */. 
f1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f1d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e  AddOp(v, OP_Foun
f1e0: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
f1f0: 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20  , addr+7);.     
f200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f210: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
f220: 2d 31 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20  -1, 0);         
f230: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72           /* addr
f240: 20 2b 20 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62   + 6 */..      b
f250: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
f260: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  if.    case TK_B
f270: 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
f280: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
f290: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
f2a0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
f2b0: 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d  t_item *pLItem =
f2c0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
f2d0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
f2e0: 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
f2f0: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
f300: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
f310: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  se, pLeft);.    
f320: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f330: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
f340: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
f350: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f360: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
f370: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
f380: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
f390: 67 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30  ght, OP_Ge, 0, 0
f3a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f3b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f3c0: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
f3d0: 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20     pLItem++;.   
f3e0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74     pRight = pLIt
f3f0: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
f400: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f410: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
f420: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
f430: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
f440: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65  t, pRight, OP_Le
f450: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
f460: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f470: 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29  v, OP_And, 0, 0)
f480: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f490: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f4a0: 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  _UPLUS:.    case
f4b0: 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20   TK_AS: {.      
f4c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f4d0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
f4e0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 74 61  Left);.      sta
f4f0: 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ckChng = 0;.    
f500: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f510: 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a     case TK_CASE:
f520: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70   {.      int exp
f530: 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20  r_end_label;.   
f540: 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b     int jumpInst;
f550: 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
f560: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
f570: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
f580: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72  EList;.      str
f590: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
f5a0: 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20  m *aListelem;.. 
f5b0: 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
f5c0: 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r->pList);.     
f5d0: 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e   assert((pExpr->
f5e0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32  pList->nExpr % 2
f5f0: 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61  ) == 0);.      a
f600: 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
f610: 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
f620: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
f630: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
f640: 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
f650: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
f660: 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
f670: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70  nExpr;.      exp
f680: 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20 73 71  r_end_label = sq
f690: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
f6a0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
f6b0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
f6c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f6d0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
f6e0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
f6f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
f700: 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
f710: 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20  i=i+2){.        
f720: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f730: 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
f740: 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  m[i].pExpr);.   
f750: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
f760: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
f770: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f780: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31  dOp(v, OP_Dup, 1
f790: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
f7a0: 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64 65 43  jumpInst = codeC
f7b0: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
f7c0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69  Expr->pLeft, aLi
f7d0: 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c  stelem[i].pExpr,
f7e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a    OP_Ne, 0, 1);.
f810: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f820: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f830: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
f840: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f850: 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d        jumpInst =
f860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f870: 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31  p(v, OP_IfNot, 1
f880: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
f890: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
f8a0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
f8b0: 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
f8c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
f8d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f8e0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
f8f0: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a  xpr_end_label);.
f900: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f910: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
f920: 75 6d 70 49 6e 73 74 29 3b 0a 20 20 20 20 20 20  umpInst);.      
f930: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
f940: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
f950: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f960: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
f970: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
f980: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
f990: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
f9a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f9b0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
f9c0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
f9d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
f9e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f9f0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
fa00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
fa10: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
fa20: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78 70 72  lveLabel(v, expr
fa30: 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20  _end_label);.   
fa40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fa50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fa60: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
fa70: 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
fa80: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
fa90: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b  se->trigStack ){
faa0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fab0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
fac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fad0: 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29          "RAISE()
fae0: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
faf0: 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  d within a trigg
fb00: 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 09 72  er-program");..r
fb10: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
fb20: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
fb30: 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f  iColumn!=OE_Igno
fb40: 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61  re ){.         a
fb50: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
fb60: 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  olumn==OE_Rollba
fb70: 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  ck ||.          
fb80: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
fb90: 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72  olumn == OE_Abor
fba0: 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  t ||.           
fbb0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
fbc0: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20  lumn == OE_Fail 
fbd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
fbe0: 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70  te3DequoteExpr(p
fbf0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
fc00: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
fc10: 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
fc20: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45  E_CONSTRAINT, pE
fc30: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  xpr->iColumn,.  
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78        (char*)pEx
fc60: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
fc70: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
fc80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
fc90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
fca0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
fcb0: 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20  OE_Ignore );.   
fcc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fcd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e  eAddOp(v, OP_Con
fce0: 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a  textPop, 0, 0);.
fcf0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
fd00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fd10: 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
fd20: 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f  >trigStack->igno
fd30: 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20  reJump);.       
fd40: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
fd50: 2c 20 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52  , "# raise(IGNOR
fd60: 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  E)"));.      }. 
fd70: 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
fd80: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
fd90: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
fda0: 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  }..  if( pParse-
fdb0: 3e 63 6b 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  >ckOffset ){.   
fdc0: 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
fdd0: 74 20 2b 3d 20 73 74 61 63 6b 43 68 6e 67 3b 0a  t += stackChng;.
fde0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
fdf0: 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29 3b 0a  se->ckOffset );.
fe00: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
fe10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
fe20: 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  ER./*.** Generat
fe30: 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
fe40: 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65  utes the given e
fe50: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65  xpression and le
fe60: 61 76 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  aves the result.
fe70: 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ** on the stack.
fe80: 20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74    See also sqlit
fe90: 65 33 45 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a  e3ExprCode()..**
fea0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
feb0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 63 61 63 68   might also cach
fec0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64  e the result and
fed0: 20 6d 6f 64 69 66 79 20 74 68 65 20 70 45 78 70   modify the pExp
fee0: 72 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61  r tree.** so tha
fef0: 74 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75  t it will make u
ff00: 73 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 64  se of the cached
ff10: 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
ff20: 71 75 65 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e  quent evaluation
ff30: 73 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  s.** rather than
ff40: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 77 68   evaluate the wh
ff50: 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ole expression a
ff60: 67 61 69 6e 2e 20 20 54 72 69 76 69 61 6c 20 65  gain.  Trivial e
ff70: 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
ff80: 2a 20 6e 6f 74 20 63 61 63 68 65 64 2e 20 20 49  * not cached.  I
ff90: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
ffa0: 20 69 73 20 63 61 63 68 65 64 2c 20 69 74 73 20   is cached, its 
ffb0: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
ffc0: 20 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79   in a .** memory
ffd0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   location..*/.vo
ffe0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
fff0: 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
10000 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
10010 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a  pExpr){.  Vdbe *
10020 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
10030 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20  e;.  int iMem;. 
10040 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
10050 32 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  2;.  if( v==0 ) 
10060 72 65 74 75 72 6e 3b 0a 20 20 61 64 64 72 31 20  return;.  addr1 
10070 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
10080 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73  rentAddr(v);.  s
10090 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
100a0 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
100b0 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
100c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
100d0 76 29 3b 0a 20 20 69 66 28 20 61 64 64 72 32 3e  v);.  if( addr2>
100e0 61 64 64 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74  addr1+1 || sqlit
100f0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61  e3VdbeGetOp(v, a
10100 64 64 72 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ddr1)->opcode==O
10110 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20  P_Function ){.  
10120 20 20 69 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e    iMem = pExpr->
10130 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
10140 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nMem++;.    sql
10150 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10160 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
10170 65 6d 2c 20 30 29 3b 0a 20 20 20 20 70 45 78 70  em, 0);.    pExp
10180 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
10190 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  TER;.  }.}.#endi
101a0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
101b0 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
101c0 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
101d0 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
101e0 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
101f0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e  pression list on
10200 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  to the stack..**
10210 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
10220 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
10230 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68  s pushed onto th
10240 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  e stack..*/.int 
10250 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
10260 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
10270 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
10280 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
10290 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
102a0 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20  pList    /* The 
102b0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
102c0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29  to be coded */.)
102d0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
102e0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
102f0 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
10300 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
10310 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c  turn 0;.  n = pL
10320 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f  ist->nExpr;.  fo
10330 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
10340 2c 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c  , i=n; i>0; i--,
10350 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
10360 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10370 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
10380 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
10390 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
103a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
103b0 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
103c0 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
103d0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
103e0 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
103f0 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
10400 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
10410 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
10420 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
10430 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
10440 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
10450 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
10460 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
10470 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
10480 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
10490 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
104a0 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
104b0 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
104c0 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a   flag is true..*
104d0 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
104e0 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
104f0 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
10500 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
10510 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
10520 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
10530 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
10540 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
10550 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
10560 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
10570 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
10580 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
10590 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
105a0 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
105b0 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
105c0 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
105d0 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
105e0 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
105f0 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
10600 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
10610 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
10620 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
10630 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10640 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
10650 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
10660 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
10670 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
10680 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
10690 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
106a0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
106b0 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72   ckOffset = pPar
106c0 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20  se->ckOffset;.  
106d0 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
106e0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
106f0 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
10700 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
10710 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
10720 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
10730 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
10740 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
10750 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
10760 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
10770 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21  pr->pLeft, d2, !
10780 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
10790 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
107a0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
107b0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
107c0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
107d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
107e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
107f0 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
10800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10810 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
10820 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
10830 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
10840 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
10850 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
10860 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
10870 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
10880 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
10890 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
108a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
108b0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
108c0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
108d0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
108e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
108f0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
10900 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
10910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10920 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
10930 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
10940 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
10950 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
10960 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
10970 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
10980 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
10990 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
109a0 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
109b0 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
109c0 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
109d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
109e0 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
109f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10a00 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
10a10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10a20 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
10a30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10a40 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
10a50 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
10a60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10a70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10a80 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
10a90 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
10aa0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10ab0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
10ac0 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  op, dest, jumpIf
10ad0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
10ae0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10af0 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
10b00 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
10b10 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L: {.      asser
10b20 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
10b30 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  _IsNull );.     
10b40 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
10b50 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
10b60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10b70 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
10b80 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
10b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10ba0 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
10bb0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
10bc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
10bd0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
10be0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
10bf0 78 70 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54  xpression "x BET
10c00 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73  WEEN y AND z" is
10c10 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a   implemented as:
10c20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
10c30 2a 2a 20 31 20 49 46 20 28 78 20 3c 20 79 29 20  ** 1 IF (x < y) 
10c40 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20  GOTO 3.      ** 
10c50 32 20 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f  2 IF (x <= z) GO
10c60 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20  TO <dest>.      
10c70 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ** 3 ....      *
10c80 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
10c90 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
10ca0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
10cb0 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ft;.      Expr *
10cc0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
10cd0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
10ce0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
10cf0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
10d00 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73   pLeft);.      s
10d10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10d20 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
10d30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10d40 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
10d50 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61  pRight);.      a
10d60 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72  ddr = codeCompar
10d70 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
10d80 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c 20   pRight, OP_Lt, 
10d90 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  0, !jumpIfNull);
10da0 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ..      pRight =
10db0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
10dc0 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
10dd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10de0 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
10df0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
10e00 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
10e10 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65  t, pRight, OP_Le
10e20 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
10e30 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ll);..      sqli
10e40 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10e50 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
10e60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10e70 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10e80 61 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  addr);.      sql
10e90 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10ea0 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
10eb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10ec0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
10ed0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10ee0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
10ef0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
10f00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10f10 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e  , OP_If, jumpIfN
10f20 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ull, dest);.    
10f30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10f40 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f   }.  pParse->ckO
10f50 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74  ffset = ckOffset
10f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
10f70 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
10f80 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
10f90 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
10fa0 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
10fb0 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
10fc0 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
10fd0 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
10fe0 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
10ff0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
11000 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
11010 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
11020 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
11030 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
11040 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
11050 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
11060 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
11070 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
11080 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74  s true or fall t
11090 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
110a0 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a  Null is false..*
110b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
110c0 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
110d0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
110e0 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
110f0 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
11100 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
11110 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
11120 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
11130 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73  ckOffset = pPars
11140 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69  e->ckOffset;.  i
11150 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
11160 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
11170 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
11180 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
11190 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
111a0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
111b0 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
111c0 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
111d0 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
111e0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
111f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
11200 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
11210 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
11220 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
11230 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
11240 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
11250 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
11260 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
11270 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
11290 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
112a0 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
112b0 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
112c0 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
112d0 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
112e0 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
112f0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
11300 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
11320 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
11330 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
11340 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
11350 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
11360 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
11370 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
11380 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
11390 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
113a0 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
113b0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
113c0 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
113d0 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
113e0 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
113f0 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
11400 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
11410 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
11420 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
11430 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
11440 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
11450 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
11460 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
11470 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
11480 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
11490 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
114a0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
114b0 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
114c0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
114d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
114e0 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
114f0 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
11500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
11510 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
11520 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
11530 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
11540 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
11550 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
11560 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
11570 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
11580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
11590 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
115a0 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
115b0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
115c0 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
115d0 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
115e0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
115f0 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
11600 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
11610 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
11620 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
11630 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11640 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
11650 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
11660 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
11670 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11680 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
11690 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
116a0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
116b0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
116c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
116d0 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
116e0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
116f0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11700 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11710 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
11720 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
11730 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29  d2, !jumpIfNull)
11740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11750 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
11760 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
11770 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
11780 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
11790 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
117a0 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
117b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
117c0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
117d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
117e0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
117f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
11800 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
11810 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11820 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11830 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
11840 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
11850 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
11860 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
11870 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
11880 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _EQ: {.      sql
11890 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
118a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
118b0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
118c0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
118d0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
118e0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
118f0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
11900 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
11910 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73  >pRight, op, des
11920 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
11930 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11940 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
11950 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
11960 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
11970 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
11980 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
11990 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
119a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
119b0 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74  p(v, op, 1, dest
119c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
119d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
119e0 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
119f0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
11a00 73 69 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45  sion is "x BETWE
11a10 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20  EN y AND z". It 
11a20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
11a30 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
11a40 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20    ** 1 IF (x >= 
11a50 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20  y) GOTO 3.      
11a60 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e  ** 2 GOTO <dest>
11a70 0a 20 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28  .      ** 3 IF (
11a80 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73  x > z) GOTO <des
11a90 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t>.      */.    
11aa0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
11ab0 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
11ac0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
11ad0 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
11ae0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
11af0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
11b00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
11b10 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
11b20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11b30 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11b40 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
11b50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
11b60 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
11b70 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
11b80 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
11b90 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
11ba0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
11bb0 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
11bc0 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b  ht, OP_Ge, addr+
11bd0 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  3, !jumpIfNull);
11be0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
11bf0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
11c00 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
11c10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11c20 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
11c30 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52   dest);.      pR
11c40 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
11c50 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
11c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11c70 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
11c80 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
11c90 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
11ca0 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
11cb0 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75   OP_Gt, dest, ju
11cc0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
11cd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11ce0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
11cf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
11d00 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
11d10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11d20 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11d30 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c  IfNot, jumpIfNul
11d40 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
11d50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
11d60 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  .  pParse->ckOff
11d70 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a  set = ckOffset;.
11d80 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
11d90 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
11da0 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
11db0 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54  trees.  Return T
11dc0 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a  RUE (non-zero).*
11dd0 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  * if they are id
11de0 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75  entical and retu
11df0 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79  rn FALSE if they
11e00 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
11e10 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  ay..**.** Someti
11e20 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
11e30 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c   will return FAL
11e40 53 45 20 65 76 65 6e 20 69 66 20 74 68 65 20 74  SE even if the t
11e50 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
11e60 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
11e70 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
11e80 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
11e90 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
11ea0 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
11eb0 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 46 41  al, we return FA
11ec0 4c 53 45 20 6a 75 73 74 20 74 6f 20 62 65 20 73  LSE just to be s
11ed0 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
11ee0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
11ef0 72 6e 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  rns false, then 
11f00 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c  you do not reall
11f10 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61  y know for certa
11f20 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  in if the two.**
11f30 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
11f40 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
11f50 69 66 20 79 6f 75 20 67 65 74 20 61 20 54 52 55  if you get a TRU
11f60 45 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  E return, then y
11f70 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
11f80 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
11f90 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
11fa0 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
11fb0 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
11fc0 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
11fd0 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
11fe0 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 46  o get an extra F
11ff0 41 4c 53 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a  ALSE - that.** j
12000 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ust might result
12010 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c   in some slightl
12020 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20  y slower code.  
12030 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  But returning.**
12040 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 54 52   an incorrect TR
12050 55 45 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  UE could lead to
12060 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a   a malfunction..
12070 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
12080 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
12090 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20  pA, Expr *pB){. 
120a0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
120b0 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20  ==0||pB==0 ){.  
120c0 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b    return pB==pA;
120d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
120e0 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75  p!=pB->op ) retu
120f0 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d  rn 0;.  if( (pA-
12100 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
12110 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67  inct)!=(pB->flag
12120 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
12130 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
12140 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
12150 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
12160 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72  , pB->pLeft) ) r
12170 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
12180 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
12190 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
121a0 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74  B->pRight) ) ret
121b0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
121c0 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66  >pList ){.    if
121d0 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  ( pB->pList==0 )
121e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
121f0 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45  f( pA->pList->nE
12200 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr!=pB->pList->
12210 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30  nExpr ) return 0
12220 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
12230 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  <pA->pList->nExp
12240 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
12250 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
12260 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74  ompare(pA->pList
12270 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42  ->a[i].pExpr, pB
12280 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
12290 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
122a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
122b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
122c0 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b  if( pB->pList ){
122d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
122e0 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65   }.  if( pA->pSe
122f0 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c  lect || pB->pSel
12300 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ect ) return 0;.
12310 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
12320 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20  !=pB->iTable || 
12330 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
12340 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
12350 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f  n 0;.  if( pA->o
12360 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
12370 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20  pA->token.z ){. 
12380 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e     if( pB->token
12390 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  .z==0 ) return 0
123a0 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  ;.    if( pB->to
123b0 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e  ken.n!=pA->token
123c0 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  .n ) return 0;. 
123d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
123e0 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41  rNICmp((char*)pA
123f0 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a  ->token.z,(char*
12400 29 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d  )pB->token.z,pB-
12410 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a  >token.n)!=0 ){.
12420 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
12430 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12440 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 1;.}.../*.** 
12450 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
12460 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
12470 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
12480 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
12490 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
124a0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
124b0 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
124c0 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
124d0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
124e0 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
124f0 75 6d 6e 28 41 67 67 49 6e 66 6f 20 2a 70 49 6e  umn(AggInfo *pIn
12500 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
12510 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
12520 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
12530 74 65 28 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  te(.       pInfo
12540 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73  ->aCol,.       s
12550 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
12560 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c  l[0]),.       3,
12570 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
12580 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  nColumn,.       
12590 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41  &pInfo->nColumnA
125a0 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  lloc,.       &i.
125b0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
125c0 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64  .}    ../*.** Ad
125d0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
125e0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
125f0 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20  >aFunc[] array. 
12600 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
12610 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
12620 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
12630 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
12640 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
12650 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
12660 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  t addAggInfoFunc
12670 28 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29  (AggInfo *pInfo)
12680 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
12690 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69  fo->aFunc = sqli
126a0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
126b0 28 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  (.       pInfo->
126c0 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69  aFunc,.       si
126d0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e  zeof(pInfo->aFun
126e0 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c  c[0]),.       3,
126f0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
12700 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70  nFunc,.       &p
12710 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63  Info->nFuncAlloc
12720 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
12730 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
12740 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
12750 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
12760 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 75 73  alkExprTree() us
12770 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
12780 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 41  .** sqlite3ExprA
12790 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
127a0 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
127b0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
127c0 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
127d0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
127e0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
127f0 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73  routine analyzes
12800 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
12810 75 6e 63 74 69 6f 6e 20 61 74 20 70 45 78 70 72  unction at pExpr
12820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12830 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
12840 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70  (void *pArg, Exp
12850 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
12860 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
12870 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f  t *pNC = (NameCo
12880 6e 74 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20  ntext *)pArg;.  
12890 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
128a0 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
128b0 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
128c0 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
128d0 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
128e0 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
128f0 67 49 6e 66 6f 3b 0a 20 20 0a 0a 20 20 73 77 69  gInfo;.  ..  swi
12900 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
12910 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
12920 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
12930 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
12940 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
12950 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
12960 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66  umn is in one of
12970 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
12980 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a  he FROM.      **
12990 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
129a0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
129b0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  /.      if( pSrc
129c0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
129d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
129e0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
129f0 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
12a00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
12a10 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
12a20 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
12a30 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
12a40 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
12a50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
12a60 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
12a70 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
12a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
12a90 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
12aa0 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
12ab0 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
12ac0 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
12ad0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
12ae0 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
12af0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
12b00 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
12b10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
12b20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
12b30 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
12b40 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
12b50 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
12b60 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
12b70 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
12b80 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
12b90 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
12ba0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
12bb0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
12bc0 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
12bd0 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
12be0 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
12bf0 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
12c00 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
12c10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
12c20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
12c30 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
12c40 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
12c50 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
12c60 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
12c70 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
12c80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12c90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
12ca0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12cb0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d 70          if( k>=p
12cc0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
12cd0 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49   && (k = addAggI
12ce0 6e 66 6f 43 6f 6c 75 6d 6e 28 70 41 67 67 49 6e  nfoColumn(pAggIn
12cf0 66 6f 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  fo))>=0 ){.     
12d00 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
12d10 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
12d20 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k];.            
12d30 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70    pCol->pTab = p
12d40 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
12d50 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
12d60 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  iTable = pExpr->
12d70 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
12d80 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
12d90 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
12da0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
12db0 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d      pCol->iMem =
12dc0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
12dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
12de0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
12df0 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
12e00 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78         pCol->pEx
12e10 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
12e20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
12e30 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
12e40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12e50 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20      int j, n;.  
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
12e70 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41  prList *pGB = pA
12e80 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
12e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12ea0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
12eb0 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20  t_item *pTerm = 
12ec0 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  pGB->a;.        
12ed0 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d          n = pGB-
12ee0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
12ef0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
12f00 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d   j<n; j++, pTerm
12f10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
12f20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
12f30 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
12f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f50 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
12f60 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69  _COLUMN && pE->i
12f70 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
12f80 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
12fa0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
12fb0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
12fe0 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
13000 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
13010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13020 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13030 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13040 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
13050 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
13060 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
13070 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
13080 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67  terColumn = pAgg
13090 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f  Info->nSortingCo
130a0 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
130b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
130c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
130d0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
130e0 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70  w an entry for p
130f0 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f  Expr in pAggInfo
13100 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72  ->aCol[] (either
13110 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
13120 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74  because it was t
13130 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62  here before or b
13140 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63  ecause we just c
13150 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20  reated it)..    
13160 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65          ** Conve
13170 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20  rt the pExpr to 
13180 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  be a TK_AGG_COLU
13190 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20  MN referring to 
131a0 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20  that.           
131b0 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   ** pAggInfo->aC
131c0 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20  ol[] entry..    
131d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
131e0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
131f0 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
13200 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
13210 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
13220 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
13230 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
13240 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  g = k;.         
13250 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13260 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
13270 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
13280 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
13290 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
132a0 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
132b0 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
132c0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
132d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
132e0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
132f0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e  .      /* The pN
13300 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73  C->nDepth==0 tes
13310 74 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61  t causes aggrega
13320 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
13330 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20  subqueries.     
13340 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65   ** to be ignore
13350 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  d */.      if( p
13360 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b  NC->nDepth==0 ){
13370 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
13380 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
13390 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
133a0 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
133b0 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
133c0 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
133d0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
133e0 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
133f0 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
13400 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
13410 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
13420 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
13430 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
13440 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
13450 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
13460 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
13470 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
13480 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
13490 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29  >pExpr, pExpr) )
134a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
134b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
134c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
134d0 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e     if( i>=pAggIn
134e0 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20  fo->nFunc ){.   
134f0 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20         /* pExpr 
13500 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61  is original.  Ma
13510 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ke a new entry i
13520 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  n pAggInfo->aFun
13530 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  c[].          */
13540 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e  .          u8 en
13550 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
13560 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  db);.          i
13570 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e   = addAggInfoFun
13580 63 28 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20  c(pAggInfo);.   
13590 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
135a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
135b0 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
135c0 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
135d0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
135e0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
135f0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
13600 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
13610 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nMem++;.        
13620 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
13630 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
13640 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
13650 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
13660 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78        (char*)pEx
13670 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
13680 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20  pr->token.n,.   
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136a0 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70  pExpr->pList ? p
136b0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
136c0 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
136d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
136e0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
136f0 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
13710 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
13720 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
13730 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
13740 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
13750 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
13760 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
13770 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13780 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
13790 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
137a0 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
137b0 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
137c0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
137d0 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
137e0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
137f0 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  g = i;.        p
13800 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
13810 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
13820 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
13830 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
13840 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79    /* Recursively
13850 20 77 61 6c 6b 20 73 75 62 71 75 65 72 69 65 73   walk subqueries
13860 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 54 4b 5f   looking for TK_
13870 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61  COLUMN nodes tha
13880 74 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 62  t need.  ** to b
13890 65 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  e changed to TK_
138a0 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75 74  AGG_COLUMN.  But
138b0 20 69 6e 63 72 65 6d 65 6e 74 20 6e 44 65 70 74   increment nDept
138c0 68 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 54  h so that.  ** T
138d0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
138e0 6f 64 65 73 20 69 6e 20 73 75 62 71 75 65 72 69  odes in subqueri
138f0 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 63 68 61  es will be uncha
13900 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
13910 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
13920 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70  ){.    pNC->nDep
13930 74 68 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65  th++;.    walkSe
13940 6c 65 63 74 45 78 70 72 28 70 45 78 70 72 2d 3e  lectExpr(pExpr->
13950 70 53 65 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65  pSelect, analyze
13960 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b  Aggregate, pNC);
13970 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
13980 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  --;.  }.  return
13990 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   0;.}../*.** Ana
139a0 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65  lyze the given e
139b0 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
139c0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
139d0 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
139e0 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
139f0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
13a00 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72  dded to the pPar
13a10 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
13a20 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69  ..** Make additi
13a30 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20  onal entries to 
13a40 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
13a50 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
13a60 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
13a70 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
13a80 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
13a90 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
13aa0 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
13ab0 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
13ac0 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
13ad0 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ames()..**.** If
13ae0 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e   errors are seen
13af0 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
13b00 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72   message in zErr
13b10 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  Msg and return.*
13b20 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
13b30 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
13b40 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
13b50 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
13b60 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
13b70 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
13b80 74 20 6e 45 72 72 20 3d 20 70 4e 43 2d 3e 70 50  t nErr = pNC->pP
13b90 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61  arse->nErr;.  wa
13ba0 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
13bb0 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  , analyzeAggrega
13bc0 74 65 2c 20 70 4e 43 29 3b 0a 20 20 72 65 74 75  te, pNC);.  retu
13bd0 72 6e 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  rn pNC->pParse->
13be0 6e 45 72 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a  nErr - nErr;.}..
13bf0 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
13c00 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
13c10 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
13c20 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
13c30 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
13c40 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
13c50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
13c60 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
13c70 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
13c80 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
13c90 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
13ca0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
13cb0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
13cc0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
13cd0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
13ce0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
13cf0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
13d00 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
13d10 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28   nErr = 0;.  if(
13d20 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
13d30 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
13d40 2c 20 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26  , i=0; nErr==0 &
13d50 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  & i<pList->nExpr
13d60 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
13d70 0a 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 73  .      nErr += s
13d80 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
13d90 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
13da0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
13db0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
13dc0 72 6e 20 6e 45 72 72 3b 0a 7d 0a                 rn nErr;.}.