/ Hex Artifact Content
Login

Artifact 3bf54eca0b0d34bd097750c622d4490a08e78a2b:


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 34 35 20 32 30 30 36 2f 30 31 2f 30 39 20  .245 2006/01/09 
0220: 30 36 3a 32 39 3a 34 38 20 64 61 6e 69 65 6c 6b  06:29:48 danielk
0230: 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69  1977 Exp $.*/.#i
0240: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0250: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0260: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 52  type.h>../*.** R
0270: 65 74 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e  eturn the 'affin
0280: 69 74 79 27 20 6f 66 20 74 68 65 20 65 78 70 72  ity' of the expr
0290: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20  ession pExpr if 
02a0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  any..**.** If pE
02b0: 78 70 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  xpr is a column,
02c0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
02d0: 61 20 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20  a column via an 
02e0: 27 41 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f  'AS' alias,.** o
02f0: 72 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77  r a sub-select w
0300: 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20  ith a column as 
0310: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
0320: 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61  , then the .** a
0330: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20  ffinity of that 
0340: 63 6f 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e  column is return
0350: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
0360: 78 30 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c  x00 is returned,
0370: 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  .** indicating n
0380: 6f 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74  o affinity for t
0390: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
03a0: 2a 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48  *.** i.e. the WH
03b0: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
03c0: 73 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 66  sssions in the f
03d0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
03e0: 6e 74 73 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20  nts all.** have 
03f0: 61 6e 20 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a  an affinity:.**.
0400: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
0410: 74 31 28 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54  t1(a);.** SELECT
0420: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
0430: 20 61 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20   a;.** SELECT a 
0440: 41 53 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45  AS b FROM t1 WHE
0450: 52 45 20 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20  RE b;.** SELECT 
0460: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
0470: 28 73 65 6c 65 63 74 20 61 20 66 72 6f 6d 20 74  (select a from t
0480: 31 29 3b 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  1);.*/.char sqli
0490: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
04b0: 69 6e 74 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  int op = pExpr->
04c0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
04d0: 5f 41 53 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _AS ){.    retur
04e0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  n sqlite3ExprAff
04f0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
0500: 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ft);.  }.  if( o
0510: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
0520: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
0530: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0540: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Expr->pSelect->p
0550: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
0560: 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  r);.  }.#ifndef 
0570: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
0580: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41  .  if( op==TK_CA
0590: 53 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ST ){.    return
05a0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
05b0: 54 79 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b  Type(&pExpr->tok
05c0: 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  en);.  }.#endif.
05d0: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
05e0: 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a  affinity;.}../*.
05f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
0600: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
0610: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
0620: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0630: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
0640: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
0650: 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74  lation type, ret
0660: 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65  urn 0..*/.CollSe
0670: 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  q *sqlite3ExprCo
0680: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
0690: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
06a0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
06b0: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  oll = 0;.  if( p
06c0: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Expr ){.    pCol
06d0: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
06e0: 3b 0a 20 20 20 20 69 66 28 20 28 70 45 78 70 72  ;.    if( (pExpr
06f0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 7c 7c 20 70  ->op==TK_AS || p
0700: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53  Expr->op==TK_CAS
0710: 54 29 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  T) && !pColl ){.
0720: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
0730: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
0740: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
0750: 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Left);.    }.  }
0760: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
0770: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
0780: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
0790: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
07a0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
07b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
07c0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
07d0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
07e0: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
07f0: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
0800: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
0810: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
0820: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
0830: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
0840: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
0850: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
0860: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
0870: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
0880: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
0890: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
08a0: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
08b0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
08c0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08d0: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
08e0: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
08f0: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
0900: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
0910: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
0920: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
0930: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
0940: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
0950: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
0960: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
0970: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0980: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
0990: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
09a0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
09b0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
09c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
09d0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
09e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
09f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
0a00: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
0a10: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
0a20: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
0a30: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
0a40: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
0a50: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
0a60: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
0a70: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
0a80: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
0a90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
0aa0: 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NONE;.  }else{.
0ab0: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
0ac0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
0ad0: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
0ae0: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
0af0: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
0b00: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
0b10: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
0b20: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
0b30: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
0b40: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
0b50: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
0b60: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
0b70: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
0b80: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
0b90: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
0ba0: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
0bb0: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
0bc0: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
0bd0: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
0be0: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
0bf0: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
0c00: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
0c10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
0c20: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0c30: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
0c40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
0c50: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
0c60: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
0c70: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
0c80: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
0c90: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
0ca0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ->op==TK_NE );. 
0cb0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0cc0: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
0cd0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
0ce0: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
0cf0: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
0d00: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
0d10: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
0d20: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
0d30: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
0d40: 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
0d50: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
0d60: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
0d70: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
0d80: 74 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  ty(pExpr->pSelec
0d90: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
0da0: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
0db0: 0a 20 20 65 6c 73 65 20 69 66 28 20 21 61 66 66  .  else if( !aff
0dc0: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
0dd0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
0de0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
0df0: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ff;.}../*.** pEx
0e00: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
0e10: 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65  on expression, e
0e20: 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28  g. '=', '<', IN(
0e30: 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78  ...) etc..** idx
0e40: 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65  _affinity is the
0e50: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20   affinity of an 
0e60: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20  indexed column. 
0e70: 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69  Return true.** i
0e80: 66 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  f the index with
0e90: 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66   affinity idx_af
0ea0: 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73  finity may be us
0eb0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
0ec0: 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ** the compariso
0ed0: 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69  n in pExpr..*/.i
0ee0: 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  nt sqlite3IndexA
0ef0: 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a  ffinityOk(Expr *
0f00: 70 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f  pExpr, char idx_
0f10: 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61  affinity){.  cha
0f20: 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73  r aff = comparis
0f30: 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  onAffinity(pExpr
0f40: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66  );.  switch( aff
0f50: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
0f60: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20  ITE_AFF_NONE:.  
0f70: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
0f80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
0f90: 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65  F_TEXT:.      re
0fa0: 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74  turn idx_affinit
0fb0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
0fc0: 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  XT;.    default:
0fd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
0fe0: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
0ff0: 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e  finity(idx_affin
1000: 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ity);.  }.}../*.
1010: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 31  ** Return the P1
1020: 20 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75   value that shou
1030: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ld be used for a
1040: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
1050: 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50  on.** opcode (OP
1060: 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29  _Eq, OP_Ge etc.)
1070: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
1080: 20 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70   pExpr1 and pExp
1090: 72 32 2e 0a 2a 2a 20 49 66 20 6a 75 6d 70 49 66  r2..** If jumpIf
10a0: 4e 75 6c 6c 20 69 73 20 74 72 75 65 2c 20 74 68  Null is true, th
10b0: 65 6e 20 73 65 74 20 74 68 65 20 6c 6f 77 20 62  en set the low b
10c0: 79 74 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  yte of the retur
10d0: 6e 65 64 0a 2a 2a 20 50 31 20 76 61 6c 75 65 20  ned.** P1 value 
10e0: 74 6f 20 74 65 6c 6c 20 74 68 65 20 6f 70 63 6f  to tell the opco
10f0: 64 65 20 74 6f 20 6a 75 6d 70 20 69 66 20 65 69  de to jump if ei
1100: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
1110: 2a 2a 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ** evaluates to 
1120: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
1130: 69 6e 74 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  int binaryCompar
1140: 65 50 31 28 45 78 70 72 20 2a 70 45 78 70 72 31  eP1(Expr *pExpr1
1150: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20  , Expr *pExpr2, 
1160: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1170: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 73 71  .  char aff = sq
1180: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1190: 79 28 70 45 78 70 72 32 29 3b 0a 20 20 72 65 74  y(pExpr2);.  ret
11a0: 75 72 6e 20 28 28 69 6e 74 29 73 71 6c 69 74 65  urn ((int)sqlite
11b0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
11c0: 28 70 45 78 70 72 31 2c 20 61 66 66 29 29 2b 28  (pExpr1, aff))+(
11d0: 6a 75 6d 70 49 66 4e 75 6c 6c 3f 30 78 31 30 30  jumpIfNull?0x100
11e0: 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  :0);.}../*.** Re
11f0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1200: 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  o the collation 
1210: 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 73 68  sequence that sh
1220: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a  ould be used by.
1230: 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  ** a binary comp
1240: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20  arison operator 
1250: 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20  comparing pLeft 
1260: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a  and pRight..**.*
1270: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 68 61  * If the left ha
1280: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  nd expression ha
1290: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
12a0: 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65  quence type, the
12b0: 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e  n it is.** used.
12c0: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
12d0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
12e0: 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20  e for the right 
12f0: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a  hand expression.
1300: 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74  ** is used, or t
1310: 68 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41  he default (BINA
1320: 52 59 29 20 69 66 20 6e 65 69 74 68 65 72 20 65  RY) if neither e
1330: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
1340: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70  collating.** typ
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
1360: 6c 53 65 71 2a 20 62 69 6e 61 72 79 43 6f 6d 70  lSeq* binaryComp
1370: 61 72 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  areCollSeq(Parse
1380: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1390: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
13a0: 67 68 74 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ght){.  CollSeq 
13b0: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
13c0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
13d0: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 69 66  se, pLeft);.  if
13e0: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
13f0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1400: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1410: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  e, pRight);.  }.
1420: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
1430: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1440: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
1450: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
1460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1470: 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50  codeCompare(.  P
1480: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1490: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
14a0: 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61  (and code genera
14b0: 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f  ting) context */
14c0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
14d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
14e0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
14f0: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
1500: 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65  /* The right ope
1510: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  rand */.  int op
1520: 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  code,       /* T
1530: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
1540: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  code */.  int de
1550: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
1560: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
1570: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
1580: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
1590: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
15a0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
15b0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
15c0: 20 70 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p1 = binaryComp
15d0: 61 72 65 50 31 28 70 4c 65 66 74 2c 20 70 52 69  areP1(pLeft, pRi
15e0: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
15f0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 33 20  ;.  CollSeq *p3 
1600: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  = binaryCompareC
1610: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1620: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
1630: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1640: 64 62 65 4f 70 33 28 70 50 61 72 73 65 2d 3e 70  dbeOp3(pParse->p
1650: 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 70 31  Vdbe, opcode, p1
1660: 2c 20 64 65 73 74 2c 20 28 76 6f 69 64 2a 29 70  , dest, (void*)p
1670: 33 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  3, P3_COLLSEQ);.
1680: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
1690: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
16a0: 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74  ion node and ret
16b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
16c0: 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20   it.  Memory.** 
16d0: 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 69 73  for this node is
16e0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
16f0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20  qliteMalloc().  
1700: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
1710: 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
1720: 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
1730: 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20  g sure the node 
1740: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
1750: 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  freed..*/.Expr *
1760: 73 71 6c 69 74 65 33 45 78 70 72 28 69 6e 74 20  sqlite3Expr(int 
1770: 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  op, Expr *pLeft,
1780: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 63   Expr *pRight, c
1790: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
17a0: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
17b0: 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  w;.  pNew = sqli
17c0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
17d0: 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20  (Expr) );.  if( 
17e0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pNew==0 ){.    /
17f0: 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  * When malloc fa
1800: 69 6c 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66  ils, delete pLef
1810: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78  t and pRight. Ex
1820: 70 72 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64  pressions passed
1830: 20 74 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73   to .    ** this
1840: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61   function must a
1850: 6c 77 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74  lways be allocat
1860: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 45  ed with sqlite3E
1870: 78 70 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a  xpr() for this .
1880: 20 20 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a      ** reason. .
1890: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
18a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65  e3ExprDelete(pLe
18b0: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
18c0: 45 78 70 72 44 65 6c 65 74 65 28 70 52 69 67 68  ExprDelete(pRigh
18d0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
18e0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70  ;.  }.  pNew->op
18f0: 20 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70   = op;.  pNew->p
1900: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
1910: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70  pNew->pRight = p
1920: 52 69 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69  Right;.  pNew->i
1930: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Agg = -1;.  if( 
1940: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73  pToken ){.    as
1950: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
1960: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77  n==0 );.    pNew
1970: 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74  ->span = pNew->t
1980: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
1990: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66    }else if( pLef
19a0: 74 20 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20  t && pRight ){. 
19b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70     sqlite3ExprSp
19c0: 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d  an(pNew, &pLeft-
19d0: 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e  >span, &pRight->
19e0: 73 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  span);.  }.  ret
19f0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
1a00: 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** When doing a 
1a10: 6e 65 73 74 65 64 20 70 61 72 73 65 2c 20 79 6f  nested parse, yo
1a20: 75 20 63 61 6e 20 69 6e 63 6c 75 64 65 20 74 65  u can include te
1a30: 72 6d 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73  rms in an expres
1a40: 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f  sion.** that loo
1a50: 6b 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 20 23  k like this:   #
1a60: 30 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65  0 #1 #2 ...  The
1a70: 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74  se terms refer t
1a80: 6f 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e  o elements.** on
1a90: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 22 23 30   the stack.  "#0
1aa0: 22 20 6d 65 61 6e 73 20 74 68 65 20 74 6f 70 20  " means the top 
1ab0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
1ac0: 20 22 23 31 22 20 6d 65 61 6e 73 20 74 68 65 20   "#1" means the 
1ad0: 6e 65 78 74 20 64 6f 77 6e 20 6f 6e 20 74 68 65  next down on the
1ae0: 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 73 6f 20   stack.  And so 
1af0: 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  forth..**.** Thi
1b00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1b10: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1b20: 72 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6f  r to deal with o
1b30: 6e 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  n of those terms
1b40: 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61 74  ..** It immediat
1b50: 65 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ely generates co
1b60: 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
1b70: 76 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72  value in a memor
1b80: 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54  y location..** T
1b90: 68 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78  he returns an ex
1ba0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 69  pression that wi
1bb0: 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  ll code to extra
1bc0: 63 74 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ct the value fro
1bd0: 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79  m.** that memory
1be0: 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65 65   location as nee
1bf0: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ded..*/.Expr *sq
1c00: 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70  lite3RegisterExp
1c10: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1c20: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1c30: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1c40: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78  rse->pVdbe;.  Ex
1c50: 70 72 20 2a 70 3b 0a 20 20 69 6e 74 20 64 65 70  pr *p;.  int dep
1c60: 74 68 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  th;.  if( pParse
1c70: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20  ->nested==0 ){. 
1c80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c90: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72  sg(pParse, "near
1ca0: 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20   \"%T\": syntax 
1cb0: 65 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b  error", pToken);
1cc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1cd0: 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20   }.  if( v==0 ) 
1ce0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20  return 0;.  p = 
1cf0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52  sqlite3Expr(TK_R
1d00: 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20 70  EGISTER, 0, 0, p
1d10: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 3d  Token);.  if( p=
1d20: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1d30: 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66   0;  /* Malloc f
1d40: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 64  ailed */.  }.  d
1d50: 65 70 74 68 20 3d 20 61 74 6f 69 28 28 63 68 61  epth = atoi((cha
1d60: 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  r*)&pToken->z[1]
1d70: 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  );.  p->iTable =
1d80: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
1d90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1da0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64  dOp(v, OP_Dup, d
1db0: 65 70 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c 69  epth, 0);.  sqli
1dc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1dd0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d 3e  OP_MemStore, p->
1de0: 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72 65  iTable, 1);.  re
1df0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1e00: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
1e10: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
1e20: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
1e30: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
1e40: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
1e50: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1e60: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
1e70: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
1e80: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 45 78  qlite3ExprAnd(Ex
1e90: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
1ea0: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
1eb0: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
1ec0: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
1ed0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
1ee0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
1ef0: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
1f00: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
1f10: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
1f20: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
1f30: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1f40: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73  * Set the Expr.s
1f50: 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65  pan field of the
1f60: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1f70: 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a  n to span all.**
1f80: 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68   text between th
1f90: 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65  e two given toke
1fa0: 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
1fb0: 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72  te3ExprSpan(Expr
1fc0: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
1fd0: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
1fe0: 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28  ight){.  assert(
1ff0: 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
2000: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
2010: 20 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   );.  if( !sqlit
2020: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e  e3ThreadData()->
2030: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
2040: 70 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65  pRight->z && pLe
2050: 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 61 73 73  ft->z ){.    ass
2060: 65 72 74 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d  ert( pLeft->dyn=
2070: 3d 30 20 7c 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70  =0 || pLeft->z[p
2080: 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20  Left->n]==0 );. 
2090: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 64 79     if( pLeft->dy
20a0: 6e 3d 3d 30 20 26 26 20 70 52 69 67 68 74 2d 3e  n==0 && pRight->
20b0: 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dyn==0 ){.      
20c0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
20d0: 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 20 20  pLeft->z;.      
20e0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20  pExpr->span.n = 
20f0: 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70 52 69  pRight->n + (pRi
2100: 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d 3e  ght->z - pLeft->
2110: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
2120: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
2130: 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  .z = 0;.    }.  
2140: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
2150: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
2160: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
2170: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
2180: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
2190: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
21a0: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
21b0: 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  on(ExprList *pLi
21c0: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
21d0: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  n){.  Expr *pNew
21e0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
21f0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
2200: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
2210: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
2220: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2230: 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41  ete(pList); /* A
2240: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
2250: 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  ory when malloc 
2260: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
2270: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
2280: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54  w->op = TK_FUNCT
2290: 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ION;.  pNew->pLi
22a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 69 66  st = pList;.  if
22b0: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
22c0: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
22d0: 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e  dyn==0 );.    pN
22e0: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
22f0: 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ken;.  }else{.  
2300: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20    pNew->token.z 
2310: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  = 0;.  }.  pNew-
2320: 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f  >span = pNew->to
2330: 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ken;.  return pN
2340: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
2350: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
2360: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
2370: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
2380: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
2390: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
23a0: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
23b0: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
23c0: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
23d0: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
23e0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
23f0: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
2400: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
2410: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
2420: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
2430: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
2440: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
2450: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
2460: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
2470: 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f  ot too be to avo
2480: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
2490: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
24a0: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
24b0: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
24c0: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
24d0: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
24e0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
24f0: 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61  rm ":aaa" or "$a
2500: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
2510: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
2520: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
2530: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
2540: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
2550: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
2560: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
2570: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
2580: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
2590: 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69  t sequenial vari
25a0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
25b0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
25c0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
25d0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
25e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
25f0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f  pr *pExpr){.  To
2600: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 69  ken *pToken;.  i
2610: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
2620: 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d  turn;.  pToken =
2630: 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a   &pExpr->token;.
2640: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
2650: 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ->n>=1 );.  asse
2660: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30  rt( pToken->z!=0
2670: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
2680: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b  oken->z[0]!=0 );
2690: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e  .  if( pToken->n
26a0: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==1 ){.    /* Wi
26b0: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
26c0: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
26d0: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
26e0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
26f0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
2700: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  ++pParse->nVar;.
2710: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b    }else if( pTok
2720: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  en->z[0]=='?' ){
2730: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
2740: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
2750: 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e  nn".  Convert "n
2760: 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nn" to an intege
2770: 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65  r and.    ** use
2780: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
2790: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
27a0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78    int i;.    pEx
27b0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d  pr->iTable = i =
27c0: 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54   atoi((char*)&pT
27d0: 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20  oken->z[1]);.   
27e0: 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51   if( i<1 || i>SQ
27f0: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
2800: 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20  E_NUMBER ){.    
2810: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2820: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
2830: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
2840: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
2850: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
2860: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
2870: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20  IABLE_NUMBER);. 
2880: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70     }.    if( i>p
2890: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
28a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
28b0: 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  r = i;.    }.  }
28c0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  else{.    /* Wil
28d0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
28e0: 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61  rm ":aaa" or "$a
28f0: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
2900: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
2910: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
2920: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
2930: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
2940: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
2950: 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  name.    ** has 
2960: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
2970: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
2980: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
2990: 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20  umber.    */.   
29a0: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e   int i, n;.    n
29b0: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20   = pToken->n;.  
29c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
29d0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69  rse->nVarExpr; i
29e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
29f0: 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28  *pE;.      if( (
2a00: 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56  pE = pParse->apV
2a10: 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20  arExpr[i])!=0.  
2a20: 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74          && pE->t
2a30: 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20  oken.n==n.      
2a40: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45      && memcmp(pE
2a50: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65  ->token.z, pToke
2a60: 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  n->z, n)==0 ){. 
2a70: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
2a80: 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c  able = pE->iTabl
2a90: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
2aa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ab0: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
2ac0: 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20  e->nVarExpr ){. 
2ad0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
2ae0: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
2af0: 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Var;.      if( p
2b00: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e  Parse->nVarExpr>
2b10: 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  =pParse->nVarExp
2b20: 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20  rAlloc-1 ){.    
2b30: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
2b40: 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61  ExprAlloc += pPa
2b50: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
2b60: 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  oc + 10;.       
2b70: 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f   sqlite3ReallocO
2b80: 72 46 72 65 65 28 28 76 6f 69 64 2a 2a 29 26 70  rFree((void**)&p
2b90: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
2ba0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2bb0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
2bc0: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73  >nVarExprAlloc*s
2bd0: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 70  izeof(pParse->ap
2be0: 56 61 72 45 78 70 72 5b 30 5d 29 20 29 3b 0a 20  VarExpr[0]) );. 
2bf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2c00: 20 21 73 71 6c 69 74 65 33 54 68 72 65 61 64 44   !sqlite3ThreadD
2c10: 61 74 61 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ata()->mallocFai
2c20: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  led ){.        a
2c30: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
2c40: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
2c50: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
2c60: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
2c70: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
2c80: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
2c90: 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a    }.  } .}../*.*
2ca0: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
2cb0: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
2cc0: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  on tree..*/.void
2cd0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
2ce0: 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  te(Expr *p){.  i
2cf0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
2d00: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e  ;.  if( p->span.
2d10: 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65  dyn ) sqliteFree
2d20: 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e  ((char*)p->span.
2d30: 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b  z);.  if( p->tok
2d40: 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46  en.dyn ) sqliteF
2d50: 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f  ree((char*)p->to
2d60: 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65  ken.z);.  sqlite
2d70: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
2d80: 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Left);.  sqlite3
2d90: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 52  ExprDelete(p->pR
2da0: 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ight);.  sqlite3
2db0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2dc0: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  ->pList);.  sqli
2dd0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
2de0: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  p->pSelect);.  s
2df0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
2e00: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  ./*.** The Expr.
2e10: 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d 69 67 68  token field migh
2e20: 74 20 62 65 20 61 20 73 74 72 69 6e 67 20 6c 69  t be a string li
2e30: 74 65 72 61 6c 20 74 68 61 74 20 69 73 20 71 75  teral that is qu
2e40: 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20  oted..** If so, 
2e50: 72 65 6d 6f 76 65 20 74 68 65 20 71 75 6f 74 61  remove the quota
2e60: 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76  tion marks..*/.v
2e70: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 71 75 6f  oid sqlite3Dequo
2e80: 74 65 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b  teExpr(Expr *p){
2e90: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e  .  if( ExprHasAn
2ea0: 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  yProperty(p, EP_
2eb0: 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20 20 20  Dequoted) ){.   
2ec0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 45   return;.  }.  E
2ed0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2ee0: 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 3b 0a  , EP_Dequoted);.
2ef0: 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64    if( p->token.d
2f00: 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  yn==0 ){.    sql
2f10: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
2f20: 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f 6b  ->token, &p->tok
2f30: 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  en);.  }.  sqlit
2f40: 65 33 44 65 71 75 6f 74 65 28 28 63 68 61 72 2a  e3Dequote((char*
2f50: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a  )p->token.z);.}.
2f60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2f70: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
2f80: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
2f90: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
2fa0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
2fb0: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
2fc0: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
2fd0: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
2fe0: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
2ff0: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
3000: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
3010: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
3020: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
3030: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
3040: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
3050: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
3060: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
3070: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
3080: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
3090: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
30a0: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
30b0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
30c0: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
30d0: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
30e0: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
30f0: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
3100: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
3110: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
3120: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
3130: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
3140: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
3150: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
3160: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
3170: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
3180: 6c 69 74 65 33 45 78 70 72 44 75 70 28 45 78 70  lite3ExprDup(Exp
3190: 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70  r *p){.  Expr *p
31a0: 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  New;.  if( p==0 
31b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
31c0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
31d0: 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 29  cRaw( sizeof(*p)
31e0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
31f0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3200: 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c 20  memcpy(pNew, p, 
3210: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
3220: 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a    if( p->token.z
3230: 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  !=0 ){.    pNew-
3240: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a 29  >token.z = (u8*)
3250: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63  sqliteStrNDup((c
3260: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c  har*)p->token.z,
3270: 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20   p->token.n);.  
3280: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79    pNew->token.dy
3290: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 1;.  }else{.
32a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
32b0: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a  ->token.z==0 );.
32c0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e    }.  pNew->span
32d0: 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  .z = 0;.  pNew->
32e0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
32f0: 78 70 72 44 75 70 28 70 2d 3e 70 4c 65 66 74 29  xprDup(p->pLeft)
3300: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
3310: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
3320: 70 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  p(p->pRight);.  
3330: 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71  pNew->pList = sq
3340: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
3350: 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e  (p->pList);.  pN
3360: 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  ew->pSelect = sq
3370: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
3380: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 4e  ->pSelect);.  pN
3390: 65 77 2d 3e 70 54 61 62 20 3d 20 70 2d 3e 70 54  ew->pTab = p->pT
33a0: 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ab;.  return pNe
33b0: 77 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  w;.}.void sqlite
33c0: 33 54 6f 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e  3TokenCopy(Token
33d0: 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46   *pTo, Token *pF
33e0: 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d  rom){.  if( pTo-
33f0: 3e 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65  >dyn ) sqliteFre
3400: 65 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29  e((char*)pTo->z)
3410: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a  ;.  if( pFrom->z
3420: 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d   ){.    pTo->n =
3430: 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70   pFrom->n;.    p
3440: 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29 73 71 6c  To->z = (u8*)sql
3450: 69 74 65 53 74 72 4e 44 75 70 28 28 63 68 61 72  iteStrNDup((char
3460: 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f  *)pFrom->z, pFro
3470: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e  m->n);.    pTo->
3480: 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dyn = 1;.  }else
3490: 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30  {.    pTo->z = 0
34a0: 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74  ;.  }.}.ExprList
34b0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
34c0: 74 44 75 70 28 45 78 70 72 4c 69 73 74 20 2a 70  tDup(ExprList *p
34d0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
34e0: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
34f0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
3500: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
3510: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
3520: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3530: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
3540: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
3550: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
3560: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
3570: 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d  .  pNew->nExpr =
3580: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
3590: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77  p->nExpr;.  pNew
35a0: 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71  ->a = pItem = sq
35b0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e  liteMalloc( p->n
35c0: 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  Expr*sizeof(p->a
35d0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49  [0]) );.  if( pI
35e0: 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tem==0 ){.    sq
35f0: 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b 0a  liteFree(pNew);.
3600: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3610: 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20  } .  pOldItem = 
3620: 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p->a;.  for(i=0;
3630: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
3640: 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49  , pItem++, pOldI
3650: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
3660: 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c   *pNewExpr, *pOl
3670: 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  dExpr;.    pItem
3680: 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45 78  ->pExpr = pNewEx
3690: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
36a0: 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d 20 70  Dup(pOldExpr = p
36b0: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  OldItem->pExpr);
36c0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70  .    if( pOldExp
36d0: 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20  r->span.z!=0 && 
36e0: 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20 20  pNewExpr ){.    
36f0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65    /* Always make
3700: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
3710: 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65  pan for top-leve
3720: 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  l expressions in
3730: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78   the.      ** ex
3740: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
3750: 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c  The logic in SEL
3760: 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74  ECT processing t
3770: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20  hat determines. 
3780: 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65       ** the name
3790: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s of columns in 
37a0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6e  the result set n
37b0: 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d  eeds this inform
37c0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73  ation */.      s
37d0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
37e0: 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c  &pNewExpr->span,
37f0: 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e   &pOldExpr->span
3800: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
3810: 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30  ert( pNewExpr==0
3820: 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70   || pNewExpr->sp
3830: 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20  an.z!=0 .       
3840: 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72       || pOldExpr
3850: 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73  ->span.z==0 || s
3860: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
3870: 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ()->mallocFailed
3880: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
3890: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
38a0: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  Dup(pOldItem->zN
38b0: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
38c0: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c  >sortOrder = pOl
38d0: 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  dItem->sortOrder
38e0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41  ;.    pItem->isA
38f0: 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  gg = pOldItem->i
3900: 73 41 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d  sAgg;.    pItem-
3910: 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  >done = 0;.  }. 
3920: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
3930: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
3940: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
3950: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
3960: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
3970: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
3980: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
3990: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
39a0: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
39b0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
39c0: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
39d0: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
39e0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
39f0: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
3a00: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
3a10: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
3a20: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
3a30: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
3a40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3a50: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
3a60: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
3a70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
3a80: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
3a90: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 53  ite3SrcListDup(S
3aa0: 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53 72  rcList *p){.  Sr
3ab0: 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  cList *pNew;.  i
3ac0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74  nt i;.  int nByt
3ad0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
3ae0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
3af0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
3b00: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
3b10: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
3b20: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
3b30: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
3b40: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74  eMallocRaw( nByt
3b50: 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  e );.  if( pNew=
3b60: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3b70: 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e   pNew->nSrc = pN
3b80: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
3b90: 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nSrc;.  for(i=0;
3ba0: 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29   i<p->nSrc; i++)
3bb0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
3bc0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
3bd0: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
3be0: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ];.    struct Sr
3bf0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  cList_item *pOld
3c00: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
3c10: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
3c20: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3c30: 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
3c40: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
3c50: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
3c60: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
3c70: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
3c80: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  p(pOldItem->zNam
3c90: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
3ca0: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
3cb0: 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  eStrDup(pOldItem
3cc0: 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70  ->zAlias);.    p
3cd0: 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  NewItem->jointyp
3ce0: 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f  e = pOldItem->jo
3cf0: 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77  intype;.    pNew
3d00: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
3d10: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
3d20: 72 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e  r;.    pTab = pN
3d30: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
3d40: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
3d50: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
3d60: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
3d70: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
3d80: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
3d90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
3da0: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c  p(pOldItem->pSel
3db0: 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ect);.    pNewIt
3dc0: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
3dd0: 33 45 78 70 72 44 75 70 28 70 4f 6c 64 49 74 65  3ExprDup(pOldIte
3de0: 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65  m->pOn);.    pNe
3df0: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
3e00: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
3e10: 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e  (pOldItem->pUsin
3e20: 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  g);.    pNewItem
3e30: 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64  ->colUsed = pOld
3e40: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
3e50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
3e60: 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  ;.}.IdList *sqli
3e70: 74 65 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c  te3IdListDup(IdL
3e80: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
3e90: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
3ea0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3eb0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
3ec0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
3ed0: 77 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  w( sizeof(*pNew)
3ee0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
3ef0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3f00: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77  pNew->nId = pNew
3f10: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49  ->nAlloc = p->nI
3f20: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
3f30: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
3f40: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
3f50: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
3f60: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20  pNew->a==0 ){.  
3f70: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65    sqliteFree(pNe
3f80: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
3f90: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
3fa0: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
3fb0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
3fc0: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
3fd0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
3fe0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
3ff0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
4000: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
4010: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
4020: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
4030: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65  (pOldItem->zName
4040: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4050: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
4060: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
4070: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
4080: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
4090: 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Dup(Select *p){.
40a0: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
40b0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
40c0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
40d0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
40e0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
40f0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
4100: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
4110: 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
4120: 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70  >isDistinct;.  p
4130: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
4140: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
4150: 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  (p->pEList);.  p
4160: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
4170: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d  te3SrcListDup(p-
4180: 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e  >pSrc);.  pNew->
4190: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
41a0: 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72  ExprDup(p->pWher
41b0: 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  e);.  pNew->pGro
41c0: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
41d0: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72  prListDup(p->pGr
41e0: 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  oupBy);.  pNew->
41f0: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
4200: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76  3ExprDup(p->pHav
4210: 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ing);.  pNew->pO
4220: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
4230: 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70  ExprListDup(p->p
4240: 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77  OrderBy);.  pNew
4250: 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  ->op = p->op;.  
4260: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73  pNew->pPrior = s
4270: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
4280: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e  p->pPrior);.  pN
4290: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  ew->pLimit = sql
42a0: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
42b0: 4c 69 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  Limit);.  pNew->
42c0: 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65  pOffset = sqlite
42d0: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4f 66 66  3ExprDup(p->pOff
42e0: 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  set);.  pNew->iL
42f0: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  imit = -1;.  pNe
4300: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  w->iOffset = -1;
4310: 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c  .  pNew->isResol
4320: 76 65 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c  ved = p->isResol
4330: 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41  ved;.  pNew->isA
4340: 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20  gg = p->isAgg;. 
4350: 20 70 4e 65 77 2d 3e 75 73 65 73 56 69 72 74 20   pNew->usesVirt 
4360: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73  = 0;.  pNew->dis
4370: 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30  allowOrderBy = 0
4380: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
4390: 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  most = 0;.  pNew
43a0: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30  ->addrOpenVirt[0
43b0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
43c0: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20  addrOpenVirt[1] 
43d0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
43e0: 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20  drOpenVirt[2] = 
43f0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  -1;.  return pNe
4400: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
4410: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
4420: 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Dup(Select *p){.
4430: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
4440: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
4450: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
4460: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
4470: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
4480: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
4490: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
44a0: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
44b0: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
44c0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
44d0: 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  list..*/.ExprLis
44e0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
44f0: 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73  stAppend(ExprLis
4500: 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a  t *pList, Expr *
4510: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e  pExpr, Token *pN
4520: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ame){.  if( pLis
4530: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
4540: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
4550: 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  ( sizeof(ExprLis
4560: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
4570: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
4580: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
4590: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
45a0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20  List->nAlloc==0 
45b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  );.  }.  if( pLi
45c0: 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73  st->nAlloc<=pLis
45d0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
45e0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
45f0: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74  item *a;.    int
4600: 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c   n = pList->nAll
4610: 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61 20  oc*2 + 4;.    a 
4620: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
4630: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
4640: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
4650: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
4660: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
4670: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
4680: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20  List->a = a;.   
4690: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
46a0: 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   n;.  }.  assert
46b0: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
46c0: 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20  .  if( pExpr || 
46d0: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72  pName ){.    str
46e0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
46f0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
4700: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
4710: 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  r++];.    memset
4720: 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
4730: 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20  f(*pItem));.    
4740: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
4750: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
4760: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
4770: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
4780: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Expr;.  }.  retu
4790: 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65  rn pList;..no_me
47a0: 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f  m:     .  /* Avo
47b0: 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72  id leaking memor
47c0: 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20  y if malloc has 
47d0: 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c  failed. */.  sql
47e0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
47f0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
4800: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
4810: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
4820: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
4830: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
4840: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
4850: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
4860: 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72  rListDelete(Expr
4870: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
4880: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
4890: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
48a0: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
48b0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
48c0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
48d0: 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e  a!=0 || (pList->
48e0: 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73  nExpr==0 && pLis
48f0: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b  t->nAlloc==0) );
4900: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
4910: 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e  ->nExpr<=pList->
4920: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28  nAlloc );.  for(
4930: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
4940: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
4950: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
4960: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
4970: 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  xprDelete(pItem-
4980: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
4990: 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
49a0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
49b0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
49c0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
49d0: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
49e0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
49f0: 69 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c 20  ion tree.  Call 
4a00: 78 46 75 6e 63 20 66 6f 72 20 65 61 63 68 20 6e  xFunc for each n
4a10: 6f 64 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a  ode visited..**.
4a20: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
4a30: 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64  lue from xFunc d
4a40: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
4a50: 72 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20  r the tree walk 
4a60: 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20  continues..** 0 
4a70: 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77  means continue w
4a80: 61 6c 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e  alking the tree.
4a90: 20 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74    1 means do not
4aa0: 20 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a   walk children.*
4ab0: 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  * of the current
4ac0: 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e   node but contin
4ad0: 75 65 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73  ue with siblings
4ae0: 2e 20 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64  .  2 means aband
4af0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77  on.** the tree w
4b00: 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a  alk completely..
4b10: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
4b20: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73   value from this
4b30: 20 72 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f   routine is 1 to
4b40: 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65   abandon the tre
4b50: 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20  e walk.** and 0 
4b60: 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a  to continue..**.
4b70: 2a 2a 20 4e 4f 54 49 43 45 3a 20 20 54 68 69 73  ** NOTICE:  This
4b80: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e   routine does *n
4b90: 6f 74 2a 20 64 65 73 63 65 6e 64 20 69 6e 74 6f  ot* descend into
4ba0: 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a   subqueries..*/.
4bb0: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45  static int walkE
4bc0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
4bd0: 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64   *, int (*)(void
4be0: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
4bf0: 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   *);.static int 
4c00: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70  walkExprTree(Exp
4c10: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a  r *pExpr, int (*
4c20: 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70  xFunc)(void*,Exp
4c30: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
4c40: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
4c50: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
4c60: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a  urn 0;.  rc = (*
4c70: 78 46 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78  xFunc)(pArg, pEx
4c80: 70 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  pr);.  if( rc==0
4c90: 20 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b   ){.    if( walk
4ca0: 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e  ExprTree(pExpr->
4cb0: 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41  pLeft, xFunc, pA
4cc0: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
4cd0: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
4ce0: 54 72 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67  Tree(pExpr->pRig
4cf0: 68 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ht, xFunc, pArg)
4d00: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
4d10: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 4c 69 73   if( walkExprLis
4d20: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
4d30: 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72  xFunc, pArg) ) r
4d40: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
4d50: 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f  eturn rc>1;.}../
4d60: 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78  *.** Call walkEx
4d70: 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65  prTree() for eve
4d80: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
4d90: 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74   list p..*/.stat
4da0: 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c  ic int walkExprL
4db0: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
4dc0: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f   int (*xFunc)(vo
4dd0: 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f  id *, Expr*), vo
4de0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
4df0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
4e00: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
4e10: 6d 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  m;.  if( !p ) re
4e20: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
4e30: 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  p->nExpr, pItem=
4e40: 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  p->a; i>0; i--, 
4e50: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pItem++){.    if
4e60: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
4e70: 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75  Item->pExpr, xFu
4e80: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
4e90: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
4ea0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
4eb0: 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65  all walkExprTree
4ec0: 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
4ed0: 72 65 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63  ression in Selec
4ee0: 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  t p, not includi
4ef0: 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ng.** expression
4f00: 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20  s that are part 
4f10: 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69  of sub-selects i
4f20: 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73  n any FROM claus
4f30: 65 20 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a  e or the LIMIT.*
4f40: 2a 20 6f 72 20 4f 46 46 53 45 54 20 65 78 70 72  * or OFFSET expr
4f50: 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61  essions...*/.sta
4f60: 74 69 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65  tic int walkSele
4f70: 63 74 45 78 70 72 28 53 65 6c 65 63 74 20 2a 70  ctExpr(Select *p
4f80: 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76  , int (*xFunc)(v
4f90: 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76  oid *, Expr*), v
4fa0: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 61  oid *pArg){.  wa
4fb0: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  lkExprList(p->pE
4fc0: 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  List, xFunc, pAr
4fd0: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  g);.  walkExprTr
4fe0: 65 65 28 70 2d 3e 70 57 68 65 72 65 2c 20 78 46  ee(p->pWhere, xF
4ff0: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
5000: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  lkExprList(p->pG
5010: 72 6f 75 70 42 79 2c 20 78 46 75 6e 63 2c 20 70  roupBy, xFunc, p
5020: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
5030: 54 72 65 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Tree(p->pHaving,
5040: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
5050: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d   walkExprList(p-
5060: 3e 70 4f 72 64 65 72 42 79 2c 20 78 46 75 6e 63  >pOrderBy, xFunc
5070: 2c 20 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72  , pArg);.  retur
5080: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n 0;.}.../*.** T
5090: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64  his routine is d
50a0: 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46  esigned as an xF
50b0: 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72  unc for walkExpr
50c0: 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41  Tree()..**.** pA
50d0: 72 67 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70  rg is really a p
50e0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
50f0: 65 67 65 72 2e 20 20 49 66 20 77 65 20 63 61 6e  eger.  If we can
5100: 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67   tell by looking
5110: 0a 2a 2a 20 61 74 20 70 45 78 70 72 20 74 68 61  .** at pExpr tha
5120: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
5130: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70   that contains p
5140: 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 63 6f  Expr is not a co
5150: 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73  nstant.** expres
5160: 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a  sion, then set *
5170: 70 41 72 67 20 74 6f 20 30 20 61 6e 64 20 72 65  pArg to 0 and re
5180: 74 75 72 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f  turn 2 to abando
5190: 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e  n the tree walk.
51a0: 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 64 6f 65  .** If pExpr doe
51b0: 73 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 71 75  s does not disqu
51c0: 61 6c 69 66 79 20 74 68 65 20 65 78 70 72 65 73  alify the expres
51d0: 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20  sion from being 
51e0: 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  a constant.** th
51f0: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  en do nothing..*
5200: 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b 69  *.** After walki
5210: 6e 67 20 74 68 65 20 77 68 6f 6c 65 20 74 72 65  ng the whole tre
5220: 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61  e, if no nodes a
5230: 72 65 20 66 6f 75 6e 64 20 74 68 61 74 20 64 69  re found that di
5240: 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20  squalify.** the 
5250: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 63 6f  expression as co
5260: 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 77 65 20  nstant, then we 
5270: 61 73 73 75 6d 65 20 74 68 65 20 77 68 6f 6c 65  assume the whole
5280: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
5290: 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65  s constant.  See
52a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
52b0: 6e 73 74 61 6e 74 28 29 20 66 6f 72 20 61 64 64  nstant() for add
52c0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
52d0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
52e0: 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
52f0: 73 74 61 6e 74 28 76 6f 69 64 20 2a 70 41 72 67  stant(void *pArg
5300: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
5310: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
5320: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
5330: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
5340: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
5350: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
5360: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
5370: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a  ant.    ** and *
5380: 70 41 72 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63  pArg==2 */.    c
5390: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
53a0: 0a 20 20 20 20 20 20 69 66 28 20 2a 28 28 69 6e  .      if( *((in
53b0: 74 2a 29 70 41 72 67 29 3d 3d 32 20 29 20 72 65  t*)pArg)==2 ) re
53c0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a  turn 0;.      /*
53d0: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
53e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
53f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
5400: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
5410: 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  _DOT:.    case T
5420: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
5430: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
5440: 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20  COLUMN:.#ifndef 
5450: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5460: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
5470: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73  _SELECT:.    cas
5480: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e  e TK_EXISTS:.#en
5490: 64 69 66 0a 20 20 20 20 20 20 2a 28 28 69 6e 74  dif.      *((int
54a0: 2a 29 70 41 72 67 29 20 3d 20 30 3b 0a 20 20 20  *)pArg) = 0;.   
54b0: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
54c0: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20   case TK_IN:.   
54d0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
54e0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
54f0: 20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 20 3d   *((int*)pArg) =
5500: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
5510: 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 2;.      }.  
5520: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
5530: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
5540: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
5550: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
5560: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
5570: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
5580: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
5590: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
55a0: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
55b0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
55c0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
55d0: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
55e0: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
55f0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
5600: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
5610: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
5620: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
5630: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
5640: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
5650: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
5660: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
5670: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
5680: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f   *p){.  int isCo
5690: 6e 73 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45  nst = 1;.  walkE
56a0: 78 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e  xprTree(p, exprN
56b0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26  odeIsConstant, &
56c0: 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75  isConst);.  retu
56d0: 72 6e 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f  rn isConst;.}../
56e0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
56f0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
5700: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
5710: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
5720: 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75  stant.** or a fu
5730: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68  nction call with
5740: 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
5750: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64  nts.  Return and
5760: 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61   0 if there.** a
5770: 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73  re any variables
5780: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
5790: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
57a0: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
57b0: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
57c0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
57d0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
57e0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
57f0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
5800: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
5810: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
5820: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5830: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
5840: 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a  rFunction(Expr *
5850: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
5860: 74 20 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 2;.  walkExp
5870: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
5880: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
5890: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
58a0: 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a   isConst!=0;.}..
58b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
58c0: 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20  ression p codes 
58d0: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
58e0: 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
58f0: 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
5900: 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
5910: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
5920: 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
5930: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
5940: 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
5950: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
5960: 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
5970: 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
5980: 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
5990: 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
59a0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
59b0: 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
59c0: 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
59d0: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
59e0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
59f0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
5a00: 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68  Value){.  switch
5a10: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
5a20: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
5a30: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
5a40: 74 65 33 47 65 74 49 6e 74 33 32 28 28 63 68 61  te3GetInt32((cha
5a50: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  r*)p->token.z, p
5a60: 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20  Value) ){.      
5a70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
5a80: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5a90: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
5aa0: 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
5ab0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5ac0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
5ad0: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
5ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
5af0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
5b00: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
5b10: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
5b20: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
5b30: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
5b40: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
5b50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
5b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5b70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5b80: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
5b90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
5ba0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5bb0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
5bc0: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
5bd0: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
5be0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
5bf0: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
5c00: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
5c10: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
5c20: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
5c30: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
5c40: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
5c50: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
5c60: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
5c70: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
5c80: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
5c90: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
5ca0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n 0;.}../*.** Gi
5cb0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
5cc0: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  a column of the 
5cd0: 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  form X.Y.Z or Y.
5ce0: 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f  Z or just Z, loo
5cf0: 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d  k up.** that nam
5d00: 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e in the set of 
5d10: 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e  source tables in
5d20: 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61   pSrcList and ma
5d30: 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a  ke the pExpr .**
5d40: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
5d50: 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74   refer back to t
5d60: 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d  hat source colum
5d70: 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  n.  The followin
5d80: 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  g changes.** are
5d90: 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a   made to pExpr:.
5da0: 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  **.**    pExpr->
5db0: 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65  iDb           Se
5dc0: 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64  t the index in d
5dd0: 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20  b->aDb[] of the 
5de0: 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  database holding
5df0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
5e10: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78  table..**    pEx
5e20: 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20  pr->iTable      
5e30: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
5e40: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
5e50: 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65  he table obtaine
5e60: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f               fro
5e80: 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20  m pSrcList..**  
5e90: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
5ea0: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68         Set to th
5eb0: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
5ec0: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
5ed0: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f  ..**    pExpr->o
5ee0: 70 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  p            Set
5ef0: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a   to TK_COLUMN..*
5f00: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  *    pExpr->pLef
5f10: 74 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78  t         Any ex
5f20: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f  pression this po
5f30: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74  ints to is delet
5f40: 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  ed.**    pExpr->
5f50: 70 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e  pRight        An
5f60: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69  y expression thi
5f70: 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64  s points to is d
5f80: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
5f90: 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68  e pDbToken is th
5fa0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
5fb0: 74 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29  tabase (the "X")
5fc0: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
5fd0: 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61  y be.** NULL mea
5fe0: 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69  ning that name i
5ff0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e  s of the form Y.
6000: 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61  Z or Z.  Any ava
6010: 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a  ilable database.
6020: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20  ** can be used. 
6030: 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e   The pTableToken
6040: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
6050: 74 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22  the table (the "
6060: 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61  Y").  This.** va
6070: 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  lue can be NULL 
6080: 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61  if pDbToken is a
6090: 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54  lso NULL.  If pT
60a0: 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  ableToken is NUL
60b0: 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  L it.** means th
60c0: 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74  at the form of t
60d0: 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64  he name is Z and
60e0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72   that columns fr
60f0: 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20  om any table.** 
6100: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  can be used..**.
6110: 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63  ** If the name c
6120: 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65  annot be resolve
6130: 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c  d unambiguously,
6140: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
6150: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
6160: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
6170: 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72  non-zero.  Retur
6180: 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n zero on succes
6190: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
61a0: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50   lookupName(.  P
61b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
61c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
61d0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
61e0: 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c  Token *pDbToken,
61f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
6200: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
6210: 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f  taining table, o
6220: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
6230: 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20  n *pTableToken, 
6240: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
6250: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c  e containing col
6260: 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  umn, or NULL */.
6270: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e    Token *pColumn
6280: 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f  Token, /* Name o
6290: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f  f the column. */
62a0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
62b0: 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e  pNC,    /* The n
62c0: 61 6d 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64  ame context used
62d0: 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20   to resolve the 
62e0: 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
62f0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f  pExpr          /
6300: 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52  * Make this EXPR
6310: 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74   node point to t
6320: 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75  he selected colu
6330: 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  mn */.){.  char 
6340: 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  *zDb = 0;       
6350: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
6360: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 22 58  atabase.  The "X
6370: 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20  " in X.Y.Z */.  
6380: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20  char *zTab = 0; 
6390: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
63a0: 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
63b0: 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20  "Y" in X.Y.Z or 
63c0: 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  Y.Z */.  char *z
63d0: 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Col = 0;      /*
63e0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
63f0: 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f  umn.  The "Z" */
6400: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
6410: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
6420: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
6430: 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  t cnt = 0;      
6440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6450: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
6460: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63  names */.  int c
6470: 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  ntTab = 0;      
6480: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
6490: 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65  ching table name
64a0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
64b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
64c0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
64d0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
64e0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
64f0: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  m;       /* Use 
6500: 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  for looping over
6510: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20   pSrcList items 
6520: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
6530: 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68  ist_item *pMatch
6540: 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61   = 0;  /* The ma
6550: 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20  tching pSrcList 
6560: 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  item */.  NameCo
6570: 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20  ntext *pTopNC = 
6580: 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  pNC;        /* F
6590: 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74  irst namecontext
65a0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
65b0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75  .  assert( pColu
65c0: 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75  mnToken && pColu
65d0: 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a  mnToken->z ); /*
65e0: 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20   The Z in X.Y.Z 
65f0: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a  cannot be NULL *
6600: 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65  /.  zDb = sqlite
6610: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
6620: 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62  DbToken);.  zTab
6630: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6640: 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f  omToken(pTableTo
6650: 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73  ken);.  zCol = s
6660: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6670: 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e  ken(pColumnToken
6680: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
6690: 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e 6d 61  ThreadData()->ma
66a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
66b0: 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d    goto lookupnam
66c0: 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 70 45  e_end;.  }..  pE
66d0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31  xpr->iTable = -1
66e0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26  ;.  while( pNC &
66f0: 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  & cnt==0 ){.    
6700: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
6710: 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  ;.    SrcList *p
6720: 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
6730: 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69 66  SrcList;..    if
6740: 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20  ( pSrcList ){.  
6750: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
6760: 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20  em=pSrcList->a; 
6770: 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
6780: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
6790: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
67a0: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
67b0: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ab;.        int 
67c0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
67d0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
67e0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
67f0: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70         Column *p
6800: 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Col;.  .        
6810: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 63 6f  if( pTab==0 ) co
6820: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
6830: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
6840: 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
6850: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
6860: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
6870: 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
6880: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
6890: 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  bName = pItem->z
68a0: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
68b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
68c0: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
68d0: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
68e0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
68f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6900: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
6910: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
6920: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6930: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73  zTabName==0 || s
6940: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
6950: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
6960: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6970: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62           if( zDb
6980: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
6990: 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44  rICmp(db->aDb[iD
69a0: 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d  b].zName, zDb)!=
69b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
69c0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
69d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
69e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
69f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
6a00: 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20  (cntTab++) ){.  
6a10: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
6a20: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
6a30: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
6a40: 20 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61    pExpr->pSchema
6a50: 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61   = pTab->pSchema
6a60: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74  ;.          pMat
6a70: 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20  ch = pItem;.    
6a80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
6a90: 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(j=0, pCol=pTab
6aa0: 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e  ->aCol; j<pTab->
6ab0: 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b  nCol; j++, pCol+
6ac0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
6ad0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
6ae0: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
6af0: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
6b00: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55        IdList *pU
6b10: 73 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20  sing;.          
6b20: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
6b30: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
6b40: 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  le = pItem->iCur
6b50: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sor;.           
6b60: 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b   pMatch = pItem;
6b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
6b80: 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 54  pr->pSchema = pT
6b90: 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20  ab->pSchema;.   
6ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73           /* Subs
6bb0: 74 69 74 75 74 65 20 74 68 65 20 72 6f 77 69 64  titute the rowid
6bc0: 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72   (column -1) for
6bd0: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
6be0: 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20  MARY KEY */.    
6bf0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
6c00: 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62  Column = j==pTab
6c10: 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a  ->iPKey ? -1 : j
6c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
6c30: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
6c40: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66  pTab->aCol[j].af
6c50: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
6c60: 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c      pExpr->pColl
6c70: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
6c80: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .pColl;.        
6c90: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a      if( pItem->j
6ca0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
6cb0: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  URAL ){.        
6cc0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
6cd0: 20 6d 61 74 63 68 20 6f 63 63 75 72 72 65 64 20   match occurred 
6ce0: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
6cf0: 65 20 6f 66 20 61 20 6e 61 74 75 72 61 6c 20 6a  e of a natural j
6d00: 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oin,.           
6d10: 20 20 20 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20     ** then skip 
6d20: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
6d30: 74 6f 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69  to avoid a dupli
6d40: 63 61 74 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20  cate match */.  
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
6d60: 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m++;.           
6d70: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
6d80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6d90: 20 20 69 66 28 20 28 70 55 73 69 6e 67 20 3d 20    if( (pUsing = 
6da0: 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 21 3d  pItem->pUsing)!=
6db0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6dc0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61     /* If this ma
6dd0: 74 63 68 20 6f 63 63 75 72 73 20 6f 6e 20 61 20  tch occurs on a 
6de0: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 69  column that is i
6df0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
6e00: 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  se.             
6e10: 20 2a 2a 20 6f 66 20 61 20 6a 6f 69 6e 2c 20 73   ** of a join, s
6e20: 6b 69 70 20 74 68 65 20 73 65 61 72 63 68 20 6f  kip the search o
6e30: 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
6e40: 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 0a 20 20  e of the join.  
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
6e60: 6f 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63  o avoid a duplic
6e70: 61 74 65 20 6d 61 74 63 68 20 74 68 65 72 65 2e  ate match there.
6e80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
6e90: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
6ea0: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
6eb0: 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b  k<pUsing->nId; k
6ec0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
6ed0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6ee0: 53 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e  StrICmp(pUsing->
6ef0: 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  a[k].zName, zCol
6f00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6f10: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b            pItem+
6f20: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
6f30: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
6f50: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
6f60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
6f70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
6f80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62   }.            b
6f90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
6fa0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
6fb0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64    }.    }..#ifnd
6fc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
6fd0: 52 49 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66  RIGGER.    /* If
6fe0: 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72   we have not alr
6ff0: 65 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68  eady resolved th
7000: 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79  e name, then may
7010: 62 65 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  be .    ** it is
7020: 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e   a new.* or old.
7030: 2a 20 74 72 69 67 67 65 72 20 61 72 67 75 6d 65  * trigger argume
7040: 6e 74 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20  nt reference.   
7050: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d   */.    if( zDb=
7060: 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26  =0 && zTab!=0 &&
7070: 20 63 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73   cnt==0 && pPars
7080: 65 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20  e->trigStack!=0 
7090: 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72  ){.      Trigger
70a0: 53 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53  Stack *pTriggerS
70b0: 74 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74  tack = pParse->t
70c0: 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20  rigStack;.      
70d0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
70e0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 69 67  .      if( pTrig
70f0: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
7100: 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65   != -1 && sqlite
7110: 33 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20  3StrICmp("new", 
7120: 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20  zTab) == 0 ){.  
7130: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
7140: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
7150: 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20  ack->newIdx;.   
7160: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
7170: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
7180: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
7190: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
71a0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 65  ->pTab;.      }e
71b0: 6c 73 65 20 69 66 28 20 70 54 72 69 67 67 65 72  lse if( pTrigger
71c0: 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d  Stack->oldIdx !=
71d0: 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53 74   -1 && sqlite3St
71e0: 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61  rICmp("old", zTa
71f0: 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)==0 ){.       
7200: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
7210: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
7220: 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20  oldIdx;.        
7230: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
7240: 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20  Stack->pTab );. 
7250: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
7260: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
7270: 62 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  b;.      }..    
7280: 20 20 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20    if( pTab ){ . 
7290: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
72a0: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43        Column *pC
72b0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b  ol = pTab->aCol;
72c0: 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ..        pExpr-
72d0: 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d  >pSchema = pTab-
72e0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
72f0: 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20    cntTab++;.    
7300: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c      for(j=0; j <
7310: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b   pTab->nCol; j++
7320: 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20  , pCol++) {.    
7330: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7340: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
7350: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
7360: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  {.            cn
7370: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
7380: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
7390: 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  = j==pTab->iPKey
73a0: 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20   ? -1 : j;.     
73b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
73c0: 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61  finity = pTab->a
73d0: 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b  Col[j].affinity;
73e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
73f0: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62  pr->pColl = pTab
7400: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b  ->aCol[j].pColl;
7410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
7420: 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b  pr->pTab = pTab;
7430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
7440: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
7450: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7460: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  }.    }.#endif /
7470: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
7480: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
7490: 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  */..    /*.    *
74a0: 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61  * Perhaps the na
74b0: 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  me is a referenc
74c0: 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20  e to the ROWID. 
74d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
74e0: 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d  t==0 && cntTab==
74f0: 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f  1 && sqlite3IsRo
7500: 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20  wid(zCol) ){.   
7510: 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20     cnt = 1;.    
7520: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
7530: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78   = -1;.      pEx
7540: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  pr->affinity = S
7550: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
7560: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
7570: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69  .    ** If the i
7580: 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66  nput is of the f
7590: 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f  orm Z (not Y.Z o
75a0: 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68  r X.Y.Z) then th
75b0: 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20  e name Z.    ** 
75c0: 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f 20 61  might refer to a
75d0: 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69  n result-set ali
75e0: 61 73 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  as.  This happen
75f0: 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
7600: 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61  when.    ** we a
7610: 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d  re resolving nam
7620: 65 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  es in the WHERE 
7630: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
7640: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a  llowing command:
7650: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
7660: 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53     SELECT a+b AS
7670: 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48   x FROM table WH
7680: 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a  ERE x<10;.    **
7690: 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73  .    ** In cases
76a0: 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c   like this, repl
76b0: 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61  ace pExpr with a
76c0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
76d0: 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20  ression that.   
76e0: 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65   ** forms the re
76f0: 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28  sult set entry (
7700: 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61  "a+b" in the exa
7710: 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e  mple) and return
7720: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
7730: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
7740: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  he expression in
7750: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7760: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
7770: 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  ady been.    ** 
7780: 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20  resolved by the 
7790: 74 69 6d 65 20 74 68 65 20 57 48 45 52 45 20 63  time the WHERE c
77a0: 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65  lause is resolve
77b0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
77c0: 28 20 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c  ( cnt==0 && (pEL
77d0: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73  ist = pNC->pELis
77e0: 74 29 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30  t)!=0 && zTab==0
77f0: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   ){.      for(j=
7800: 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; j<pEList->nEx
7810: 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
7820: 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45    char *zAs = pE
7830: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
7840: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 41  ;.        if( zA
7850: 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  s!=0 && sqlite3S
7860: 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c  trICmp(zAs, zCol
7870: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7880: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
7890: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
78a0: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
78b0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
78c0: 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20 20  ->op = TK_AS;.  
78d0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
78e0: 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
78f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
7900: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
7910: 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  Dup(pEList->a[j]
7920: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
7930: 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20     cnt = 1;.    
7940: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54        assert( zT
7950: 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20  ab==0 && zDb==0 
7960: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
7970: 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  o lookupname_end
7980: 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _2;.        }.  
7990: 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20      } .    }..  
79a0: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20    /* Advance to 
79b0: 74 68 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f  the next name co
79c0: 6e 74 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70  ntext.  The loop
79d0: 20 77 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20   will exit when 
79e0: 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65  either.    ** we
79f0: 20 68 61 76 65 20 61 20 6d 61 74 63 68 20 28 63   have a match (c
7a00: 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65  nt>0) or when we
7a10: 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65   run out of name
7a20: 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a   contexts..    *
7a30: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
7a40: 20 29 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d 20   ){.      pNC = 
7a50: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
7a60: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
7a70: 20 49 66 20 58 20 61 6e 64 20 59 20 61 72 65 20   If X and Y are 
7a80: 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77  NULL (in other w
7a90: 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65  ords if only the
7aa0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69   column name Z i
7ab0: 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29  s.  ** supplied)
7ac0: 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
7ad0: 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20  f Z is enclosed 
7ae0: 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  in double-quotes
7af0: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73  , then.  ** Z is
7b00: 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61   a string litera
7b10: 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  l if it doesn't 
7b20: 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e  match any column
7b30: 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74   names.  In that
7b40: 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e  .  ** case, we n
7b50: 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69  eed to return ri
7b60: 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74  ght away and not
7b70: 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65   make any change
7b80: 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e  s to.  ** pExpr.
7b90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75  .  **.  ** Becau
7ba0: 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  se no reference 
7bb0: 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75 74 65  was made to oute
7bc0: 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68 65 20  r contexts, the 
7bd0: 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66  pNC->nRef.  ** f
7be0: 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 63 68  ields are not ch
7bf0: 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e  anged in any con
7c00: 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  text..  */.  if(
7c10: 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d   cnt==0 && zTab=
7c20: 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b  =0 && pColumnTok
7c30: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b  en->z[0]=='"' ){
7c40: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
7c50: 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  zCol);.    retur
7c60: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  n 0;.  }..  /*. 
7c70: 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73   ** cnt==0 means
7c80: 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d   there was not m
7c90: 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61  atch.  cnt>1 mea
7ca0: 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77  ns there were tw
7cb0: 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d  o or.  ** more m
7cc0: 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20  atches.  Either 
7cd0: 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20  way, we have an 
7ce0: 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  error..  */.  if
7cf0: 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20  ( cnt!=1 ){.    
7d00: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20  char *z = 0;.   
7d10: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
7d20: 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f   zErr = cnt==0 ?
7d30: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e   "no such column
7d40: 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f  : %s" : "ambiguo
7d50: 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  us column name: 
7d60: 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  %s";.    if( zDb
7d70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7d80: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a  3SetString(&z, z
7d90: 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22  Db, ".", zTab, "
7da0: 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a  .", zCol, (char*
7db0: 29 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )0);.    }else i
7dc0: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
7dd0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
7de0: 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c  g(&z, zTab, ".",
7df0: 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29   zCol, (char*)0)
7e00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e10: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74 72     z = sqliteStr
7e20: 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  Dup(zCol);.    }
7e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7e40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45 72  rMsg(pParse, zEr
7e50: 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, z);.    sqlit
7e60: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 70 54  eFree(z);.    pT
7e70: 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  opNC->nErr++;.  
7e80: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c  }..  /* If a col
7e90: 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  umn from a table
7ea0: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20   in pSrcList is 
7eb0: 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e  referenced, then
7ec0: 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69   record.  ** thi
7ed0: 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53  s fact in the pS
7ee0: 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73  rcList.a[].colUs
7ef0: 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c  ed bitmask.  Col
7f00: 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a  umn 0 causes.  *
7f10: 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65  * bit 0 to be se
7f20: 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74  t.  Column 1 set
7f30: 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f  s bit 1.  And so
7f40: 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a   forth.  If the.
7f50: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62    ** column numb
7f60: 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
7f70: 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  an the number of
7f80: 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74   bits in the bit
7f90: 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73  mask.  ** then s
7fa0: 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65  et the high-orde
7fb0: 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74  r bit of the bit
7fc0: 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mask..  */.  if(
7fd0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
7fe0: 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20  =0 && pMatch!=0 
7ff0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
8000: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
8010: 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66     if( n>=sizeof
8020: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20  (Bitmask)*8 ){. 
8030: 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28       n = sizeof(
8040: 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20  Bitmask)*8-1;.  
8050: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
8060: 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d  pMatch->iCursor=
8070: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
8080: 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f  ;.    pMatch->co
8090: 6c 55 73 65 64 20 7c 3d 20 31 3c 3c 6e 3b 0a 20  lUsed |= 1<<n;. 
80a0: 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65   }..lookupname_e
80b0: 6e 64 3a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75  nd:.  /* Clean u
80c0: 70 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  p and return.  *
80d0: 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  /.  sqliteFree(z
80e0: 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  Db);.  sqliteFre
80f0: 65 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  e(zTab);.  sqlit
8100: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
8110: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45  pr->pLeft);.  pE
8120: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  xpr->pLeft = 0;.
8130: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8140: 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ete(pExpr->pRigh
8150: 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69  t);.  pExpr->pRi
8160: 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72  ght = 0;.  pExpr
8170: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
8180: 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  ;.lookupname_end
8190: 5f 32 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  _2:.  sqliteFree
81a0: 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e  (zCol);.  if( cn
81b0: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65  t==1 ){.    asse
81c0: 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20  rt( pNC!=0 );.  
81d0: 20 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61    sqlite3AuthRea
81e0: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
81f0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b   pNC->pSrcList);
8200: 0a 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20  .    if( pMatch 
8210: 26 26 20 21 70 4d 61 74 63 68 2d 3e 70 53 65 6c  && !pMatch->pSel
8220: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ect ){.      pEx
8230: 70 72 2d 3e 70 54 61 62 20 3d 20 70 4d 61 74 63  pr->pTab = pMatc
8240: 68 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d 0a 20  h->pTab;.    }. 
8250: 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
8260: 74 68 65 20 6e 52 65 66 20 76 61 6c 75 65 20 6f  the nRef value o
8270: 6e 20 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65  n all name conte
8280: 78 74 73 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75  xts from TopNC u
8290: 70 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  p to.    ** the 
82a0: 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  point where the 
82b0: 6e 61 6d 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f  name matched. */
82c0: 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  .    for(;;){.  
82d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70      assert( pTop
82e0: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  NC!=0 );.      p
82f0: 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  TopNC->nRef++;. 
8300: 20 20 20 20 20 69 66 28 20 70 54 6f 70 4e 43 3d       if( pTopNC=
8310: 3d 70 4e 43 20 29 20 62 72 65 61 6b 3b 0a 20 20  =pNC ) break;.  
8320: 20 20 20 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f      pTopNC = pTo
8330: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
8340: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
8350: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
8360: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 1;.  }.}..
8370: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8380: 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61  ne is designed a
8390: 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
83a0: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a  alkExprTree()..*
83b0: 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73 79 6d  *.** Resolve sym
83c0: 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e 74 6f  bolic names into
83d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72 61   TK_COLUMN opera
83e0: 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 75 72  tors for the cur
83f0: 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20  rent.** node in 
8400: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
8410: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 30 20 74  ree.  Return 0 t
8420: 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68 65 20 73  o continue the s
8430: 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20 74 68  earch down.** th
8440: 65 20 74 72 65 65 20 6f 72 20 32 20 74 6f 20 61  e tree or 2 to a
8450: 62 6f 72 74 20 74 68 65 20 74 72 65 65 20 77 61  bort the tree wa
8460: 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  lk..**.** This r
8470: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73  outine also does
8480: 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
8490: 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  and name resolut
84a0: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e 63 74  ion for.** funct
84b0: 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 20  ion names.  The 
84c0: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 61 67 67  operator for agg
84d0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
84e0: 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74   is changed.** t
84f0: 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  o TK_AGG_FUNCTIO
8500: 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  N..*/.static int
8510: 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65   nameResolverSte
8520: 70 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78  p(void *pArg, Ex
8530: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61  pr *pExpr){.  Na
8540: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
8550: 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 2a 29 70   (NameContext*)p
8560: 41 72 67 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  Arg;.  SrcList *
8570: 70 53 72 63 4c 69 73 74 3b 0a 20 20 50 61 72 73  pSrcList;.  Pars
8580: 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66  e *pParse;..  if
8590: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
85a0: 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28  urn 1;.  assert(
85b0: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 53 72   pNC!=0 );.  pSr
85c0: 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
85d0: 63 4c 69 73 74 3b 0a 20 20 70 50 61 72 73 65 20  cList;.  pParse 
85e0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 0a  = pNC->pParse;..
85f0: 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79    if( ExprHasAny
8600: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
8610: 45 50 5f 52 65 73 6f 6c 76 65 64 29 20 29 20 72  EP_Resolved) ) r
8620: 65 74 75 72 6e 20 31 3b 0a 20 20 45 78 70 72 53  eturn 1;.  ExprS
8630: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
8640: 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a  , EP_Resolved);.
8650: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
8660: 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 26 26   if( pSrcList &&
8670: 20 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   pSrcList->nAllo
8680: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  c>0 ){.    int i
8690: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
86a0: 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
86b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
86c0: 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61  ert( pSrcList->a
86d0: 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26  [i].iCursor>=0 &
86e0: 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  & pSrcList->a[i]
86f0: 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d  .iCursor<pParse-
8700: 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >nTab);.    }.  
8710: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  }.#endif.  switc
8720: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
8730: 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75      /* Double-qu
8740: 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78  oted strings (ex
8750: 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65  : "abc") are use
8760: 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73  d as identifiers
8770: 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69   if.    ** possi
8780: 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ble.  Otherwise 
8790: 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73  they remain as s
87a0: 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d  trings.  Single-
87b0: 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74  quoted.    ** st
87c0: 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27  rings (ex: 'abc'
87d0: 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72  ) are always str
87e0: 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20  ing literals..  
87f0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
8800: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
8810: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
8820: 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62  n.z[0]=='\'' ) b
8830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46  reak;.      /* F
8840: 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
8850: 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20  e TK_ID case if 
8860: 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65  this is a double
8870: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a  -quoted string *
8880: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  /.    }.    /* A
8890: 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72   lone identifier
88a0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
88b0: 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  a column..    */
88c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
88d0: 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e   {.      lookupN
88e0: 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  ame(pParse, 0, 0
88f0: 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  , &pExpr->token,
8900: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
8910: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8920: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20    }.  .    /* A 
8930: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63  table name and c
8940: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20  olumn name:     
8950: 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20  ID.ID.    ** Or 
8960: 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c  a database, tabl
8970: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49  e and column:  I
8980: 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20  D.ID.ID.    */. 
8990: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20     case TK_DOT: 
89a0: 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
89b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f  Column;.      To
89c0: 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20  ken *pTable;.   
89d0: 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20     Token *pDb;. 
89e0: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
89f0: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28  t;..      /* if(
8a00: 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62   pSrcList==0 ) b
8a10: 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70  reak; */.      p
8a20: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
8a30: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
8a40: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
8a50: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ID ){.        pD
8a60: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
8a70: 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e  Table = &pExpr->
8a80: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
8a90: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
8aa0: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a  &pRight->token;.
8ab0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8ac0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69       assert( pRi
8ad0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ght->op==TK_DOT 
8ae0: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d  );.        pDb =
8af0: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
8b00: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
8b10: 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d  Table = &pRight-
8b20: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
8b30: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
8b40: 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74   &pRight->pRight
8b50: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
8b60: 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d  .      lookupNam
8b70: 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70  e(pParse, pDb, p
8b80: 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20  Table, pColumn, 
8b90: 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pNC, pExpr);.   
8ba0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8bb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c   }..    /* Resol
8bc0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ve function name
8bd0: 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  s.    */.    cas
8be0: 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a  e TK_CONST_FUNC:
8bf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
8c00: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
8c10: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
8c20: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20   pExpr->pList;  
8c30: 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
8c40: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  t list */.      
8c50: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20  int n = pList ? 
8c60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
8c70: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
8c80: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
8c90: 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66     int no_such_f
8ca0: 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  unc = 0;       /
8cb0: 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63  * True if no suc
8cc0: 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  h function exist
8cd0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77  s */.      int w
8ce0: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
8cf0: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
8d00: 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  f wrong number o
8d10: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
8d20: 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20       int is_agg 
8d30: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8d40: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61   /* True if is a
8d50: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
8d60: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
8d70: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t i;.      int n
8d80: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
8d90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8da0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
8db0: 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  n function name 
8dc0: 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
8dd0: 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
8de0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
8df0: 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  tion name. */.  
8e00: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
8e10: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
8e20: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
8e30: 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f  bout the functio
8e40: 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  n */.      int e
8e50: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
8e60: 3e 65 6e 63 3b 20 20 2f 2a 20 54 68 65 20 64 61  >enc;  /* The da
8e70: 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20  tabase encoding 
8e80: 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d 20  */..      zId = 
8e90: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
8ea0: 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64  ken.z;.      nId
8eb0: 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e   = pExpr->token.
8ec0: 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
8ed0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
8ee0: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
8ef0: 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e 63  zId, nId, n, enc
8f00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
8f10: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
8f20: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
8f30: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
8f40: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
8f50: 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20 30 29 3b  Id, -1, enc, 0);
8f60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65  .        if( pDe
8f70: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
8f80: 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d    no_such_func =
8f90: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
8fa0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f  e{.          wro
8fb0: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b  ng_num_args = 1;
8fc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8fd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8fe0: 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78  is_agg = pDef->x
8ff0: 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20 7d  Func==0;.      }
9000: 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67  .      if( is_ag
9010: 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c 6c 6f 77  g && !pNC->allow
9020: 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Agg ){.        s
9030: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9040: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
9050: 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  f aggregate func
9060: 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49  tion %.*s()", nI
9070: 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  d,zId);.        
9080: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
9090: 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b       is_agg = 0;
90a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
90b0: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b   no_such_func ){
90c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
90d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
90e0: 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69   "no such functi
90f0: 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c 20  on: %.*s", nId, 
9100: 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  zId);.        pN
9110: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
9120: 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e 67   }else if( wrong
9130: 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20 20  _num_args ){.   
9140: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9150: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72 6f  rMsg(pParse,"wro
9160: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
9170: 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
9180: 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20 20  on %.*s()",.    
9190: 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a 49           nId, zI
91a0: 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  d);.        pNC-
91b0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  >nErr++;.      }
91c0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67  .      if( is_ag
91d0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  g ){.        pEx
91e0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
91f0: 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20  FUNCTION;.      
9200: 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20    pNC->hasAgg = 
9210: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
9220: 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e   if( is_agg ) pN
9230: 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b  C->allowAgg = 0;
9240: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
9250: 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20  pNC->nErr==0 && 
9260: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
9270: 20 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28     walkExprTree(
9280: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
9290: 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53  r, nameResolverS
92a0: 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20  tep, pNC);.     
92b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
92c0: 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77  agg ) pNC->allow
92d0: 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  Agg = 1;.      /
92e0: 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70 75  * FIX ME:  Compu
92f0: 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  te pExpr->affini
9300: 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ty based on the 
9310: 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 0a  expected return.
9320: 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f 66        ** type of
9330: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a 20   the function . 
9340: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
9350: 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a 20 20 20  turn is_agg;.   
9360: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
9370: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
9380: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
9390: 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  CT:.    case TK_
93a0: 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66 0a 20  EXISTS:.#endif. 
93b0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
93c0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
93d0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
93e0: 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20       int nRef = 
93f0: 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69 66 6e 64  pNC->nRef;.#ifnd
9400: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
9410: 48 45 43 4b 0a 20 20 20 20 20 20 20 20 69 66 28  HECK.        if(
9420: 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29 7b   pNC->isCheck ){
9430: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9440: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9450: 65 2c 22 73 75 62 71 75 65 72 69 65 73 20 70 72  e,"subqueries pr
9460: 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45 43  ohibited in CHEC
9470: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b  K constraints");
9480: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
9490: 66 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  f.        sqlite
94a0: 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
94b0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53  Parse, pExpr->pS
94c0: 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a 20 20 20  elect, pNC);.   
94d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 43       assert( pNC
94e0: 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a  ->nRef>=nRef );.
94f0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 52 65 66          if( nRef
9500: 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20  !=pNC->nRef ){. 
9510: 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
9520: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
9530: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a 20  EP_VarSelect);. 
9540: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9550: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9560: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
9570: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
9580: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
9590: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  LE: {.      if( 
95a0: 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29 7b 0a  pNC->isCheck ){.
95b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
95c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
95d0: 70 61 72 61 6d 65 74 65 72 73 20 70 72 6f 68 69  parameters prohi
95e0: 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63  bited in CHECK c
95f0: 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20  onstraints");.  
9600: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
9610: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
9620: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
9630: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9640: 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65  utine walks an e
9650: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
9660: 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65  nd resolves refe
9670: 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62  rences to.** tab
9680: 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64  le columns.  Nod
9690: 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 49  es of the form I
96a0: 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f 6c  D.ID or ID resol
96b0: 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e  ve into an.** in
96c0: 64 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c 65  dex to the table
96d0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69   in the table li
96e0: 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e 20  st and a column 
96f0: 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a 2a  offset.  The .**
9700: 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f 72   Expr.opcode for
9710: 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20 63   such nodes is c
9720: 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c  hanged to TK_COL
9730: 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e 69  UMN.  The Expr.i
9740: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 69  Table.** value i
9750: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65  s changed to the
9760: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72 65   index of the re
9770: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 69  ferenced table i
9780: 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70 6c  n pTabList.** pl
9790: 75 73 20 74 68 65 20 22 62 61 73 65 22 20 76 61  us the "base" va
97a0: 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65 20 76  lue.  The base v
97b0: 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d 61  alue will ultima
97c0: 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65 0a  tely become the.
97d0: 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  ** VDBE cursor n
97e0: 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72 73  umber for a curs
97f0: 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74  or that is point
9800: 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65 66  ing into the ref
9810: 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c 65  erenced.** table
9820: 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c  .  The Expr.iCol
9830: 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68 61  umn value is cha
9840: 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  nged to the inde
9850: 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
9860: 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65 72  .** of the refer
9870: 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54 68  enced table.  Th
9880: 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76  e Expr.iColumn v
9890: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70 65  alue for the spe
98a0: 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63 6f  cial.** ROWID co
98b0: 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e 79  lumn is -1.  Any
98c0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
98d0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20 74   KEY column is t
98e0: 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61 6c  ried as an.** al
98f0: 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a 2a  ias for ROWID..*
9900: 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73 6f 6c 76  *.** Also resolv
9910: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  e function names
9920: 20 61 6e 64 20 63 68 65 63 6b 20 74 68 65 20 66   and check the f
9930: 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 70 72 6f  unctions for pro
9940: 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e 20 20 4d  per.** usage.  M
9950: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 66 75 6e  ake sure all fun
9960: 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65 20  ction names are 
9970: 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 61  recognized and a
9980: 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  ll functions.** 
9990: 68 61 76 65 20 74 68 65 20 63 6f 72 72 65 63 74  have the correct
99a0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
99b0: 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61 6e 20  ents.  Leave an 
99c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
99d0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
99e0: 4d 73 67 20 69 66 20 61 6e 79 74 68 69 6e 67 20  Msg if anything 
99f0: 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74 75 72  is amiss.  Retur
9a00: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9a10: 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  errors..**.** If
9a20: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9a30: 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61  contains aggrega
9a40: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 65  te functions the
9a50: 6e 20 73 65 74 20 74 68 65 20 45 50 5f 41 67 67  n set the EP_Agg
9a60: 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  .** property on 
9a70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
9a80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
9a90: 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 0a  prResolveNames(.
9aa0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
9ab0: 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  NC,       /* Nam
9ac0: 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c 76  espace to resolv
9ad0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
9ae0: 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  . */.  Expr *pEx
9af0: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
9b00: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
9b10: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e   to be analyzed.
9b20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 73 61 76   */.){.  int sav
9b30: 65 64 48 61 73 41 67 67 3b 0a 20 20 69 66 28 20  edHasAgg;.  if( 
9b40: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
9b50: 6e 20 30 3b 0a 20 20 73 61 76 65 64 48 61 73 41  n 0;.  savedHasA
9b60: 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67 67  gg = pNC->hasAgg
9b70: 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20  ;.  pNC->hasAgg 
9b80: 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 0;.  walkExprT
9b90: 72 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65 52  ree(pExpr, nameR
9ba0: 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43  esolverStep, pNC
9bb0: 29 3b 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45  );.  if( pNC->nE
9bc0: 72 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  rr>0 ){.    Expr
9bd0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
9be0: 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20  r, EP_Error);.  
9bf0: 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e 68 61 73  }.  if( pNC->has
9c00: 41 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72 53  Agg ){.    ExprS
9c10: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
9c20: 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c  , EP_Agg);.  }el
9c30: 73 65 20 69 66 28 20 73 61 76 65 64 48 61 73 41  se if( savedHasA
9c40: 67 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 68  gg ){.    pNC->h
9c50: 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20  asAgg = 1;.  }. 
9c60: 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50   return ExprHasP
9c70: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
9c80: 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a  P_Error);.}../*.
9c90: 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 69 6e 73  ** A pointer ins
9ca0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
9cb0: 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
9cc0: 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74  to pass informat
9cd0: 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77  ion.** through w
9ce0: 61 6c 6b 45 78 70 72 54 72 65 65 20 69 6e 74 6f  alkExprTree into
9cf0: 20 63 6f 64 65 53 75 62 71 75 65 72 79 53 74 65   codeSubquerySte
9d00: 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  p()..*/.typedef 
9d10: 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64 65  struct QueryCode
9d20: 72 20 51 75 65 72 79 43 6f 64 65 72 3b 0a 73 74  r QueryCoder;.st
9d30: 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20  ruct QueryCoder 
9d40: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
9d50: 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e;       /* The 
9d60: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
9d70: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
9d80: 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d   *pNC;    /* Nam
9d90: 65 73 70 61 63 65 20 6f 66 20 66 69 72 73 74 20  espace of first 
9da0: 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72 79 20  enclosing query 
9db0: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  */.};.../*.** Ge
9dc0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
9dd0: 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65  scalar subquerie
9de0: 73 20 75 73 65 64 20 61 73 20 61 6e 20 65 78 70  s used as an exp
9df0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49  ression.** and I
9e00: 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78  N operators.  Ex
9e10: 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
9e20: 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d    (SELECT a FROM
9e30: 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20   b)          -- 
9e40: 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
9e50: 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61  EXISTS (SELECT a
9e60: 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58   FROM b)   -- EX
9e70: 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a  ISTS subquery.**
9e80: 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31       x IN (4,5,1
9e90: 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1)              
9ea0: 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
9eb0: 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68  ith list on righ
9ec0: 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20  t-hand side.**  
9ed0: 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
9ee0: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d  a FROM b)     --
9ef0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
9f00: 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  h subquery on th
9f10: 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68  e right.**.** Th
9f20: 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
9f30: 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  r describes the 
9f40: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
9f50: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a  contains the IN.
9f60: 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ** operator or s
9f70: 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 23 69 66 6e  ubquery..*/.#ifn
9f80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9f90: 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71  SUBQUERY.void sq
9fa0: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
9fb0: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
9fc0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
9fd0: 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d    int testAddr =
9fe0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
a000: 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
a010: 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ss */.  Vdbe *v 
a020: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
a030: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
a040: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  v==0 ) return;..
a050: 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d    /* This code m
a060: 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74  ust be run in it
a070: 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79  s entirety every
a080: 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
a090: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20  untered.  ** if 
a0a0: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
a0b0: 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
a0c0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
a0d0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
a0e0: 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
a0f0: 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
a100: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
a110: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
a120: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
a130: 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
a140: 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
a150: 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
a160: 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
a170: 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
a180: 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
a190: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
a1a0: 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
a1b0: 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
a1c0: 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
a1d0: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
a1e0: 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
a1f0: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
a200: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
a210: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
a220: 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
a230: 65 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d  ect) && !pParse-
a240: 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20  >trigStack ){.  
a250: 20 20 69 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72    int mem = pPar
a260: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
a270: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a280: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
a290: 6d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 74 65 73  mem, 0);.    tes
a2a0: 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
a2b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
a2c0: 66 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73  f, 0, 0);.    as
a2d0: 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30  sert( testAddr>0
a2e0: 20 7c 7c 20 73 71 6c 69 74 65 33 54 68 72 65 61   || sqlite3Threa
a2f0: 64 44 61 74 61 28 29 2d 3e 6d 61 6c 6c 6f 63 46  dData()->mallocF
a300: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
a310: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a320: 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 6d   OP_MemInt, 1, m
a330: 65 6d 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  em);.  }..  swit
a340: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
a350: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
a360: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66   {.      char af
a370: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b 65  finity;.      Ke
a380: 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20  yInfo keyInfo;. 
a390: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20       int addr;  
a3a0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
a3b0: 20 6f 66 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75   of OP_OpenVirtu
a3c0: 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
a3d0: 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  /..      affinit
a3e0: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
a3f0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
a400: 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Left);..      /*
a410: 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
a420: 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54   an 'x IN(SELECT
a430: 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49  ...)' or an 'x I
a440: 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20  N(<exprlist>)'. 
a450: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
a460: 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64  on it is handled
a470: 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41   the same way. A
a480: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
a490: 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c  s .      ** fill
a4a0: 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66  ed with single-f
a4b0: 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20  ield index keys 
a4c0: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
a4d0: 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a   results.      *
a4e0: 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43  * from the SELEC
a4f0: 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69  T or the <exprli
a500: 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  st>..      **.  
a510: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78      ** If the 'x
a520: 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ' expression is 
a530: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
a540: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
a550: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
a560: 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f  ent returns a co
a570: 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  lumn value, then
a580: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
a590: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
a5a0: 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f  olumn is used to
a5b0: 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78   build the index
a5c0: 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27   keys. If both '
a5d0: 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20  x' and the.     
a5e0: 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74   ** SELECT... st
a5f0: 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
a600: 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
a610: 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  c affinity is us
a620: 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65  ed.      ** if e
a630: 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73  ither column has
a640: 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45   NUMERIC or INTE
a650: 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66  GER affinity. If
a660: 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a   neither.      *
a670: 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45  * 'x' nor the SE
a680: 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
a690: 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
a6a0: 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
a6b0: 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73  nity.      ** is
a6c0: 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   used..      */.
a6d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
a6e0: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ble = pParse->nT
a6f0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72  ab++;.      addr
a700: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
a710: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69  dOp(v, OP_OpenVi
a720: 72 74 75 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54  rtual, pExpr->iT
a730: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
a740: 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c  memset(&keyInfo,
a750: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e   0, sizeof(keyIn
a760: 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49  fo));.      keyI
a770: 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a  nfo.nField = 1;.
a780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a790: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
a7a0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70  NumColumns, pExp
a7b0: 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a  r->iTable, 1);..
a7c0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
a7d0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
a7e0: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
a7f0: 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
a800: 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
a810: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
a820: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
a830: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
a840: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
a850: 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
a860: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
a870: 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
a880: 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
a890: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a8a0: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 45    int iParm = pE
a8b0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20 28  xpr->iTable +  (
a8c0: 28 28 69 6e 74 29 61 66 66 69 6e 69 74 79 29 3c  ((int)affinity)<
a8d0: 3c 31 36 29 3b 0a 20 20 20 20 20 20 20 20 45 78  <16);.        Ex
a8e0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
a8f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a900: 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30  (pExpr->iTable&0
a910: 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70  x0000FFFF)==pExp
a920: 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
a930: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
a940: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
a950: 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 53  ->pSelect, SRT_S
a960: 65 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c  et, iParm, 0, 0,
a970: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
a980: 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
a990: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
a9a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c  .        if( pEL
a9b0: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
a9c0: 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20  Expr>0 ){ .     
a9d0: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
a9e0: 6c 6c 5b 30 5d 20 3d 20 62 69 6e 61 72 79 43 6f  ll[0] = binaryCo
a9f0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
aa00: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
aa10: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
aa20: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
aa30: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
aa40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
aa50: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
aa60: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
aa70: 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
aa80: 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
aa90: 20 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63    **..** For eac
aaa0: 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
aab0: 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
aac0: 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
aad0: 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
aae0: 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
aaf0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
ab00: 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
ab10: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
ab20: 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
ab30: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
ab40: 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
ab50: 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
ab60: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
ab70: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
ab80: 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
ab90: 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
aba0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
abb0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
abc0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
abd0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
abe0: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
abf0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
ac00: 6d 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  m;..        if( 
ac10: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
ac20: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
ac30: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
ac40: 45 52 49 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ERIC;.        }.
ac50: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
ac60: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72  aColl[0] = pExpr
ac70: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  ->pLeft->pColl;.
ac80: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
ac90: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
aca0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70  pression in <exp
acb0: 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20  rlist>. */.     
acc0: 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e     for(i=pList->
acd0: 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69  nExpr, pItem=pLi
ace0: 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  st->a; i>0; i--,
acf0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
ad00: 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
ad10: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a   pItem->pExpr;..
ad20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ad30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ad40: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
ad50: 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
ad60: 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
ad70: 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
ad80: 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
ad90: 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
ada0: 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
adb0: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
adc0: 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
add0: 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
ade0: 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
adf0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
ae00: 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
ae10: 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
ae20: 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
ae30: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
ae40: 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41         if( testA
ae50: 64 64 72 3e 30 20 26 26 20 21 73 71 6c 69 74 65  ddr>0 && !sqlite
ae60: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
ae70: 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
ae80: 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20      VdbeOp *aOp 
ae90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
aea0: 4f 70 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31  Op(v, testAddr-1
aeb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
aec0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
aed0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 3b 20    for(i=0; i<3; 
aee0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
aef0: 20 20 20 20 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64      aOp[i].opcod
af00: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
af10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
af20: 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20         testAddr 
af30: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
af40: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
af50: 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
af60: 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
af70: 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
af80: 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
af90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
afa0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
afb0: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  2);.          sq
afc0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
afd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
afe0: 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20  , 0, &affinity, 
aff0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
b000: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b010: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
b020: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
b030: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b040: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b050: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
b060: 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29  , addr, (void *)
b070: 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  &keyInfo, P3_KEY
b080: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62 72 65  INFO);.      bre
b090: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
b0a0: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
b0b0: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
b0c0: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
b0d0: 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73  is has to be a s
b0e0: 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47  calar SELECT.  G
b0f0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
b100: 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  put the.      **
b110: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73   value of this s
b120: 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72  elect in a memor
b130: 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72  y cell and recor
b140: 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20  d the number.   
b150: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d     ** of the mem
b160: 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c  ory cell in iCol
b170: 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  umn..      */.  
b180: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
b190: 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 28   Token one = { (
b1a0: 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20 7d 3b  u8*)"1", 0, 1 };
b1b0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
b1c0: 53 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Sel;.      int i
b1d0: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  Mem;.      int s
b1e0: 6f 70 3b 0a 0a 20 20 20 20 20 20 70 45 78 70 72  op;..      pExpr
b1f0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d 65 6d  ->iColumn = iMem
b200: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
b210: 2b 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  +;.      pSel = 
b220: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a  pExpr->pSelect;.
b230: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
b240: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
b250: 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20  {.        sop = 
b260: 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20  SRT_Mem;.       
b270: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b280: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c  p(v, OP_MemNull,
b290: 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20   iMem, 0);.     
b2a0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
b2b0: 76 2c 20 22 23 20 49 6e 69 74 20 73 75 62 71 75  v, "# Init subqu
b2c0: 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
b2d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b2e0: 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 45 78      sop = SRT_Ex
b2f0: 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
b300: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b310: 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20  , OP_MemInt, 0, 
b320: 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  iMem);.        V
b330: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
b340: 23 20 49 6e 69 74 20 45 58 49 53 54 53 20 72 65  # Init EXISTS re
b350: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
b360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b370: 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70  prDelete(pSel->p
b380: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
b390: 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
b3a0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 54 45  ite3Expr(TK_INTE
b3b0: 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29  GER, 0, 0, &one)
b3c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
b3d0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
b3e0: 65 6c 2c 20 73 6f 70 2c 20 69 4d 65 6d 2c 20 30  el, sop, iMem, 0
b3f0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
b400: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b410: 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64   }..  if( testAd
b420: 64 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  dr ){.    sqlite
b430: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b440: 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a   testAddr);.  }.
b450: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
b460: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b470: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
b480: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
b490: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
b4a0: 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
b4b0: 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
b4c0: 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
b4d0: 6e 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74 61 63  n-1] on the stac
b4e0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
b4f0: 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64  d codeInteger(Vd
b500: 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
b510: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
b520: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 73 71 6c  int i;.  if( sql
b530: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 2c 20  ite3GetInt32(z, 
b540: 26 69 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  &i) ){.    sqlit
b550: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b560: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
b570: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
b580: 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42 69 74  lite3FitsIn64Bit
b590: 73 28 7a 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  s(z) ){.    sqli
b5a0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
b5b0: 5f 49 6e 74 36 34 2c 20 30 2c 20 30 2c 20 7a 2c  _Int64, 0, 0, z,
b5c0: 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   n);.  }else{.  
b5d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
b5e0: 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
b5f0: 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a  0, z, n);.  }.}.
b600: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b610: 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
b620: 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
b630: 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
b640: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
b650: 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65 73  nd leave the res
b660: 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  ult on the top o
b670: 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  f stack..**.** T
b680: 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
b690: 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
b6a0: 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
b6b0: 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
b6c0: 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
b6d0: 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
b6e0: 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
b6f0: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
b700: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
b710: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
b720: 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
b730: 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
b740: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
b750: 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
b760: 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
b770: 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
b780: 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
b790: 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
b7a0: 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
b7b0: 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
b7c0: 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
b7d0: 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
b7e0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
b7f0: 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
b800: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
b810: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
b820: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
b830: 20 6f 70 3b 0a 20 20 69 6e 74 20 73 74 61 63 6b   op;.  int stack
b840: 43 68 6e 67 20 3d 20 31 3b 20 20 20 20 2f 2a 20  Chng = 1;    /* 
b850: 41 6d 6f 75 6e 74 20 6f 66 20 63 68 61 6e 67 65  Amount of change
b860: 20 74 6f 20 73 74 61 63 6b 20 64 65 70 74 68 20   to stack depth 
b870: 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  */..  if( v==0 )
b880: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
b890: 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Expr==0 ){.    s
b8a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b8b0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
b8c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
b8d0: 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d   }.  op = pExpr-
b8e0: 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
b8f0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
b900: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
b910: 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
b920: 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
b930: 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
b940: 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
b950: 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
b960: 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
b970: 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
b980: 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
b990: 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
b9a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b9b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
b9c0: 61 64 2c 20 70 43 6f 6c 2d 3e 69 4d 65 6d 2c 20  ad, pCol->iMem, 
b9d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
b9e0: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
b9f0: 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
ba00: 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
ba10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ba20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
ba30: 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
ba40: 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
ba70: 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 29 3b 0a 20  SorterColumn);. 
ba80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ba90: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
baa0: 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
bab0: 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
bac0: 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
bad0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
bae0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
baf0: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
bb00: 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  le<0 ){.        
bb10: 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
bb20: 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67  pens when coding
bb30: 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e   check constrain
bb40: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
bb50: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b  sert( pParse->ck
bb60: 4f 66 66 73 65 74 3e 30 20 29 3b 0a 20 20 20 20  Offset>0 );.    
bb70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bb80: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
bb90: 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
bba0: 2d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  -pExpr->iColumn-
bbb0: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1, 1);.      }el
bbc0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43  se if( pExpr->iC
bbd0: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
bbe0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
bbf0: 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
bc00: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
bc10: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
bc20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
bc30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
bc40: 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  _Column, pExpr->
bc50: 69 54 61 62 6c 65 2c 20 69 43 6f 6c 29 3b 0a 20  iTable, iCol);. 
bc60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
bc70: 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
bc80: 54 61 62 2c 20 69 43 6f 6c 29 3b 0a 23 69 66 6e  Tab, iCol);.#ifn
bc90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bca0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
bcb0: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20         if( pTab 
bcc0: 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  && pTab->aCol[iC
bcd0: 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol].affinity==SQ
bce0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 7b  LITE_AFF_REAL ){
bcf0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
bd00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bd10: 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
bd20: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  0, 0);.        }
bd30: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
bd40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
bd50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bd60: 20 4f 50 5f 52 6f 77 69 64 2c 20 70 45 78 70 72   OP_Rowid, pExpr
bd70: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
bd80: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
bd90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
bda0: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
bdb0: 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
bdc0: 72 28 76 2c 20 28 63 68 61 72 2a 29 70 45 78 70  r(v, (char*)pExp
bdd0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
bde0: 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
bdf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
be00: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
be10: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  T:.    case TK_S
be20: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61  TRING: {.      a
be30: 73 73 65 72 74 28 20 54 4b 5f 46 4c 4f 41 54 3d  ssert( TK_FLOAT=
be40: 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20  =OP_Real );.    
be50: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 54 52    assert( TK_STR
be60: 49 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e 67 38 20  ING==OP_String8 
be70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
be80: 44 65 71 75 6f 74 65 45 78 70 72 28 70 45 78 70  DequoteExpr(pExp
be90: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
bea0: 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20  3VdbeOp3(v, op, 
beb0: 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 70 45 78  0, 0, (char*)pEx
bec0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
bed0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
bee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bef0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
bf00: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
bf10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bf20: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20  P_Null, 0, 0);. 
bf30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bf40: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
bf50: 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
bf60: 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
bf70: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
bf80: 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
bf90: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 61  char *z;.      a
bfa0: 73 73 65 72 74 28 20 54 4b 5f 42 4c 4f 42 3d 3d  ssert( TK_BLOB==
bfb0: 4f 50 5f 48 65 78 42 6c 6f 62 20 29 3b 0a 20 20  OP_HexBlob );.  
bfc0: 20 20 20 20 6e 20 3d 20 70 45 78 70 72 2d 3e 74      n = pExpr->t
bfd0: 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20 20  oken.n - 3;.    
bfe0: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 45 78    z = (char*)pEx
bff0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b  pr->token.z + 2;
c000: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
c010: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
c020: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
c030: 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d   z = "";.      }
c040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c050: 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20  beOp3(v, op, 0, 
c060: 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  0, z, n);.      
c070: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
c080: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
c090: 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
c0a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c0b0: 4f 70 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c  Op(v, OP_Variabl
c0c0: 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e, pExpr->iTable
c0d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
c0e0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31  pExpr->token.n>1
c0f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c100: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
c110: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 45  v, -1, (char*)pE
c120: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
c130: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
c140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
c150: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
c160: 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
c170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
c180: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
c190: 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69  emLoad, pExpr->i
c1a0: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
c1b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
c1c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c1d0: 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
c1e0: 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
c1f0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
c200: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
c210: 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
c220: 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  en) */.      int
c230: 20 61 66 66 2c 20 6f 70 3b 0a 20 20 20 20 20 20   aff, op;.      
c240: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c250: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
c260: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 66 66  Left);.      aff
c270: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
c280: 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e 74  tyType(&pExpr->t
c290: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 6f 70 20  oken);.      op 
c2a0: 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41  = aff - SQLITE_A
c2b0: 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54  FF_TEXT + OP_ToT
c2c0: 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ext;.      asser
c2d0: 74 28 20 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74  t( op==OP_ToText
c2e0: 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
c2f0: 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29  TE_AFF_TEXT    )
c300: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c310: 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20  op==OP_ToBlob   
c320: 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
c330: 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20  AFF_NONE    );. 
c340: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
c350: 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c  =OP_ToNumeric ||
c360: 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
c370: 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20  _NUMERIC );.    
c380: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50    assert( op==OP
c390: 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66  _ToInt     || af
c3a0: 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f!=SQLITE_AFF_IN
c3b0: 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61  TEGER );.      a
c3c0: 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 54 6f  ssert( op==OP_To
c3d0: 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d  Real    || aff!=
c3e0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
c3f0: 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
c400: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c410: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
c420: 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a   stackChng = 0;.
c430: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c440: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
c450: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
c460: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
c470: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
c480: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
c490: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
c4a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
c4b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
c4c0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
c4d0: 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
c4e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c4f0: 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
c500: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c510: 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
c520: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
c530: 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
c540: 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
c550: 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
c560: 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
c570: 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  _Ne );.      sql
c580: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c590: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
c5a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c5b0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
c5c0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
c5d0: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
c5e0: 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
c5f0: 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
c600: 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c 20  >pRight, op, 0, 
c610: 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43  0);.      stackC
c620: 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  hng = -1;.      
c630: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c640: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
c650: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
c660: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
c670: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
c680: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
c690: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
c6a0: 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
c6b0: 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
c6c0: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
c6d0: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
c6e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
c6f0: 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
c700: 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
c710: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
c720: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c730: 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20  AND==OP_And );. 
c740: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c750: 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20  OR==OP_Or );.   
c760: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
c770: 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20  US==OP_Add );.  
c780: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
c790: 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
c7a0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
c7b0: 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
c7c0: 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20  mainder );.     
c7d0: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
c7e0: 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
c7f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c800: 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
c810: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
c820: 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
c830: 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20  Divide );.      
c840: 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
c850: 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
c860: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c870: 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
c880: 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20  hiftRight );.   
c890: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
c8a0: 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
c8b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c8c0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c8d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
c8e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c8f0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
c900: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
c910: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c920: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
c930: 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68  );.      stackCh
c940: 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62  ng = -1;.      b
c950: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c960: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
c970: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
c980: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
c990: 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
c9a0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
c9b0: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
c9c0: 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66  TK_FLOAT || pLef
c9d0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
c9e0: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b  R ){.        Tok
c9f0: 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e  en *p = &pLeft->
ca00: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 63  token;.        c
ca10: 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
ca20: 4d 50 72 69 6e 74 66 28 22 2d 25 2e 2a 73 22 2c  MPrintf("-%.*s",
ca30: 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a 20 20   p->n, p->z);.  
ca40: 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
ca50: 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
ca60: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ca70: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
ca80: 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 70  Real, 0, 0, z, p
ca90: 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ->n+1);.        
caa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
cab0: 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20   codeInteger(v, 
cac0: 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20  z, p->n+1);.    
cad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
cae0: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
caf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cb00: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
cb10: 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 54  l through into T
cb20: 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20  K_NOT */.    }. 
cb30: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
cb40: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
cb50: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
cb60: 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
cb70: 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20  P_BitNot );.    
cb80: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
cb90: 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20  ==OP_Not );.    
cba0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
cbb0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
cbc0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
cbd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cbe0: 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  v, op, 0, 0);.  
cbf0: 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
cc00: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
cc10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
cc20: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
cc30: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
cc40: 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b  .      int dest;
cc50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
cc60: 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
cc70: 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
cc80: 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
cc90: 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
cca0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ccb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
ccc0: 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ger, 1, 0);.    
ccd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
cce0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
ccf0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64  >pLeft);.      d
cd00: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
cd10: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
cd20: 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 2;.      sqlit
cd30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
cd40: 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 1, dest);.   
cd50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cd60: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
cd70: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , -1, 0);.      
cd80: 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20  stackChng = 0;. 
cd90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cda0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
cdb0: 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
cdc0: 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
cdd0: 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
cde0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
cdf0: 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
ce00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ce10: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
ce20: 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
ce30: 3a 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  : %T",.         
ce40: 20 20 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29     &pExpr->span)
ce50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ce60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ce70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
ce80: 6d 4c 6f 61 64 2c 20 70 49 6e 66 6f 2d 3e 61 46  mLoad, pInfo->aF
ce90: 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  unc[pExpr->iAgg]
cea0: 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  .iMem, 0);.     
ceb0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
cec0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
ced0: 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20  K_CONST_FUNC:.  
cee0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
cef0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
cf00: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
cf10: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
cf20: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c    int nExpr = pL
cf30: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
cf40: 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75  pr : 0;.      Fu
cf50: 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20  ncDef *pDef;.   
cf60: 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20     int nId;.    
cf70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
cf80: 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e  d;.      int con
cf90: 73 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  stMask = 0;.    
cfa0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75    int i;.      u
cfb0: 38 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e  8 enc = pParse->
cfc0: 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 43  db->enc;.      C
cfd0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
cfe0: 30 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 28  0;.      zId = (
cff0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
d000: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20  en.z;.      nId 
d010: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
d020: 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
d030: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
d040: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
d050: 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20  Id, nId, nExpr, 
d060: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  enc, 0);.      a
d070: 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29  ssert( pDef!=0 )
d080: 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
d090: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
d0a0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
d0b0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 6f  pList);.      fo
d0c0: 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26  r(i=0; i<nExpr &
d0d0: 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20  & i<32; i++){.  
d0e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
d0f0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
d100: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
d110: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
d120: 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c  constMask |= (1<
d130: 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <i);.        }. 
d140: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d         if( pDef-
d150: 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26 20  >needCollSeq && 
d160: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
d170: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
d180: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
d190: 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
d1a0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
d1b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
d1c0: 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65     if( pDef->nee
d1d0: 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
d1e0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
d1f0: 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
d200: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20  >db->pDfltColl; 
d210: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d220: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
d230: 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68  llSeq, 0, 0, (ch
d240: 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43  ar *)pColl, P3_C
d250: 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
d260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d270: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63  beOp3(v, OP_Func
d280: 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c  tion, constMask,
d290: 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29 70   nExpr, (char*)p
d2a0: 44 65 66 2c 20 50 33 5f 46 55 4e 43 44 45 46 29  Def, P3_FUNCDEF)
d2b0: 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e  ;.      stackChn
d2c0: 67 20 3d 20 31 2d 6e 45 78 70 72 3b 0a 20 20 20  g = 1-nExpr;.   
d2d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d2e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d2f0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
d300: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
d310: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
d320: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ECT: {.      sql
d330: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
d340: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  t(pParse, pExpr)
d350: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d360: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
d370: 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69  emLoad, pExpr->i
d380: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
d390: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
d3a0: 2c 20 22 23 20 6c 6f 61 64 20 73 75 62 71 75 65  , "# load subque
d3b0: 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
d3c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d3d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
d3e0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
d3f0: 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66  r;.      char af
d400: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 73 71  finity;.      sq
d410: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
d420: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
d430: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67  );..      /* Fig
d440: 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69  ure out the affi
d450: 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63  nity to use to c
d460: 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d  reate a key from
d470: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
d480: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70     ** of the exp
d490: 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74  ression. affinit
d4a0: 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74  yStr stores a st
d4b0: 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74  atic string suit
d4c0: 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a  able for.      *
d4d0: 2a 20 50 33 20 6f 66 20 4f 50 5f 4d 61 6b 65 52  * P3 of OP_MakeR
d4e0: 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ecord..      */.
d4f0: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
d500: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
d510: 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 20  ity(pExpr);..   
d520: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d530: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
d540: 72 2c 20 31 2c 20 30 29 3b 0a 0a 20 20 20 20 20  r, 1, 0);..     
d550: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78   /* Code the <ex
d560: 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
d570: 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20   IN (...)". The 
d580: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
d590: 20 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e        ** pExpr->
d5a0: 69 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20  iTable contains 
d5b0: 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
d5c0: 6d 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e  make up the (...
d5d0: 29 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ) set..      */.
d5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d5f0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
d600: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
d610: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d620: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
d630: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
d640: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d650: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61  P_NotNull, -1, a
d660: 64 64 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20  ddr+4);         
d670: 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a     /* addr + 0 *
d680: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
d690: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
d6a0: 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  op, 2, 0);.     
d6b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d6c0: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
d6d0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d6e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d6f0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b  P_Goto, 0, addr+
d700: 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  7);.      sqlite
d710: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
d720: 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c  akeRecord, 1, 0,
d730: 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 20   &affinity, 1); 
d740: 20 20 2f 2a 20 61 64 64 72 20 2b 20 34 20 2a 2f    /* addr + 4 */
d750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d760: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f  beAddOp(v, OP_Fo
d770: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
d780: 6c 65 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20  le, addr+7);.   
d790: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d7a0: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
d7b0: 2c 20 2d 31 2c 20 30 29 3b 20 20 20 20 20 20 20  , -1, 0);       
d7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64             /* ad
d7d0: 64 72 20 2b 20 36 20 2a 2f 0a 0a 20 20 20 20 20  dr + 6 */..     
d7e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
d7f0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
d800: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
d810: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
d820: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
d830: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d840: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d  ist_item *pLItem
d850: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
d860: 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
d870: 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
d880: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
d890: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d8a0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
d8b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d8c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
d8d0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
d8e0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d8f0: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
d900: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
d910: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
d920: 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c  Right, OP_Ge, 0,
d930: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d940: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d950: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
d960: 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
d970: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
d980: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
d990: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
d9a0: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
d9b0: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
d9c0: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
d9d0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
d9e0: 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Le, 0, 0);.     
d9f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
da00: 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20  p(v, OP_And, 0, 
da10: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
da20: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
da30: 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61  TK_UPLUS:.    ca
da40: 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20  se TK_AS: {.    
da50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
da60: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
da70: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
da80: 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20  tackChng = 0;.  
da90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
daa0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
dab0: 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  E: {.      int e
dac0: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20  xpr_end_label;. 
dad0: 20 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73       int jumpIns
dae0: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  t;.      int nEx
daf0: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  pr;.      int i;
db00: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
db10: 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  *pEList;.      s
db20: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
db30: 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a  tem *aListelem;.
db40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
db50: 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  xpr->pList);.   
db60: 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72     assert((pExpr
db70: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25  ->pList->nExpr %
db80: 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20   2) == 0);.     
db90: 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70   assert(pExpr->p
dba0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
dbb0: 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
dbc0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
dbd0: 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
dbe0: 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
dbf0: 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
dc00: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
dc10: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20  xpr_end_label = 
dc20: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
dc30: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
dc40: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
dc50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
dc60: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
dc70: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
dc80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dc90: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
dca0: 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
dcb0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
dcc0: 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
dcd0: 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  lem[i].pExpr);. 
dce0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
dcf0: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
dd00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
dd20: 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   1, 1);.        
dd30: 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64    jumpInst = cod
dd40: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
dd50: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61   pExpr->pLeft, a
dd60: 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
dd70: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29      OP_Ne, 0, 1)
dda0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ddb0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ddc0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
ddd0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
dde0: 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
ddf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
de00: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  dOp(v, OP_IfNot,
de10: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
de20: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
de30: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
de40: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
de50: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
de60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
de70: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
de80: 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29   expr_end_label)
de90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
dea0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
deb0: 20 6a 75 6d 70 49 6e 73 74 29 3b 0a 20 20 20 20   jumpInst);.    
dec0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
ded0: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
dee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
def0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
df00: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
df10: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
df20: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
df30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
df40: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
df50: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
df60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
df70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
df80: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
df90: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
dfa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
dfb0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78  solveLabel(v, ex
dfc0: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20  pr_end_label);. 
dfd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dfe0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
dff0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
e000: 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
e010: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   {.      if( !pP
e020: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
e030: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e040: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e050: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
e060: 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
e070: 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
e080: 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
e090: 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
e0a0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d  .return;.      }
e0b0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
e0c0: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67  ->iColumn!=OE_Ig
e0d0: 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
e0e0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e0f0: 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c  iColumn==OE_Roll
e100: 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20  back ||.        
e110: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
e120: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62  iColumn == OE_Ab
e130: 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ort ||.         
e140: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
e150: 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69  Column == OE_Fai
e160: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  l );.         sq
e170: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
e180: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
e190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
e1a0: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
e1b0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
e1c0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a  pExpr->iColumn,.
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
e1f0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
e200: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
e210: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
e220: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e230: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
e240: 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20  = OE_Ignore );. 
e250: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e260: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
e270: 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29  ontextPop, 0, 0)
e280: 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
e290: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e2a0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73  P_Goto, 0, pPars
e2b0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67  e->trigStack->ig
e2c0: 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20  noreJump);.     
e2d0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e2e0: 28 76 2c 20 22 23 20 72 61 69 73 65 28 49 47 4e  (v, "# raise(IGN
e2f0: 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d  ORE)"));.      }
e300: 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
e310: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
e320: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
e330: 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73    }..  if( pPars
e340: 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29 7b 0a 20  e->ckOffset ){. 
e350: 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66     pParse->ckOff
e360: 73 65 74 20 2b 3d 20 73 74 61 63 6b 43 68 6e 67  set += stackChng
e370: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
e380: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29  arse->ckOffset )
e390: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
e3a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
e3b0: 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  GGER./*.** Gener
e3c0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
e3d0: 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e  alutes the given
e3e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
e3f0: 6c 65 61 76 65 73 20 74 68 65 20 72 65 73 75 6c  leaves the resul
e400: 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63  t.** on the stac
e410: 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  k.  See also sql
e420: 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 0a  ite3ExprCode()..
e430: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e440: 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 63 61  ne might also ca
e450: 63 68 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  che the result a
e460: 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 70 45  nd modify the pE
e470: 78 70 72 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74  xpr tree.** so t
e480: 68 61 74 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65  hat it will make
e490: 20 75 73 65 20 6f 66 20 74 68 65 20 63 61 63 68   use of the cach
e4a0: 65 64 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  ed result on sub
e4b0: 73 65 71 75 65 6e 74 20 65 76 61 6c 75 61 74 69  sequent evaluati
e4c0: 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ons.** rather th
e4d0: 61 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  an evaluate the 
e4e0: 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  whole expression
e4f0: 20 61 67 61 69 6e 2e 20 20 54 72 69 76 69 61 6c   again.  Trivial
e500: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
e510: 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65 64 2e 20  .** not cached. 
e520: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
e530: 6f 6e 20 69 73 20 63 61 63 68 65 64 2c 20 69 74  on is cached, it
e540: 73 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  s result is stor
e550: 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f  ed in a .** memo
e560: 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  ry location..*/.
e570: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
e580: 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
e590: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
e5a0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65   *pExpr){.  Vdbe
e5b0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
e5c0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  dbe;.  int iMem;
e5d0: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64  .  int addr1, ad
e5e0: 64 72 32 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dr2;.  if( v==0 
e5f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 64 64 72  ) return;.  addr
e600: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
e610: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
e620: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e630: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
e640: 0a 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74  .  addr2 = sqlit
e650: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e660: 72 28 76 29 3b 0a 20 20 69 66 28 20 61 64 64 72  r(v);.  if( addr
e670: 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20 73 71 6c  2>addr1+1 || sql
e680: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
e690: 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f 64 65 3d   addr1)->opcode=
e6a0: 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a  =OP_Function ){.
e6b0: 20 20 20 20 69 4d 65 6d 20 3d 20 70 45 78 70 72      iMem = pExpr
e6c0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
e6d0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73  e->nMem++;.    s
e6e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e6f0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
e700: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 70 45  iMem, 0);.    pE
e710: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
e720: 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ISTER;.  }.}.#en
e730: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
e740: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
e750: 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
e760: 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
e770: 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
e780: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e790: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
e7a0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
e7b0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
e7c0: 6e 74 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20  nts pushed onto 
e7d0: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e  the stack..*/.in
e7e0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
e7f0: 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
e800: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e810: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
e820: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
e830: 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68   *pList    /* Th
e840: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e850: 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
e860: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
e870: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
e880: 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  m;.  int i, n;. 
e890: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
e8a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20  return 0;.  n = 
e8b0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
e8c0: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
e8d0: 3e 61 2c 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d  >a, i=n; i>0; i-
e8e0: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
e8f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e900: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
e910: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
e920: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
e930: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
e940: 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
e950: 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
e960: 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
e970: 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
e980: 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
e990: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
e9a0: 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
e9b0: 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
e9c0: 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
e9d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e9e0: 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
e9f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
ea00: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
ea10: 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
ea20: 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
ea30: 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
ea40: 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
ea50: 6c 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e  ll flag is true.
ea60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
ea70: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
ea80: 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
ea90: 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
eaa0: 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
eab0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
eac0: 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
ead0: 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
eae0: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
eaf0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
eb00: 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
eb10: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
eb20: 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
eb30: 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
eb40: 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
eb50: 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
eb60: 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
eb70: 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
eb80: 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
eb90: 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
eba0: 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
ebb0: 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
ebc0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
ebd0: 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
ebe0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
ebf0: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
ec00: 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
ec10: 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
ec20: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
ec30: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
ec40: 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50  nt ckOffset = pP
ec50: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a  arse->ckOffset;.
ec60: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
ec70: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
ec80: 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
ec90: 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
eca0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
ecb0: 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
ecc0: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
ecd0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
ece0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
ecf0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
ed00: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
ed10: 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20   !jumpIfNull);. 
ed20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ed30: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
ed40: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
ed50: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
ed60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ed70: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
ed80: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
ed90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
eda0: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
edb0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
edc0: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
edd0: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
ede0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
edf0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
ee00: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
ee10: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
ee20: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
ee30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ee40: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
ee50: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
ee60: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
ee70: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ee80: 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
ee90: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
eea0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
eeb0: 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
eec0: 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
eed0: 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
eee0: 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
eef0: 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
ef00: 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
ef10: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
ef20: 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
ef30: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
ef40: 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
ef50: 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
ef60: 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
ef70: 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
ef80: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ef90: 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
efa0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
efb0: 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
efc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
efd0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
efe0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
eff0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f000: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
f010: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
f020: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
f030: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f040: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
f050: 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , op, dest, jump
f060: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
f070: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f080: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
f090: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
f0a0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
f0b0: 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
f0c0: 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
f0d0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
f0e0: 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
f0f0: 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
f100: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f110: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
f120: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f130: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
f140: 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
f150: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f160: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
f170: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
f180: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 78 20 42   expression "x B
f190: 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20  ETWEEN y AND z" 
f1a0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
f1b0: 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
f1c0: 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3c 20 79    ** 1 IF (x < y
f1d0: 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a  ) GOTO 3.      *
f1e0: 2a 20 32 20 49 46 20 28 78 20 3c 3d 20 7a 29 20  * 2 IF (x <= z) 
f1f0: 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20  GOTO <dest>.    
f200: 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20    ** 3 ....     
f210: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
f220: 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  dr;.      Expr *
f230: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
f240: 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
f250: 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
f260: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
f270: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
f280: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f290: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  e, pLeft);.     
f2a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f2b0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
f2c0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f2d0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f2e0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
f2f0: 20 61 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70   addr = codeComp
f300: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
f310: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74  t, pRight, OP_Lt
f320: 2c 20 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  , 0, !jumpIfNull
f330: 29 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74  );..      pRight
f340: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
f350: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
f360: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f370: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
f380: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
f390: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
f3a0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
f3b0: 4c 65 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  Le, dest, jumpIf
f3c0: 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71  Null);..      sq
f3d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f3e0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
f3f0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
f400: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
f410: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 73  , addr);.      s
f420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f430: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
f440: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f450: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
f460: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
f470: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f480: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
f490: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f4a0: 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49  (v, OP_If, jumpI
f4b0: 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20  fNull, dest);.  
f4c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f4d0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63  .  }.  pParse->c
f4e0: 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73  kOffset = ckOffs
f4f0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  et;.}../*.** Gen
f500: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
f510: 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
f520: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
f530: 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
f540: 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
f550: 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
f560: 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
f570: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
f580: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
f590: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
f5a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
f5b0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
f5c0: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
f5d0: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
f5e0: 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
f5f0: 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
f600: 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
f610: 20 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c   is true or fall
f620: 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
f630: 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e  IfNull is false.
f640: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f650: 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
f660: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
f670: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
f680: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
f690: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
f6a0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f6b0: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
f6c0: 74 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61  t ckOffset = pPa
f6d0: 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20  rse->ckOffset;. 
f6e0: 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
f6f0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
f700: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
f710: 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
f720: 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
f730: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
f740: 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
f750: 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
f760: 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
f770: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
f780: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
f790: 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
f7a0: 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
f7b0: 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
f7c0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
f7d0: 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
f7e0: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
f800: 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
f810: 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
f820: 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
f830: 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
f840: 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
f850: 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
f860: 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
f870: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
f880: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
f890: 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
f8a0: 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
f8b0: 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
f8c0: 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
f8d0: 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
f8e0: 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
f8f0: 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
f900: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
f910: 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
f920: 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
f930: 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
f940: 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
f950: 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
f960: 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
f970: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
f980: 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
f990: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
f9a0: 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
f9b0: 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
f9c0: 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
f9d0: 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
f9e0: 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
f9f0: 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
fa00: 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
fa10: 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
fa20: 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
fa30: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
fa40: 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
fa50: 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
fa60: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
fa70: 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
fa80: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
fa90: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
faa0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
fab0: 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
fac0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
fad0: 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
fae0: 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
faf0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
fb00: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
fb10: 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
fb20: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
fb30: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
fb40: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
fb50: 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
fb60: 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
fb70: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
fb80: 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
fb90: 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
fba0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
fbb0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
fbc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
fbd0: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
fbe0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
fbf0: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
fc00: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
fc10: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
fc20: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
fc30: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
fc40: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
fc50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
fc60: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
fc70: 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
fc80: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
fc90: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
fca0: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
fcb0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
fcc0: 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  , d2, !jumpIfNul
fcd0: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
fce0: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
fcf0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
fd00: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
fd10: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
fd20: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
fd30: 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
fd40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fd50: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
fd60: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
fd70: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
fd80: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
fd90: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
fda0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
fdb0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fdc0: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
fdd0: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
fde0: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
fdf0: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
fe00: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
fe10: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73  TK_EQ: {.      s
fe20: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
fe30: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
fe40: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
fe50: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
fe60: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
fe70: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
fe80: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
fe90: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
fea0: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64  r->pRight, op, d
feb0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
fec0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fed0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fee0: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
fef0: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
ff00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ff10: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
ff20: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
ff30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ff40: 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
ff50: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
ff60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ff70: 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
ff80: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
ff90: 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42 45 54  ession is "x BET
ffa0: 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49  WEEN y AND z". I
ffb0: 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  t is implemented
ffc0: 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
ffd0: 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3e      ** 1 IF (x >
ffe0: 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20  = y) GOTO 3.    
fff0: 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73    ** 2 GOTO <des
10000 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 49 46  t>.      ** 3 IF
10010 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64   (x > z) GOTO <d
10020 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  est>.      */.  
10030 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
10040 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
10050 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
10060 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
10070 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
10080 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
10090 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
100a0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65  Code(pParse, pLe
100b0 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
100c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
100d0 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
100e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
100f0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
10100 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ht);.      addr 
10110 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
10120 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
10130 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
10140 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
10150 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64  ight, OP_Ge, add
10160 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  r+3, !jumpIfNull
10170 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
10180 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10190 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
101a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
101b0 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
101c0 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
101d0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
101e0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
101f0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
10200 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
10210 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
10220 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
10230 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
10240 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20  t, OP_Gt, dest, 
10250 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
10260 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10270 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
10280 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10290 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
102a0 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
102b0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
102c0 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e  P_IfNot, jumpIfN
102d0 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ull, dest);.    
102e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
102f0 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f   }.  pParse->ckO
10300 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74  ffset = ckOffset
10310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
10320 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
10330 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
10340 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
10350 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29   TRUE (non-zero)
10360 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20  .** if they are 
10370 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65  identical and re
10380 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
10390 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
103a0 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   way..*/.int sql
103b0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
103c0 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a  Expr *pA, Expr *
103d0 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pB){.  int i;.  
103e0 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a 20 20 20  if( pA==0 ){.   
103f0 20 72 65 74 75 72 6e 20 70 42 3d 3d 30 3b 0a 20   return pB==0;. 
10400 20 7d 65 6c 73 65 20 69 66 28 20 70 42 3d 3d 30   }else if( pB==0
10410 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10420 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
10430 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74  op!=pB->op ) ret
10440 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
10450 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
10460 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
10470 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
10480 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
10490 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
104a0 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66  Compare(pA->pLef
104b0 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20  t, pB->pLeft) ) 
104c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
104d0 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
104e0 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20  are(pA->pRight, 
104f0 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65  pB->pRight) ) re
10500 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
10510 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69  ->pList ){.    i
10520 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20  f( pB->pList==0 
10530 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
10540 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e  if( pA->pList->n
10550 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d  Expr!=pB->pList-
10560 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
10570 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
10580 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  i<pA->pList->nEx
10590 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
105a0 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
105b0 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73  Compare(pA->pLis
105c0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  t->a[i].pExpr, p
105d0 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  B->pList->a[i].p
105e0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
105f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
10600 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
10610 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29   if( pB->pList )
10620 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
10630 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53    }.  if( pA->pS
10640 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65  elect || pB->pSe
10650 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
10660 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c  .  if( pA->iTabl
10670 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c  e!=pB->iTable ||
10680 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42   pA->iColumn!=pB
10690 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75  ->iColumn ) retu
106a0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
106b0 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69  token.z ){.    i
106c0 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d  f( pB->token.z==
106d0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
106e0 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e    if( pB->token.
106f0 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29  n!=pA->token.n )
10700 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
10710 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
10720 6d 70 28 28 63 68 61 72 2a 29 70 41 2d 3e 74 6f  mp((char*)pA->to
10730 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70 42 2d  ken.z,(char*)pB-
10740 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b  >token.z,pB->tok
10750 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  en.n)!=0 ){.    
10760 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
10770 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
10780 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ;.}.../*.** Add 
10790 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
107a0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
107b0 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
107c0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
107d0 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
107e0 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
107f0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
10800 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
10810 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
10820 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
10830 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
10840 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
10850 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
10860 63 61 74 65 28 28 76 6f 69 64 2a 2a 29 26 70 49  cate((void**)&pI
10870 6e 66 6f 2d 3e 61 43 6f 6c 2c 20 73 69 7a 65 6f  nfo->aCol, sizeo
10880 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
10890 29 2c 20 33 29 3b 0a 20 20 69 66 28 20 69 3c 30  ), 3);.  if( i<0
108a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
108b0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
108c0 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
108d0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
108e0 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
108f0 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79  o->aFunc[] array
10900 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
10910 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
10920 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
10930 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
10940 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
10950 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
10960 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75  int addAggInfoFu
10970 6e 63 28 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  nc(AggInfo *pInf
10980 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  o){.  int i;.  i
10990 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
109a0 6c 6c 6f 63 61 74 65 28 28 76 6f 69 64 2a 2a 29  llocate((void**)
109b0 26 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 73  &pInfo->aFunc, s
109c0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
109d0 6e 63 5b 30 5d 29 2c 20 32 29 3b 0a 20 20 69 66  nc[0]), 2);.  if
109e0 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  ( i<0 ){.    ret
109f0 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  urn -1;.  }.  re
10a00 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
10a10 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
10a20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78  xFunc for walkEx
10a30 70 72 54 72 65 65 28 29 20 75 73 65 64 20 74 6f  prTree() used to
10a40 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73   implement .** s
10a50 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
10a60 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
10a70 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
10a80 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
10a90 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
10aa0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
10ab0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
10ac0 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 68 65 20  ne analyzes the 
10ad0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
10ae0 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a  on at pExpr..*/.
10af0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
10b00 7a 65 41 67 67 72 65 67 61 74 65 28 76 6f 69 64  zeAggregate(void
10b10 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45   *pArg, Expr *pE
10b20 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
10b30 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
10b40 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74  C = (NameContext
10b50 20 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65   *)pArg;.  Parse
10b60 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
10b70 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
10b80 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
10b90 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
10ba0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
10bb0 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f   = pNC->pAggInfo
10bc0 3b 0a 20 20 0a 0a 20 20 73 77 69 74 63 68 28 20  ;.  ..  switch( 
10bd0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
10be0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
10bf0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63   {.      /* Chec
10c00 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
10c10 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
10c20 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
10c30 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
10c40 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
10c50 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
10c60 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  y */.      if( p
10c70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  SrcList ){.     
10c80 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
10c90 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
10ca0 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
10cb0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
10cc0 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
10cd0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
10ce0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
10cf0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
10d00 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  l;.          if(
10d10 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
10d20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29  pItem->iCursor )
10d30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
10d40 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
10d50 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
10d60 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66  s that pExpr ref
10d70 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20  ers to a table. 
10d80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
10d90 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f  at is in the FRO
10da0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
10db0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
10dc0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a    .            *
10dd0 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
10de0 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   Make an entry f
10df0 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  or the column in
10e00 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
10e10 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  ] if there.     
10e20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
10e30 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20   an entry there 
10e40 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20  already..       
10e50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
10e60 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
10e70 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
10e80 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
10e90 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
10ea0 75 6d 6e 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; i++, pCol++
10eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
10ec0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
10ed0 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
10ee0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
10ef0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
10f00 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
10f10 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
10f20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10f30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
10f40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10f50 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
10f60 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
10f70 20 26 26 20 28 69 20 3d 20 61 64 64 41 67 67 49   && (i = addAggI
10f80 6e 66 6f 43 6f 6c 75 6d 6e 28 70 41 67 67 49 6e  nfoColumn(pAggIn
10f90 66 6f 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  fo))>=0 ){.     
10fa0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
10fb0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
10fc0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
10fd0 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
10fe0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
11000 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
11010 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
11020 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
11030 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
11040 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  >nMem++;.       
11050 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
11060 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
11070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
11080 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
11090 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
110a0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
110b0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
110c0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
110d0 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
110e0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
110f0 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
11100 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
11110 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
11120 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
11130 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
11180 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
111a0 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
111b0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
111c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
111d0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
111e0 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
111f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
11220 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
11230 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
11240 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
11250 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
11260 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11270 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
11290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
112a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
112b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
112c0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
112d0 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
112f0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
11300 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
11310 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
11330 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
11340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11350 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
11360 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
11370 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
11380 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
11390 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
113a0 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
113b0 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
113c0 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
113d0 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
113e0 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
113f0 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
11400 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
11410 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
11420 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
11430 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
11440 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
11450 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
11460 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
11470 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
11480 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
11490 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   = TK_AGG_COLUMN
114a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
114b0 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20  xpr->iAgg = i;. 
114c0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
114d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
114e0 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
114f0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
11500 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
11510 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
11520 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
11530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
11540 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
11550 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
11560 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  CTION: {.      /
11570 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74  * The pNC->nDept
11580 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65 73  h==0 test causes
11590 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
115a0 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69  ions in subqueri
115b0 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  es.      ** to b
115c0 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20  e ignored */.   
115d0 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70     if( pNC->nDep
115e0 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  th==0 ){.       
115f0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
11600 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
11610 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
11620 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
11630 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
11640 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
11650 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
11660 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
11670 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11680 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
11690 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
116a0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
116b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
116c0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
116d0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
116e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
116f0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
11700 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
11710 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
11720 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11740 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
11750 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  >=pAggInfo->nFun
11760 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
11770 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69  * pExpr is origi
11780 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77  nal.  Make a new
11790 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e   entry in pAggIn
117a0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20  fo->aFunc[].    
117b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
117c0 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72     u8 enc = pPar
117d0 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20  se->db->enc;.   
117e0 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67         i = addAg
117f0 67 49 6e 66 6f 46 75 6e 63 28 70 41 67 67 49 6e  gInfoFunc(pAggIn
11800 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
11810 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
11820 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
11830 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
11840 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
11850 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
11860 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
11870 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
11880 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
11890 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
118a0 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
118b0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
118c0 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
118e0 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
118f0 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
11900 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  n.n,.           
11910 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
11920 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c  List ? pExpr->pL
11930 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
11940 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
11950 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
11960 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
11970 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
11980 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
11990 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
119a0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
119b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
119c0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
119d0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
119e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
119f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11a00 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
11a10 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
11a20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
11a30 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
11a40 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
11a50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45     */.        pE
11a60 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20  xpr->iAgg = i;. 
11a70 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
11a80 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
11a90 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
11aa0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
11ab0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63   }.  }..  /* Rec
11ac0 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 73 75  ursively walk su
11ad0 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b 69 6e 67  bqueries looking
11ae0 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e   for TK_COLUMN n
11af0 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64 0a 20  odes that need. 
11b00 20 2a 2a 20 74 6f 20 62 65 20 63 68 61 6e 67 65   ** to be change
11b10 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  d to TK_AGG_COLU
11b20 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72 65 6d 65  MN.  But increme
11b30 6e 74 20 6e 44 65 70 74 68 20 73 6f 20 74 68 61  nt nDepth so tha
11b40 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47 5f 46 55  t.  ** TK_AGG_FU
11b50 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
11b60 73 75 62 71 75 65 72 69 65 73 20 77 69 6c 6c 20  subqueries will 
11b70 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  be unchanged..  
11b80 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
11b90 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
11ba0 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20  NC->nDepth++;.  
11bb0 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72    walkSelectExpr
11bc0 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c  (pExpr->pSelect,
11bd0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
11be0 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43  e, pNC);.    pNC
11bf0 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a  ->nDepth--;.  }.
11c00 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
11c10 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
11c20 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
11c30 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
11c40 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
11c50 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
11c60 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
11c70 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
11c80 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
11c90 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b  [] array..** Mak
11ca0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  e additional ent
11cb0 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72  ries to the pPar
11cc0 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
11cd0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
11ce0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11cf0 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
11d00 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
11d10 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
11d20 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
11d30 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  d by sqlite3Expr
11d40 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a  ResolveNames()..
11d50 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20  **.** If errors 
11d60 61 72 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20  are seen, leave 
11d70 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
11d80 20 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20   in zErrMsg and 
11d90 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  return.** the nu
11da0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
11db0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
11dc0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
11dd0 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
11de0 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
11df0 72 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  r){.  int nErr =
11e00 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45   pNC->pParse->nE
11e10 72 72 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  rr;.  walkExprTr
11e20 65 65 28 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a  ee(pExpr, analyz
11e30 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29  eAggregate, pNC)
11e40 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e  ;.  return pNC->
11e50 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 2d 20 6e  pParse->nErr - n
11e60 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  Err;.}../*.** Ca
11e70 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ll sqlite3ExprAn
11e80 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
11e90 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72  ) for every expr
11ea0 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20  ession in an.** 
11eb0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
11ec0 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
11ed0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
11ee0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
11ef0 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61   is found, the a
11f00 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73  nalysis is cut s
11f10 68 6f 72 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  hort..*/.int sql
11f20 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
11f30 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
11f40 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
11f50 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
11f60 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
11f70 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
11f80 69 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  i;.  int nErr = 
11f90 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  0;.  if( pList )
11fa0 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
11fb0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 6e  pList->a, i=0; n
11fc0 45 72 72 3d 3d 30 20 26 26 20 69 3c 70 4c 69 73  Err==0 && i<pLis
11fd0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
11fe0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  Item++){.      n
11ff0 45 72 72 20 2b 3d 20 73 71 6c 69 74 65 33 45 78  Err += sqlite3Ex
12000 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
12010 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
12020 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
12030 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
12040 0a 7d 0a                                         .}.