/ Hex Artifact Content
Login

Artifact fcdb7416e502cb7e26b933ccd44b0baff5b78420:


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 33 36 20 32 30 30 32 2f 30 31 2f 30 34 20 30  .36 2002/01/04 0
0220: 33 3a 30 39 3a 33 30 20 64 72 68 20 45 78 70 20  3:09:30 drh Exp 
0230: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
0240: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a  qliteInt.h"../*.
0250: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
0260: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
0270: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
0280: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
0290: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
02a0: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
02b0: 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
02c0: 20 69 6e 74 20 69 73 43 6f 6e 73 74 61 6e 74 28   int isConstant(
02d0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 73 77 69 74  Expr *p){.  swit
02e0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
02f0: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
0300: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
0310: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
0320: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
0330: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  ;.    default: {
0340: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
0350: 65 66 74 20 26 26 20 21 69 73 43 6f 6e 73 74 61  eft && !isConsta
0360: 6e 74 28 70 2d 3e 70 4c 65 66 74 29 20 29 20 72  nt(p->pLeft) ) r
0370: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69  eturn 0;.      i
0380: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 26 26 20  f( p->pRight && 
0390: 21 69 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70  !isConstant(p->p
03a0: 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
03b0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
03c0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
03d0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
03e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 4c  for(i=0; i<p->pL
03f0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
0400: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
0410: 21 69 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70  !isConstant(p->p
0420: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
0430: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
0440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
0450: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0460: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
0470: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  1;.}../*.** Walk
0480: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
0490: 74 72 65 65 20 61 6e 64 20 70 72 6f 63 65 73 73  tree and process
04a0: 20 6f 70 65 72 61 74 6f 72 73 20 6f 66 20 74 68   operators of th
04b0: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
04c0: 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
04d0: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ECT ...).**.** T
04e0: 68 65 73 65 20 6f 70 65 72 61 74 6f 72 73 20 68  hese operators h
04f0: 61 76 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73  ave to be proces
0500: 73 65 64 20 62 65 66 6f 72 65 20 63 6f 6c 75 6d  sed before colum
0510: 6e 20 6e 61 6d 65 73 20 61 72 65 0a 2a 2a 20 72  n names are.** r
0520: 65 73 6f 6c 76 65 64 20 62 65 63 61 75 73 65 20  esolved because 
0530: 65 61 63 68 20 73 75 63 68 20 6f 70 65 72 61 74  each such operat
0540: 6f 72 20 69 6e 63 72 65 6d 65 6e 74 73 20 70 50  or increments pP
0550: 61 72 73 65 2d 3e 6e 54 61 62 0a 2a 2a 20 74 6f  arse->nTab.** to
0560: 20 72 65 73 65 72 76 65 20 63 75 72 73 6f 72 20   reserve cursor 
0570: 6e 75 6d 62 65 72 73 20 66 6f 72 20 69 74 73 20  numbers for its 
0580: 6f 77 6e 20 75 73 65 2e 20 20 42 75 74 20 70 50  own use.  But pP
0590: 61 72 73 65 2d 3e 6e 54 61 62 0a 2a 2a 20 6e 65  arse->nTab.** ne
05a0: 65 64 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61  eds to be consta
05b0: 6e 74 20 6f 6e 63 65 20 77 65 20 62 65 67 69 6e  nt once we begin
05c0: 20 72 65 73 6f 6c 76 69 6e 67 20 63 6f 6c 75 6d   resolving colum
05d0: 6e 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  n names..**.** A
05e0: 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 70 72 6f  ctually, the pro
05f0: 63 65 73 73 69 6e 67 20 6f 66 20 49 4e 2d 53 45  cessing of IN-SE
0600: 4c 45 43 54 20 69 73 20 6f 6e 6c 79 20 73 74 61  LECT is only sta
0610: 72 74 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  rted by this.** 
0620: 72 6f 75 74 69 6e 65 2e 20 20 54 68 69 73 20 72  routine.  This r
0630: 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
0640: 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72   a cursor number
0650: 20 74 6f 20 74 68 65 20 49 4e 2d 53 45 4c 45 43   to the IN-SELEC
0660: 54 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20 6d 6f  T.** and then mo
0670: 76 65 73 20 6f 6e 2e 20 20 54 68 65 20 63 6f 64  ves on.  The cod
0680: 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 20  e generation is 
0690: 64 6f 6e 65 20 62 79 20 0a 2a 2a 20 73 71 6c 69  done by .** sqli
06a0: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
06b0: 28 29 20 77 68 69 63 68 20 6d 75 73 74 20 62 65  () which must be
06c0: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 77 61 72   called afterwar
06d0: 64 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ds..*/.void sqli
06e0: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53  teExprResolveInS
06f0: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
0700: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
0710: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
0720: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
0730: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
0740: 49 4e 20 26 26 20 70 45 78 70 72 2d 3e 70 53 65  IN && pExpr->pSe
0750: 6c 65 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 70  lect!=0 ){.    p
0760: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
0770: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
0780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
0790: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 20 73  pExpr->pLeft ) s
07a0: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
07b0: 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  InSelect(pParse,
07c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
07d0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
07e0: 52 69 67 68 74 20 29 20 73 71 6c 69 74 65 45 78  Right ) sqliteEx
07f0: 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63  prResolveInSelec
0800: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
0810: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66  >pRight);.    if
0820: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29  ( pExpr->pList )
0830: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
0840: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
0850: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
0860: 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ist;.      for(i
0870: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
0880: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
0890: 20 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f    sqliteExprReso
08a0: 6c 76 65 49 6e 53 65 6c 65 63 74 28 70 50 61 72  lveInSelect(pPar
08b0: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
08c0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
08d0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
08e0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
08f0: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
0900: 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
0910: 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  olumn name..*/.s
0920: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
0930: 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
0940: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
0950: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 22  liteStrICmp(z, "
0960: 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72  _ROWID_")==0 ) r
0970: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
0980: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20  qliteStrICmp(z, 
0990: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
09a0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
09b0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 22  liteStrICmp(z, "
09c0: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
09d0: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
09e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
09f0: 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20  outine walks an 
0a00: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
0a10: 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66  and resolves ref
0a20: 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61  erences to.** ta
0a30: 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f  ble columns.  No
0a40: 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  des of the form 
0a50: 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f  ID.ID or ID reso
0a60: 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69  lve into an.** i
0a70: 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c  ndex to the tabl
0a80: 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c  e in the table l
0a90: 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e  ist and a column
0aa0: 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 6f 70   offset.  The op
0ab0: 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 73 75 63 68  code.** for such
0ac0: 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65   nodes is change
0ad0: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20  d to TK_COLUMN. 
0ae0: 20 54 68 65 20 69 54 61 62 6c 65 20 76 61 6c 75   The iTable valu
0af0: 65 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20  e is changed.** 
0b00: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
0b10: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
0b20: 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
0b30: 20 70 6c 75 73 20 74 68 65 20 70 50 61 72 73 65   plus the pParse
0b40: 2d 3e 6e 54 61 62 0a 2a 2a 20 76 61 6c 75 65 2e  ->nTab.** value.
0b50: 20 20 54 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61    The iColumn va
0b60: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
0b70: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
0b80: 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  he column of the
0b90: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20   .** referenced 
0ba0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  table..**.** We 
0bb0: 61 6c 73 6f 20 63 68 65 63 6b 20 66 6f 72 20 69  also check for i
0bc0: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
0bd0: 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 4e  IN operator.  IN
0be0: 20 63 6f 6d 65 73 20 69 6e 20 74 77 6f 0a 2a 2a   comes in two.**
0bf0: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
0c00: 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e 20          expr IN 
0c10: 28 65 78 70 72 6c 69 73 74 29 0a 2a 2a 20 61 6e  (exprlist).** an
0c20: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65  d.**           e
0c30: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
0c40: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ..).**.** The fi
0c50: 72 73 74 20 66 6f 72 6d 20 69 73 20 68 61 6e 64  rst form is hand
0c60: 6c 65 64 20 62 79 20 63 72 65 61 74 69 6e 67 20  led by creating 
0c70: 61 20 73 65 74 20 68 6f 6c 64 69 6e 67 20 74 68  a set holding th
0c80: 65 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c  e list.** of all
0c90: 6f 77 65 64 20 76 61 6c 75 65 73 2e 20 20 54 68  owed values.  Th
0ca0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 61  e second form ca
0cb0: 75 73 65 73 20 74 68 65 20 53 45 4c 45 43 54 20  uses the SELECT 
0cc0: 74 6f 20 67 65 6e 65 72 61 74 65 20 0a 2a 2a 20  to generate .** 
0cd0: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
0ce0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
0cf0: 75 74 69 6e 65 20 61 6c 73 6f 20 6c 6f 6f 6b 73  utine also looks
0d00: 20 66 6f 72 20 73 63 61 6c 61 72 20 53 45 4c 45   for scalar SELE
0d10: 43 54 73 20 74 68 61 74 20 61 72 65 20 70 61 72  CTs that are par
0d20: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
0d30: 6f 6e 2e 0a 2a 2a 20 49 66 20 69 74 20 66 69 6e  on..** If it fin
0d40: 64 73 20 61 6e 79 2c 20 69 74 20 67 65 6e 65 72  ds any, it gener
0d50: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 77 72 69  ates code to wri
0d60: 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
0d70: 74 68 61 74 20 73 65 6c 65 63 74 0a 2a 2a 20 69  that select.** i
0d80: 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  nto a memory cel
0d90: 6c 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f 77 6e  l..**.** Unknown
0da0: 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 74 61 62 6c   columns or tabl
0db0: 65 73 20 70 72 6f 76 6f 6b 65 20 61 6e 20 65 72  es provoke an er
0dc0: 72 6f 72 2e 20 20 54 68 65 20 66 75 6e 63 74 69  ror.  The functi
0dd0: 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68  on returns.** th
0de0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
0df0: 72 73 20 73 65 65 6e 20 61 6e 64 20 6c 65 61 76  rs seen and leav
0e00: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
0e10: 61 67 65 20 6f 6e 20 70 50 61 72 73 65 2d 3e 7a  age on pParse->z
0e20: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
0e30: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
0e40: 49 64 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  Ids(Parse *pPars
0e50: 65 2c 20 49 64 4c 69 73 74 20 2a 70 54 61 62 4c  e, IdList *pTabL
0e60: 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ist, Expr *pExpr
0e70: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
0e80: 30 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30  0 || pTabList==0
0e90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
0ea0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
0eb0: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e   ){.    /* A lon
0ec0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a  e identifier */.
0ed0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20      case TK_ID: 
0ee0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  {.      int cnt 
0ef0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  = 0;      /* Num
0f00: 62 65 72 20 6f 66 20 6d 61 74 63 68 65 73 20 2a  ber of matches *
0f10: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
0f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
0f30: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
0f40: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c     char *z = sql
0f50: 69 74 65 53 74 72 4e 44 75 70 28 70 45 78 70 72  iteStrNDup(pExpr
0f60: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
0f70: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
0f80: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
0f90: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  urn 1;.      for
0fa0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
0fb0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
0fc0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
0fd0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
0fe0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
0ff0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  .pTab;.        i
1000: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e  f( pTab==0 ) con
1010: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66  tinue;.        f
1020: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
1030: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
1040: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1050: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
1060: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 29 3d  ol[j].zName, z)=
1070: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1080: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
1090: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
10a0: 6c 65 20 3d 20 69 20 2b 20 70 50 61 72 73 65 2d  le = i + pParse-
10b0: 3e 6e 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >nTab;.         
10c0: 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e     if( j==pTab->
10d0: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
10e0: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69         /* Substi
10f0: 74 75 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  tute the record 
1100: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 49  number for the I
1110: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1120: 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  EY */.          
1130: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
1140: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
1150: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1160: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1170: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  >iColumn = j;.  
1180: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
11b0: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 73 71  if( cnt==0 && sq
11c0: 6c 69 74 65 49 73 52 6f 77 69 64 28 7a 29 20 29  liteIsRowid(z) )
11d0: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
11e0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  >iColumn = -1;. 
11f0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
1200: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
1210: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 63 6e 74  Tab;.        cnt
1220: 20 3d 20 31 20 2b 20 28 70 54 61 62 4c 69 73 74   = 1 + (pTabList
1230: 2d 3e 6e 49 64 3e 31 29 3b 0a 20 20 20 20 20 20  ->nId>1);.      
1240: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  }.      sqliteFr
1250: 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  ee(z);.      if(
1260: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   cnt==0 ){.     
1270: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
1280: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
1290: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 63  rMsg, "no such c
12a0: 6f 6c 75 6d 6e 3a 20 22 2c 20 2d 31 2c 20 20 0a  olumn: ", -1,  .
12b0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
12c0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
12d0: 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20  >token.n, 0);.  
12e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
12f0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65  rr++;.        re
1300: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
1310: 6c 73 65 20 69 66 28 20 63 6e 74 3e 31 20 29 7b  lse if( cnt>1 ){
1320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
1330: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
1340: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61 6d 62  e->zErrMsg, "amb
1350: 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61  iguous column na
1360: 6d 65 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20  me: ", -1,  .   
1370: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
1380: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
1390: 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ken.n, 0);.     
13a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
13b0: 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  +;.        retur
13c0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
13d0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
13e0: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
13f0: 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 20 20  break; .    }.  
1400: 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  .    /* A table 
1410: 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  name and column 
1420: 6e 61 6d 65 3a 20 20 49 44 2e 49 44 20 2a 2f 0a  name:  ID.ID */.
1430: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
1440: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74   {.      int cnt
1450: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1460: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
1470: 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
1480: 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20  int cntTab = 0; 
1490: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14a0: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74  er of matching t
14b0: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  ables */.      i
14c0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
14d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
14e0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
14f0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70   Expr *pLeft, *p
1500: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 4c 65 66  Right;    /* Lef
1510: 74 20 61 6e 64 20 72 69 67 68 74 20 73 75 62 62  t and right subb
1520: 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20 65  ranches of the e
1530: 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  xpr */.      cha
1540: 72 20 2a 7a 4c 65 66 74 2c 20 2a 7a 52 69 67 68  r *zLeft, *zRigh
1550: 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
1560: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 2a   an identifier *
1570: 2f 0a 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d  /..      pLeft =
1580: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1590: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
15a0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
15b0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
15c0: 20 26 26 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   && pLeft->op==T
15d0: 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 61 73  K_ID );.      as
15e0: 73 65 72 74 28 20 70 52 69 67 68 74 20 26 26 20  sert( pRight && 
15f0: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  pRight->op==TK_I
1600: 44 20 29 3b 0a 20 20 20 20 20 20 7a 4c 65 66 74  D );.      zLeft
1610: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
1620: 28 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c  (pLeft->token.z,
1630: 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 29   pLeft->token.n)
1640: 3b 0a 20 20 20 20 20 20 7a 52 69 67 68 74 20 3d  ;.      zRight =
1650: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
1660: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  Right->token.z, 
1670: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 29  pRight->token.n)
1680: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 65 66  ;.      if( zLef
1690: 74 3d 3d 30 20 7c 7c 20 7a 52 69 67 68 74 3d 3d  t==0 || zRight==
16a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
16b0: 69 74 65 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a  iteFree(zLeft);.
16c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
16d0: 65 65 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  ee(zRight);.    
16e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
16f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1700: 74 65 44 65 71 75 6f 74 65 28 7a 4c 65 66 74 29  teDequote(zLeft)
1710: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  ;.      sqliteDe
1720: 71 75 6f 74 65 28 7a 52 69 67 68 74 29 3b 0a 20  quote(zRight);. 
1730: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
1740: 6c 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 66  le = -1;.      f
1750: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
1760: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
1770: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
1780: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
1790: 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  ;.        Table 
17a0: 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74  *pTab = pTabList
17b0: 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[i].pTab;.   
17c0: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
17d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
17e0: 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73       if( pTabLis
17f0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 20 29  t->a[i].zAlias )
1800: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 61 62  {.          zTab
1810: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69   = pTabList->a[i
1820: 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ].zAlias;.      
1830: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1840: 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e     zTab = pTab->
1850: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
1860: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1870: 69 74 65 53 74 72 49 43 6d 70 28 7a 54 61 62 2c  iteStrICmp(zTab,
1880: 20 7a 4c 65 66 74 29 21 3d 30 20 29 20 63 6f 6e   zLeft)!=0 ) con
1890: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
18a0: 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29  f( 0==(cntTab++)
18b0: 20 29 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   ) pExpr->iTable
18c0: 20 3d 20 69 20 2b 20 70 50 61 72 73 65 2d 3e 6e   = i + pParse->n
18d0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Tab;.        for
18e0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
18f0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1900: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
1910: 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c  rICmp(pTab->aCol
1920: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 52 69 67 68  [j].zName, zRigh
1930: 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
1940: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
1950: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1960: 54 61 62 6c 65 20 3d 20 69 20 2b 20 70 50 61 72  Table = i + pPar
1970: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 20 20  se->nTab;.      
1980: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
1990: 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
19a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
19b0: 73 74 69 74 75 74 65 20 74 68 65 20 72 65 63 6f  stitute the reco
19c0: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
19d0: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
19e0: 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20  Y KEY */.       
19f0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
1a00: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
1a10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1a30: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  pr->iColumn = j;
1a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1a50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a60: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a70: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26     if( cnt==0 &&
1a80: 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73 71   cntTab==1 && sq
1a90: 6c 69 74 65 49 73 52 6f 77 69 64 28 7a 52 69 67  liteIsRowid(zRig
1aa0: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ht) ){.        c
1ab0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
1ac0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
1ad0: 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1ae0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c     sqliteFree(zL
1af0: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
1b00: 74 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b 0a  teFree(zRight);.
1b10: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30        if( cnt==0
1b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b30: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
1b40: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
1b50: 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20  no such column: 
1b60: 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20 20 20  ", -1,  .       
1b70: 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e     pLeft->token.
1b80: 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e  z, pLeft->token.
1b90: 6e 2c 20 22 2e 22 2c 20 31 2c 20 0a 20 20 20 20  n, ".", 1, .    
1ba0: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f        pRight->to
1bb0: 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e 74  ken.z, pRight->t
1bc0: 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20  oken.n, 0);.    
1bd0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
1be0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ++;.        retu
1bf0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 1;.      }els
1c00: 65 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a 20  e if( cnt>1 ){. 
1c10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
1c20: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
1c30: 3e 7a 45 72 72 4d 73 67 2c 20 22 61 6d 62 69 67  >zErrMsg, "ambig
1c40: 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uous column name
1c50: 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20  : ", -1,  .     
1c60: 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65       pLeft->toke
1c70: 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65  n.z, pLeft->toke
1c80: 6e 2e 6e 2c 20 22 2e 22 2c 20 31 2c 0a 20 20 20  n.n, ".", 1,.   
1c90: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74         pRight->t
1ca0: 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e  oken.z, pRight->
1cb0: 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  token.n, 0);.   
1cc0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
1cd0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
1ce0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
1cf0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
1d00: 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20  elete(pLeft);.  
1d10: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1d20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
1d30: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 52 69  teExprDelete(pRi
1d40: 67 68 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ght);.      pExp
1d50: 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20  r->pRight = 0;. 
1d60: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
1d70: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
1d80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d90: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
1da0: 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 20  {.      Vdbe *v 
1db0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
1dc0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
1dd0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
1de0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   1;.      if( sq
1df0: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
1e00: 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ds(pParse, pTabL
1e10: 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  ist, pExpr->pLef
1e20: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  t) ){.        re
1e30: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
1e40: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1e50: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1e60: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
1e70: 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
1e80: 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
1e90: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
1ea0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
1eb0: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
1ec0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
1ed0: 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 0a  nto a temporary.
1ee0: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
1ef0: 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
1f00: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
1f10: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 61 73 20  orary table has 
1f20: 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 20 20  already.        
1f30: 2a 2a 20 62 65 65 6e 20 70 75 74 20 69 6e 20 69  ** been put in i
1f40: 54 61 62 6c 65 20 62 79 20 73 71 6c 69 74 65 45  Table by sqliteE
1f50: 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65  xprResolveInSele
1f60: 63 74 28 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ct()..        */
1f70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
1f80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
1f90: 70 65 6e 54 65 6d 70 2c 20 70 45 78 70 72 2d 3e  penTemp, pExpr->
1fa0: 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20  iTable, 1);.    
1fb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 65      if( sqliteSe
1fc0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
1fd0: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  pr->pSelect, SRT
1fe0: 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
1ff0: 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 7d 65  ble) );.      }e
2000: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
2010: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
2020: 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65  /* Case 2:     e
2030: 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
2040: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
2050: 20 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61       ** Create a
2060: 20 73 65 74 20 74 6f 20 70 75 74 20 74 68 65 20   set to put the 
2070: 65 78 70 72 6c 69 73 74 20 76 61 6c 75 65 73 20  exprlist values 
2080: 69 6e 2e 20 20 54 68 65 20 53 65 74 20 69 64 20  in.  The Set id 
2090: 69 73 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20  is stored.      
20a0: 20 20 2a 2a 20 69 6e 20 69 54 61 62 6c 65 2e 0a    ** in iTable..
20b0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
20c0: 20 20 20 69 6e 74 20 69 2c 20 69 53 65 74 3b 0a     int i, iSet;.
20d0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
20e0: 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   i<pExpr->pList-
20f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
2100: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
2110: 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  2 = pExpr->pList
2120: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
2130: 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73 43          if( !isC
2140: 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
2150: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2160: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
2170: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 0a 20 20  rse->zErrMsg,.  
2180: 20 20 20 20 20 20 20 20 20 20 20 20 22 72 69 67              "rig
2190: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
21a0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  IN operator must
21b0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 22 2c 20 30   be constant", 0
21c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
21d0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
21e0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
21f0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 1;.          }
2200: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2210: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
2220: 50 61 72 73 65 2c 20 70 45 32 2c 20 30 2c 20 30  Parse, pE2, 0, 0
2230: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2240: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2260: 0a 20 20 20 20 20 20 20 20 69 53 65 74 20 3d 20  .        iSet = 
2270: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
2280: 70 50 61 72 73 65 2d 3e 6e 53 65 74 2b 2b 3b 0a  pParse->nSet++;.
2290: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
22a0: 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   i<pExpr->pList-
22b0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
22c0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
22d0: 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  2 = pExpr->pList
22e0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
22f0: 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
2300: 70 45 32 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  pE2->op ){.     
2310: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 46         case TK_F
2320: 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20 20 20 20  LOAT:.          
2330: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
2340: 52 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  R:.            c
2350: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
2360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2370: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
2380: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2390: 53 65 74 49 6e 73 65 72 74 2c 20 69 53 65 74 2c  SetInsert, iSet,
23a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
23b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
23c0: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
23d0: 45 32 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 32  E2->token.z, pE2
23e0: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
23f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2400: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
2410: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20   addr);.        
2420: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2430: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2440: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
2450: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2460: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
2470: 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20 20 20  Parse, pE2);.   
2480: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2490: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
24a0: 5f 53 65 74 49 6e 73 65 72 74 2c 20 69 53 65 74  _SetInsert, iSet
24b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
24c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
24d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
24f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
2500: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
2510: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
2520: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68  .      /* This h
2530: 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  as to be a scala
2540: 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72  r SELECT.  Gener
2550: 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
2560: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  the.      ** val
2570: 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63  ue of this selec
2580: 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65  t in a memory ce
2590: 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ll and record th
25a0: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
25b0: 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  * of the memory 
25c0: 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e  cell in iColumn.
25d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
25e0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
25f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
2600: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2610: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
2620: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
2630: 53 52 54 5f 4d 65 6d 2c 20 70 45 78 70 72 2d 3e  SRT_Mem, pExpr->
2640: 69 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20 20 20 20  iColumn) ){.    
2650: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2660: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
2670: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
2680: 20 46 6f 72 20 61 6c 6c 20 65 6c 73 65 2c 20 6a   For all else, j
2690: 75 73 74 20 72 65 63 75 72 73 69 76 65 6c 79 20  ust recursively 
26a0: 77 61 6c 6b 20 74 68 65 20 74 72 65 65 20 2a 2f  walk the tree */
26b0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
26c0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
26d0: 3e 70 4c 65 66 74 0a 20 20 20 20 20 20 26 26 20  >pLeft.      && 
26e0: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
26f0: 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
2700: 62 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c  bList, pExpr->pL
2710: 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eft) ){.        
2720: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2730: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
2740: 72 2d 3e 70 52 69 67 68 74 20 0a 20 20 20 20 20  r->pRight .     
2750: 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 52 65   && sqliteExprRe
2760: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
2770: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 78 70 72   pTabList, pExpr
2780: 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  ->pRight) ){.   
2790: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
27a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
27b0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
27c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
27d0: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
27e0: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
27f0: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  >pList;.        
2800: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
2810: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
2820: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2830: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
2840: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
2850: 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  st, pList->a[i].
2860: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
2870: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2880: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2890: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28a0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
28b0: 20 30 3b 0a 7d 0a 0a 23 69 66 20 30 20 2f 2a 20   0;.}..#if 0 /* 
28c0: 4e 4f 54 20 55 53 45 44 20 2a 2f 0a 2f 2a 0a 2a  NOT USED */./*.*
28d0: 2a 20 43 6f 6d 70 61 72 65 20 61 20 74 6f 6b 65  * Compare a toke
28e0: 6e 20 61 67 61 69 6e 73 74 20 61 20 73 74 72 69  n against a stri
28f0: 6e 67 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ng.  Return TRUE
2900: 20 69 66 20 74 68 65 79 20 6d 61 74 63 68 2e 0a   if they match..
2910: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
2920: 6c 69 74 65 54 6f 6b 65 6e 43 6d 70 28 54 6f 6b  liteTokenCmp(Tok
2930: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 63 6f 6e 73  en *pToken, cons
2940: 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20  t char *zStr){. 
2950: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
2960: 7a 53 74 72 29 3b 0a 20 20 69 66 28 20 6e 21 3d  zStr);.  if( n!=
2970: 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 72 65 74 75  pToken->n ) retu
2980: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73  rn 0;.  return s
2990: 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70 54  qliteStrNICmp(pT
29a0: 6f 6b 65 6e 2d 3e 7a 2c 20 7a 53 74 72 2c 20 6e  oken->z, zStr, n
29b0: 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  )==0;.}.#endif..
29c0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
29d0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e  function name in
29e0: 74 6f 20 69 74 73 20 69 6e 74 65 67 65 72 20 69  to its integer i
29f0: 64 65 6e 74 69 66 69 65 72 2e 20 20 52 65 74 75  dentifier.  Retu
2a00: 72 6e 20 74 68 65 0a 2a 2a 20 69 64 65 6e 74 69  rn the.** identi
2a10: 66 69 65 72 2e 20 20 52 65 74 75 72 6e 20 46 4e  fier.  Return FN
2a20: 5f 55 6e 6b 6e 6f 77 6e 20 69 66 20 74 68 65 20  _Unknown if the 
2a30: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 73  function name is
2a40: 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2f 0a 69 6e 74   unknown..*/.int
2a50: 20 73 71 6c 69 74 65 46 75 6e 63 49 64 28 54 6f   sqliteFuncId(To
2a60: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
2a70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2a80: 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
2a90: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74  *zName;.     int
2aa0: 20 6c 65 6e 3b 0a 20 20 20 20 20 69 6e 74 20 69   len;.     int i
2ab0: 64 3b 0a 20 20 7d 20 61 46 75 6e 63 5b 5d 20 3d  d;.  } aFunc[] =
2ac0: 20 7b 0a 20 20 20 20 20 7b 20 22 63 6f 75 6e 74   {.     { "count
2ad0: 22 2c 20 20 35 2c 20 46 4e 5f 43 6f 75 6e 74 20  ",  5, FN_Count 
2ae0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 69 6e 22   },.     { "min"
2af0: 2c 20 20 20 20 33 2c 20 46 4e 5f 4d 69 6e 20 20  ,    3, FN_Min  
2b00: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 61 78    },.     { "max
2b10: 22 2c 20 20 20 20 33 2c 20 46 4e 5f 4d 61 78 20  ",    3, FN_Max 
2b20: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 75     },.     { "su
2b30: 6d 22 2c 20 20 20 20 33 2c 20 46 4e 5f 53 75 6d  m",    3, FN_Sum
2b40: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61      },.     { "a
2b50: 76 67 22 2c 20 20 20 20 33 2c 20 46 4e 5f 41 76  vg",    3, FN_Av
2b60: 67 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  g    },.     { "
2b70: 6c 65 6e 67 74 68 22 2c 20 36 2c 20 46 4e 5f 4c  length", 6, FN_L
2b80: 65 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20 7b 20  ength },.     { 
2b90: 22 73 75 62 73 74 72 22 2c 20 36 2c 20 46 4e 5f  "substr", 6, FN_
2ba0: 53 75 62 73 74 72 20 7d 2c 0a 20 20 20 20 20 7b  Substr },.     {
2bb0: 20 22 61 62 73 22 2c 20 20 20 20 33 2c 20 46 4e   "abs",    3, FN
2bc0: 5f 41 62 73 20 20 20 20 7d 2c 0a 20 20 20 20 20  _Abs    },.     
2bd0: 7b 20 22 72 6f 75 6e 64 22 2c 20 20 35 2c 20 46  { "round",  5, F
2be0: 4e 5f 52 6f 75 6e 64 20 20 7d 2c 0a 20 20 7d 3b  N_Round  },.  };
2bf0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
2c00: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
2c10: 28 61 46 75 6e 63 29 3b 20 69 2b 2b 29 7b 0a 20  (aFunc); i++){. 
2c20: 20 20 20 69 66 28 20 61 46 75 6e 63 5b 69 5d 2e     if( aFunc[i].
2c30: 6c 65 6e 3d 3d 70 54 6f 6b 65 6e 2d 3e 6e 20 0a  len==pToken->n .
2c40: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 53 74       && sqliteSt
2c50: 72 4e 49 43 6d 70 28 70 54 6f 6b 65 6e 2d 3e 7a  rNICmp(pToken->z
2c60: 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a 4e 61 6d 65  , aFunc[i].zName
2c70: 2c 20 61 46 75 6e 63 5b 69 5d 2e 6c 65 6e 29 3d  , aFunc[i].len)=
2c80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74  =0 ){.       ret
2c90: 75 72 6e 20 61 46 75 6e 63 5b 69 5d 2e 69 64 3b  urn aFunc[i].id;
2ca0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2cb0: 75 72 6e 20 46 4e 5f 55 6e 6b 6e 6f 77 6e 3b 0a  urn FN_Unknown;.
2cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 63  }../*.** Error c
2cd0: 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f  heck the functio
2ce0: 6e 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73  ns in an express
2cf0: 69 6f 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ion.  Make sure 
2d00: 61 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  all.** function 
2d10: 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e  names are recogn
2d20: 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e  ized and all fun
2d30: 63 74 69 6f 6e 73 20 68 61 76 65 20 74 68 65 20  ctions have the 
2d40: 63 6f 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62 65  correct.** numbe
2d50: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
2d60: 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
2d70: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2d80: 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69 66  e->zErrMsg.** if
2d90: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
2da0: 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ss.  Return the 
2db0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
2dc0: 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41 67  ..**.** if pIsAg
2dd0: 67 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61 6e  g is not null an
2de0: 64 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  d this expressio
2df0: 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  n is an aggregat
2e00: 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28 6c  e function.** (l
2e10: 69 6b 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72 20  ike count(*) or 
2e20: 6d 61 78 28 76 61 6c 75 65 29 29 20 74 68 65 6e  max(value)) then
2e30: 20 77 72 69 74 65 20 61 20 31 20 69 6e 74 6f 20   write a 1 into 
2e40: 2a 70 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20  *pIsAgg..*/.int 
2e50: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
2e60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
2e70: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
2e80: 61 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20 2a 70  allowAgg, int *p
2e90: 49 73 41 67 67 29 7b 0a 20 20 69 6e 74 20 6e 45  IsAgg){.  int nE
2ea0: 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45  rr = 0;.  if( pE
2eb0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
2ec0: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
2ed0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
2ee0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
2ef0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 20 3d  {.      int id =
2f00: 20 73 71 6c 69 74 65 46 75 6e 63 49 64 28 26 70   sqliteFuncId(&p
2f10: 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  Expr->token);.  
2f20: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70      int n = pExp
2f30: 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  r->pList ? pExpr
2f40: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ->pList->nExpr :
2f50: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f   0;.      int no
2f60: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b 0a  _such_func = 0;.
2f70: 20 20 20 20 20 20 69 6e 74 20 74 6f 6f 5f 6d 61        int too_ma
2f80: 6e 79 5f 61 72 67 73 20 3d 20 30 3b 0a 20 20 20  ny_args = 0;.   
2f90: 20 20 20 69 6e 74 20 74 6f 6f 5f 66 65 77 5f 61     int too_few_a
2fa0: 72 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rgs = 0;.      i
2fb0: 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20  nt is_agg = 0;. 
2fc0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2fd0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
2fe0: 20 3d 20 69 64 3b 0a 20 20 20 20 20 20 73 77 69   = id;.      swi
2ff0: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 20  tch( id ){.     
3000: 20 20 20 63 61 73 65 20 46 4e 5f 55 6e 6b 6e 6f     case FN_Unkno
3010: 77 6e 3a 20 7b 20 0a 20 20 20 20 20 20 20 20 20  wn: { .         
3020: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
3030: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
3040: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
3050: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 43 6f        case FN_Co
3060: 75 6e 74 3a 20 7b 20 0a 20 20 20 20 20 20 20 20  unt: { .        
3070: 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d    no_such_func =
3080: 20 21 61 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20   !allowAgg;.    
3090: 20 20 20 20 20 20 74 6f 6f 5f 6d 61 6e 79 5f 61        too_many_a
30a0: 72 67 73 20 3d 20 6e 3e 31 3b 0a 20 20 20 20 20  rgs = n>1;.     
30b0: 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 31 3b       is_agg = 1;
30c0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
30d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30e0: 20 20 20 20 63 61 73 65 20 46 4e 5f 4d 61 78 3a      case FN_Max:
30f0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e  .        case FN
3100: 5f 4d 69 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  _Min: {.        
3110: 20 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73 20 3d    too_few_args =
3120: 20 61 6c 6c 6f 77 41 67 67 20 3f 20 6e 3c 31 20   allowAgg ? n<1 
3130: 3a 20 6e 3c 32 3b 0a 20 20 20 20 20 20 20 20 20  : n<2;.         
3140: 20 69 73 5f 61 67 67 20 3d 20 6e 3d 3d 31 3b 0a   is_agg = n==1;.
3150: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
3160: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3170: 20 20 20 63 61 73 65 20 46 4e 5f 41 76 67 3a 0a     case FN_Avg:.
3180: 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f          case FN_
3190: 53 75 6d 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  Sum: {.         
31a0: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
31b0: 21 61 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 20  !allowAgg;.     
31c0: 20 20 20 20 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72       too_many_ar
31d0: 67 73 20 3d 20 6e 3e 31 3b 0a 20 20 20 20 20 20  gs = n>1;.      
31e0: 20 20 20 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73      too_few_args
31f0: 20 3d 20 6e 3c 31 3b 0a 20 20 20 20 20 20 20 20   = n<1;.        
3200: 20 20 69 73 5f 61 67 67 20 3d 20 31 3b 0a 20 20    is_agg = 1;.  
3210: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3230: 20 63 61 73 65 20 46 4e 5f 41 62 73 3a 0a 20 20   case FN_Abs:.  
3240: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4c 65        case FN_Le
3250: 6e 67 74 68 3a 20 7b 0a 20 20 20 20 20 20 20 20  ngth: {.        
3260: 20 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73 20 3d    too_few_args =
3270: 20 6e 3c 31 3b 0a 20 20 20 20 20 20 20 20 20 20   n<1;.          
3280: 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73 20 3d 20  too_many_args = 
3290: 6e 3e 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  n>1;.          b
32a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
32b0: 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f          case FN_
32c0: 52 6f 75 6e 64 3a 20 7b 0a 20 20 20 20 20 20 20  Round: {.       
32d0: 20 20 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73 20     too_few_args 
32e0: 3d 20 6e 3c 31 3b 0a 20 20 20 20 20 20 20 20 20  = n<1;.         
32f0: 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73 20 3d   too_many_args =
3300: 20 6e 3e 32 3b 0a 20 20 20 20 20 20 20 20 20 20   n>2;.          
3310: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
3320: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e  .        case FN
3330: 5f 53 75 62 73 74 72 3a 20 7b 0a 20 20 20 20 20  _Substr: {.     
3340: 20 20 20 20 20 74 6f 6f 5f 66 65 77 5f 61 72 67       too_few_arg
3350: 73 20 3d 20 6e 3c 33 3b 0a 20 20 20 20 20 20 20  s = n<3;.       
3360: 20 20 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73     too_many_args
3370: 20 3d 20 6e 3e 33 3b 0a 20 20 20 20 20 20 20 20   = n>3;.        
3380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
3390: 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75   }.        defau
33a0: 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  lt: break;.     
33b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 5f   }.      if( no_
33c0: 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20  such_func ){.   
33d0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
33e0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
33f0: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
3400: 20 66 75 6e 63 74 69 6f 6e 3a 20 22 2c 20 2d 31   function: ", -1
3410: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 45 78  ,.           pEx
3420: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
3430: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b  pr->token.n, 0);
3440: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
3450: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
3460: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d   nErr++;.      }
3470: 65 6c 73 65 20 69 66 28 20 74 6f 6f 5f 6d 61 6e  else if( too_man
3480: 79 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20  y_args ){.      
3490: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
34a0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
34b0: 4d 73 67 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61  Msg, "too many a
34c0: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
34d0: 74 69 6f 6e 20 22 2c 2d 31 2c 0a 20 20 20 20 20  tion ",-1,.     
34e0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
34f0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
3500: 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c 20 30  en.n, "()", 2, 0
3510: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
3520: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3530: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
3540: 20 7d 65 6c 73 65 20 69 66 28 20 74 6f 6f 5f 66   }else if( too_f
3550: 65 77 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20  ew_args ){.     
3560: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
3570: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
3580: 72 4d 73 67 2c 20 22 74 6f 6f 20 66 65 77 20 61  rMsg, "too few a
3590: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
35a0: 74 69 6f 6e 20 22 2c 2d 31 2c 0a 20 20 20 20 20  tion ",-1,.     
35b0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
35c0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
35d0: 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c 20 30  en.n, "()", 2, 0
35e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
35f0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3600: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
3610: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
3620: 61 67 67 20 29 20 70 45 78 70 72 2d 3e 6f 70 20  agg ) pExpr->op 
3630: 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  = TK_AGG_FUNCTIO
3640: 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f  N;.      if( is_
3650: 61 67 67 20 26 26 20 70 49 73 41 67 67 20 29 20  agg && pIsAgg ) 
3660: 2a 70 49 73 41 67 67 20 3d 20 31 3b 0a 20 20 20  *pIsAgg = 1;.   
3670: 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72     for(i=0; nErr
3680: 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29  ==0 && i<n; i++)
3690: 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d  {.        nErr =
36a0: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
36b0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
36c0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
36d0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 20 20 61 6c 6c 6f 77 41 67 67 20 26 26 20 21 69    allowAgg && !i
3700: 73 5f 61 67 67 2c 20 70 49 73 41 67 67 29 3b 0a  s_agg, pIsAgg);.
3710: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3720: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
3730: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
3740: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  eft ){.        n
3750: 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  Err = sqliteExpr
3760: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
3770: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 6c 6c 6f  xpr->pLeft, allo
3780: 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20  wAgg, pIsAgg);. 
3790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
37a0: 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70   nErr==0 && pExp
37b0: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
37c0: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
37d0: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
37e0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
37f0: 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73  t, allowAgg, pIs
3800: 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Agg);.      }.  
3810: 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20      if( nErr==0 
3820: 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20  && pExpr->pList 
3830: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
3840: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
3850: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
3860: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
3870: 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20  or(i=0; nErr==0 
3880: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
3890: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
38a0: 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  2 = pExpr->pList
38b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
38c0: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
38d0: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
38e0: 50 61 72 73 65 2c 20 70 45 32 2c 20 61 6c 6c 6f  Parse, pE2, allo
38f0: 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20  wAgg, pIsAgg);. 
3900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3910: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3920: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3930: 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nErr;.}../*.** 
3940: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
3950: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
3960: 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
3970: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
3980: 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76  ression and leav
3990: 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20  e the result on 
39a0: 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b  the top of stack
39b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
39c0: 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
39d0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
39e0: 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  xpr){.  Vdbe *v 
39f0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
3a00: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28  .  int op;.  if(
3a10: 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
3a20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77  0 ) return;.  sw
3a30: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
3a40: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  ){.    case TK_P
3a50: 4c 55 53 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50  LUS:     op = OP
3a60: 5f 41 64 64 3b 20 20 20 20 20 20 62 72 65 61 6b  _Add;      break
3a70: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  ;.    case TK_MI
3a80: 4e 55 53 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  NUS:    op = OP_
3a90: 53 75 62 74 72 61 63 74 3b 20 62 72 65 61 6b 3b  Subtract; break;
3aa0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
3ab0: 52 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4d  R:     op = OP_M
3ac0: 75 6c 74 69 70 6c 79 3b 20 62 72 65 61 6b 3b 0a  ultiply; break;.
3ad0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
3ae0: 48 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44 69  H:    op = OP_Di
3af0: 76 69 64 65 3b 20 20 20 62 72 65 61 6b 3b 0a 20  vide;   break;. 
3b00: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
3b10: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 6e 64       op = OP_And
3b20: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
3b30: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
3b40: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 72 3b 20      op = OP_Or; 
3b50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b60: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
3b70: 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20     op = OP_Lt;  
3b80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3b90: 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20  case TK_LE:     
3ba0: 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20    op = OP_Le;   
3bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
3bc0: 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
3bd0: 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20   op = OP_Gt;    
3be0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
3bf0: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20  se TK_GE:       
3c00: 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20  op = OP_Ge;     
3c10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
3c20: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f  e TK_NE:       o
3c30: 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20  p = OP_Ne;      
3c40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3c50: 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70   TK_EQ:       op
3c60: 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20   = OP_Eq;       
3c70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3c80: 54 4b 5f 4c 49 4b 45 3a 20 20 20 20 20 6f 70 20  TK_LIKE:     op 
3c90: 3d 20 4f 50 5f 4c 69 6b 65 3b 20 20 20 20 20 62  = OP_Like;     b
3ca0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
3cb0: 4b 5f 47 4c 4f 42 3a 20 20 20 20 20 6f 70 20 3d  K_GLOB:     op =
3cc0: 20 4f 50 5f 47 6c 6f 62 3b 20 20 20 20 20 62 72   OP_Glob;     br
3cd0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
3ce0: 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20  _ISNULL:   op = 
3cf0: 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65  OP_IsNull;   bre
3d00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
3d10: 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f  NOTNULL:  op = O
3d20: 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61  P_NotNull;  brea
3d30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
3d40: 4f 54 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  OT:      op = OP
3d50: 5f 4e 6f 74 3b 20 20 20 20 20 20 62 72 65 61 6b  _Not;      break
3d60: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  ;.    case TK_UM
3d70: 49 4e 55 53 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  INUS:   op = OP_
3d80: 4e 65 67 61 74 69 76 65 3b 20 62 72 65 61 6b 3b  Negative; break;
3d90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
3da0: 41 4e 44 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42  AND:   op = OP_B
3db0: 69 74 41 6e 64 3b 20 20 20 62 72 65 61 6b 3b 0a  itAnd;   break;.
3dc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
3dd0: 52 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69  R:    op = OP_Bi
3de0: 74 4f 72 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  tOr;    break;. 
3df0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
3e00: 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69 74  T:   op = OP_Bit
3e10: 4e 6f 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  Not;   break;.  
3e20: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
3e30: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68 69 66  :   op = OP_Shif
3e40: 74 4c 65 66 74 3b 20 20 62 72 65 61 6b 3b 0a 20  tLeft;  break;. 
3e50: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
3e60: 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68 69  T:   op = OP_Shi
3e70: 66 74 52 69 67 68 74 3b 20 62 72 65 61 6b 3b 0a  ftRight; break;.
3e80: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
3e90: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52 65        op = OP_Re
3ea0: 6d 61 69 6e 64 65 72 3b 20 20 62 72 65 61 6b 3b  mainder;  break;
3eb0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
3ec0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  eak;.  }.  switc
3ed0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
3ee0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
3ef0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
3f00: 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 29  pParse->useAgg )
3f10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3f20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3f30: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
3f40: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d  ->iAgg);.      }
3f50: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
3f60: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
3f70: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
3f80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
3f90: 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  mn, pExpr->iTabl
3fa0: 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
3fb0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
3fc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
3fd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
3fe0: 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69 54 61  ecno, pExpr->iTa
3ff0: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ble, 0);.      }
4000: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4010: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
4020: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
4030: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4040: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
4050: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4060: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
4070: 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  , -1, pExpr->tok
4080: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
4090: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  en.n);.      bre
40a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
40b0: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
40c0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
40d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
40e0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
40f0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4100: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
4110: 20 61 64 64 72 2c 20 70 45 78 70 72 2d 3e 74 6f   addr, pExpr->to
4120: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
4130: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72  ken.n);.      br
4140: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4150: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
4160: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20  .      int addr 
4170: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
4180: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
4190: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
41a0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
41b0: 76 2c 20 61 64 64 72 2c 20 70 45 78 70 72 2d 3e  v, addr, pExpr->
41c0: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
41d0: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
41e0: 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74  sqliteVdbeDequot
41f0: 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  eP3(v, addr);.  
4200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4210: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
4220: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
4230: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4240: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
4250: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4260: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
4270: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
4280: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
4290: 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
42a0: 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
42b0: 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
42c0: 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
42d0: 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
42e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
42f0: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
4300: 4c 41 53 48 3a 20 7b 0a 20 20 20 20 20 20 73 71  LASH: {.      sq
4310: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
4320: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
4330: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
4340: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
4350: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
4360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4370: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
4380: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
4390: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
43a0: 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
43b0: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
43c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
43d0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
43e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
43f0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
4400: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
4410: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
4420: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4430: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
4440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4450: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
4460: 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  NCAT: {.      sq
4470: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
4480: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
4490: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
44a0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
44b0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
44c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
44d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e  eAddOp(v, OP_Con
44e0: 63 61 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  cat, 2, 0);.    
44f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4500: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
4510: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
4520: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
4530: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
4540: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
4550: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 0a     case TK_EQ: .
4560: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45      case TK_LIKE
4570: 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  : .    case TK_G
4580: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
4590: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 73 71 6c   dest;.      sql
45a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
45b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30  OP_Integer, 1, 0
45c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
45d0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
45e0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
45f0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
4600: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
4610: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
4620: 20 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65 56    dest = sqliteV
4630: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4640: 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 2;.      sql
4650: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4660: 6f 70 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  op, 0, dest);.  
4670: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4680: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
4690: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , -1, 0);.      
46a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
46b0: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
46c0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
46d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
46e0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
46f0: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
4700: 46 4c 4f 41 54 20 7c 7c 20 70 45 78 70 72 2d 3e  FLOAT || pExpr->
4710: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
4720: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
4730: 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 45 78   Token *p = &pEx
4740: 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pr->pLeft->token
4750: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
4760: 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  z = sqliteMalloc
4770: 28 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20  ( p->n + 2 );.  
4780: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 2c        sprintf(z,
4790: 20 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20   "-%.*s", p->n, 
47a0: 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 73  p->z);.        s
47b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
47c0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
47d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
47e0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
47f0: 2c 20 2d 31 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29  , -1, z, p->n+1)
4800: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4810: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  Free(z);.       
4820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4830: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
4840: 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f  rough into TK_NO
4850: 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  T */.    }.    c
4860: 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
4870: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
4880: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
4890: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
48a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
48b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
48c0: 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29  dOp(v, op, 0, 0)
48d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
48e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
48f0: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
4900: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
4910: 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a        int dest;.
4920: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4930: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
4940: 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ger, 1, 0);.    
4950: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
4960: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
4970: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65  pLeft);.      de
4980: 73 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  st = sqliteVdbeC
4990: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
49a0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  2;.      sqliteV
49b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
49c0: 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
49d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
49e0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
49f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4a00: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4a10: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
4a20: 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  N: {.      sqlit
4a30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4a40: 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70  _AggGet, 0, pExp
4a50: 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20  r->iAgg);.      
4a60: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
4a70: 6d 6e 3d 3d 46 4e 5f 41 76 67 20 29 7b 0a 20 20  mn==FN_Avg ){.  
4a80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
4a90: 61 72 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74 3e  arse->iAggCount>
4aa0: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 69 41  =0 && pParse->iA
4ab0: 67 67 43 6f 75 6e 74 3c 70 50 61 72 73 65 2d 3e  ggCount<pParse->
4ac0: 6e 41 67 67 20 29 3b 0a 20 20 20 20 20 20 20 20  nAgg );.        
4ad0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4ae0: 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c  v, OP_AggGet, 0,
4af0: 20 70 50 61 72 73 65 2d 3e 69 41 67 67 43 6f 75   pParse->iAggCou
4b00: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
4b10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4b20: 4f 50 5f 44 69 76 69 64 65 2c 20 30 2c 20 30 29  OP_Divide, 0, 0)
4b30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4b40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4b50: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
4b60: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  N: {.      int i
4b70: 64 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  d = pExpr->iColu
4b80: 6d 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70  mn;.      int op
4b90: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
4ba0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
4bb0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
4bc0: 69 73 74 3b 0a 20 20 20 20 20 20 73 77 69 74 63  ist;.      switc
4bd0: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 20 20 20  h( id ){.       
4be0: 20 63 61 73 65 20 46 4e 5f 4d 69 6e 3a 20 0a 20   case FN_Min: . 
4bf0: 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4d         case FN_M
4c00: 61 78 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ax: {.          
4c10: 6f 70 20 3d 20 69 64 3d 3d 46 4e 5f 4d 69 6e 20  op = id==FN_Min 
4c20: 3f 20 4f 50 5f 4d 69 6e 20 3a 20 4f 50 5f 4d 61  ? OP_Min : OP_Ma
4c30: 78 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  x;.          for
4c40: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
4c50: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
4c60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
4c70: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
4c80: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
4c90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
4ca0: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
4cb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4cc0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
4cd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
4ce0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
4cf0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4d00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4d10: 20 20 20 63 61 73 65 20 46 4e 5f 41 62 73 3a 20     case FN_Abs: 
4d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
4d30: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
4d40: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  e, pList->a[0].p
4d50: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
4d60: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4d70: 28 76 2c 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c  (v, OP_AbsValue,
4d80: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
4d90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4da0: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
4db0: 46 4e 5f 52 6f 75 6e 64 3a 20 7b 0a 20 20 20 20  FN_Round: {.    
4dc0: 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
4dd0: 3e 6e 45 78 70 72 3d 3d 32 20 29 7b 0a 20 20 20  >nExpr==2 ){.   
4de0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45           sqliteE
4df0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
4e00: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
4e10: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  r);.          }e
4e20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
4e30: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4e40: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
4e50: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
4e60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
4e70: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
4e80: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  se, pList->a[0].
4e90: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
4ea0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4eb0: 70 28 76 2c 20 4f 50 5f 50 72 65 63 69 73 69 6f  p(v, OP_Precisio
4ec0: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
4ed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4ee0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
4ef0: 65 20 46 4e 5f 4c 65 6e 67 74 68 3a 20 7b 0a 20  e FN_Length: {. 
4f00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45           sqliteE
4f10: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
4f20: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
4f30: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
4f40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4f50: 20 4f 50 5f 53 74 72 6c 65 6e 2c 20 30 2c 20 30   OP_Strlen, 0, 0
4f60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
4f70: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
4f80: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 53 75        case FN_Su
4f90: 62 73 74 72 3a 20 7b 0a 20 20 20 20 20 20 20 20  bstr: {.        
4fa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
4fb0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
4fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
4fd0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
4fe0: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
4ff0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
5000: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
5010: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5020: 20 4f 50 5f 53 75 62 73 74 72 2c 20 30 2c 20 30   OP_Substr, 0, 0
5030: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
5040: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5050: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
5060: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
5070: 6e 27 74 20 68 61 70 70 65 6e 21 20 2a 2f 0a 20  n't happen! */. 
5080: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5090: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
50a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
50b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
50c0: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
50d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
50e0: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
50f0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
5100: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
5110: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
5120: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
5130: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73  nt addr;.      s
5140: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5150: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
5160: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5170: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
5180: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
5190: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
51a0: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
51b0: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 66  ddr(v);.      if
51c0: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
51d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
51e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
51f0: 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
5200: 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 32 29 3b  iTable, addr+2);
5210: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5220: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5230: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 46  AddOp(v, OP_SetF
5240: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
5250: 62 6c 65 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  ble, addr+2);.  
5260: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
5270: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5280: 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29  P_AddImm, -1, 0)
5290: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
52a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
52b0: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
52c0: 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69    int lbl = sqli
52d0: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
52e0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
52f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5300: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
5310: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5320: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
5330: 70 45 78 70 72 2c 20 6c 62 6c 29 3b 0a 20 20 20  pExpr, lbl);.   
5340: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5350: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
5360: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
5370: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
5380: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20  abel(v, lbl);.  
5390: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
53a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
53b0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
53c0: 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
53d0: 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
53e0: 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
53f0: 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
5400: 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
5410: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5420: 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
5430: 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
5440: 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
5450: 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
5460: 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f  ion is false..*/
5470: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
5480: 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
5490: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
54a0: 72 2c 20 69 6e 74 20 64 65 73 74 29 7b 0a 20 20  r, int dest){.  
54b0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
54c0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
54d0: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d  p = 0;.  if( v==
54e0: 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
54f0: 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68  return;.  switch
5500: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
5510: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
5520: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b       op = OP_Lt;
5530: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5540: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
5550: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20      op = OP_Le; 
5560: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5570: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
5580: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20     op = OP_Gt;  
5590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
55a0: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
55b0: 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20    op = OP_Ge;   
55c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
55d0: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
55e0: 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20   op = OP_Ne;    
55f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
5600: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20  se TK_EQ:       
5610: 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20  op = OP_Eq;     
5620: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5630: 65 20 54 4b 5f 4c 49 4b 45 3a 20 20 20 20 20 6f  e TK_LIKE:     o
5640: 70 20 3d 20 4f 50 5f 4c 69 6b 65 3b 20 20 20 20  p = OP_Like;    
5650: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5660: 20 54 4b 5f 47 4c 4f 42 3a 20 20 20 20 20 6f 70   TK_GLOB:     op
5670: 20 3d 20 4f 50 5f 47 6c 6f 62 3b 20 20 20 20 20   = OP_Glob;     
5680: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5690: 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20  TK_ISNULL:   op 
56a0: 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62  = OP_IsNull;   b
56b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
56c0: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d  K_NOTNULL:  op =
56d0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72   OP_NotNull;  br
56e0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
56f0: 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  :  break;.  }.  
5700: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
5710: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
5720: 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
5730: 74 20 64 32 20 3d 20 73 71 6c 69 74 65 56 64 62  t d2 = sqliteVdb
5740: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
5750: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
5760: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
5770: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 29  Expr->pLeft, d2)
5780: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
5790: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
57a0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
57b0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
57c0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
57d0: 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
57e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
57f0: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
5800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
5810: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
5820: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
5830: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
5840: 65 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  eExprIfTrue(pPar
5850: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
5860: 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
5870: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5880: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
5890: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
58a0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
58b0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
58c0: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
58d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
58e0: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
58f0: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
5900: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
5910: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
5920: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
5930: 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65   TK_EQ:.    case
5940: 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63 61   TK_LIKE:.    ca
5950: 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20 20  se TK_GLOB: {.  
5960: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
5970: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
5980: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
5990: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
59a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
59b0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ight);.      sql
59c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
59d0: 6f 70 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  op, 0, dest);.  
59e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
59f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
5a00: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
5a10: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
5a20: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
5a30: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
5a40: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
5a50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5a60: 20 6f 70 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20   op, 0, dest);. 
5a70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5a80: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
5a90: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
5aa0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
5ab0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
5ac0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
5ad0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
5ae0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5af0: 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  dOp(v, OP_Found,
5b00: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
5b10: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
5b20: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5b30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5b40: 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_SetFound, pExp
5b50: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29  r->iTable, dest)
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 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
5b90: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62  : {.      int lb
5ba0: 6c 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  l = sqliteVdbeMa
5bb0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
5bc0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
5bd0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
5be0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
5bf0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5c00: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
5c10: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5c20: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
5c30: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
5c40: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
5c50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5c60: 20 4f 50 5f 4c 74 2c 20 30 2c 20 6c 62 6c 29 3b   OP_Lt, 0, lbl);
5c70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
5c80: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
5c90: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
5ca0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  .pExpr);.      s
5cb0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5cc0: 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 64 65 73 74  , OP_Le, 0, dest
5cd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5ce0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
5cf0: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
5d00: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
5d10: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
5d20: 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  bl);.      sqlit
5d30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5d40: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
5d50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5d60: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5d70: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
5d80: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
5d90: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
5da0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5db0: 49 66 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  If, 0, dest);.  
5dc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5dd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
5de0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
5df0: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
5e00: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
5e10: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
5e20: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
5e30: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
5e40: 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
5e50: 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
5e60: 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
5e70: 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
5e80: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
5e90: 75 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ue..*/.void sqli
5ea0: 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  teExprIfFalse(Pa
5eb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
5ec0: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
5ed0: 73 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  st){.  Vdbe *v =
5ee0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5ef0: 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
5f00: 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
5f10: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
5f20: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
5f30: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
5f40: 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_LT:       op =
5f50: 20 4f 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72   OP_Ge;       br
5f60: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
5f70: 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _LE:       op = 
5f80: 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Gt;       bre
5f90: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
5fa0: 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  GT:       op = O
5fb0: 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Le;       brea
5fc0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
5fd0: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
5fe0: 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Lt;       break
5ff0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  ;.    case TK_NE
6000: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
6010: 45 71 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Eq;       break;
6020: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
6030: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e         op = OP_N
6040: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
6050: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45      case TK_LIKE
6060: 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 69  :     op = OP_Li
6070: 6b 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ke;     break;. 
6080: 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a     case TK_GLOB:
6090: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 6c 6f       op = OP_Glo
60a0: 62 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  b;     break;.  
60b0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
60c0: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  :   op = OP_NotN
60d0: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
60e0: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
60f0: 3a 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c  :  op = OP_IsNul
6100: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
6110: 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b  default:  break;
6120: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
6130: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
6140: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
6150: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
6160: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
6170: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
6180: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
6190: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
61a0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
61b0: 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
61c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
61d0: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
61e0: 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
61f0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
6200: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
6210: 74 65 45 78 70 72 49 66 54 72 75 65 28 70 50 61  teExprIfTrue(pPa
6220: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
6230: 74 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  t, d2);.      sq
6240: 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28  liteExprIfFalse(
6250: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
6260: 52 69 67 68 74 2c 20 64 65 73 74 29 3b 0a 20 20  Right, dest);.  
6270: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
6280: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
6290: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
62a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
62b0: 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73  K_NOT: {.      s
62c0: 71 6c 69 74 65 45 78 70 72 49 66 54 72 75 65 28  qliteExprIfTrue(
62d0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
62e0: 4c 65 66 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  Left, dest);.   
62f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6300: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
6310: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
6320: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
6330: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
6340: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
6350: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
6360: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
6370: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
6380: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
6390: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
63a0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
63b0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
63c0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
63d0: 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74 29  (v, op, 0, dest)
63e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
63f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
6400: 5f 4c 49 4b 45 3a 0a 20 20 20 20 63 61 73 65 20  _LIKE:.    case 
6410: 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_GLOB: {.     
6420: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
6430: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
6440: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
6450: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
6460: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
6470: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
6480: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
6490: 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   1, dest);.     
64a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
64b0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
64c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
64d0: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
64e0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
64f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
6500: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
6510: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
6520: 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
6530: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6540: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
6550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
6560: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
6570: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
6580: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
6590: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
65a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
65b0: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
65c0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
65d0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
65e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
65f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6600: 50 5f 53 65 74 4e 6f 74 46 6f 75 6e 64 2c 20 70  P_SetNotFound, p
6610: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
6620: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
6630: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6640: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
6650: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  EEN: {.      int
6660: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c   addr;.      sql
6670: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
6680: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
6690: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
66a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
66b0: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
66c0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
66d0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
66e0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
66f0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
6700: 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e  sqliteVdbeCurren
6710: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
6720: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6730: 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 61 64 64  v, OP_Ge, 0, add
6740: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
6750: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6760: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
6770: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6780: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
6790: 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
67a0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
67b0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
67c0: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  ist->a[1].pExpr)
67d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
67e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 74  beAddOp(v, OP_Gt
67f0: 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
6800: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6810: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
6820: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
6830: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
6840: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6850: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
6860: 6f 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ot, 0, 0);.     
6870: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6880: 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 64 65  (v, OP_If, 0, de
6890: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
68a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
68b0: 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63  *.** Do a deep c
68c0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f  omparison of two
68d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
68e0: 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
68f0: 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66  (non-zero).** if
6900: 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
6910: 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46  cal and return F
6920: 41 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66  ALSE if they dif
6930: 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
6940: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70  */.int sqliteExp
6950: 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
6960: 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20  A, Expr *pB){.  
6970: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
6980: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6990: 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20   pB==0;.  }else 
69a0: 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20  if( pB==0 ){.   
69b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
69c0: 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d   if( pA->op!=pB-
69d0: 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >op ) return 0;.
69e0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 45 78 70    if( !sqliteExp
69f0: 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
6a00: 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29  ft, pB->pLeft) )
6a10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
6a20: 20 21 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70   !sqliteExprComp
6a30: 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20  are(pA->pRight, 
6a40: 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65  pB->pRight) ) re
6a50: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
6a60: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69  ->pList ){.    i
6a70: 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20  f( pB->pList==0 
6a80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
6a90: 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e  if( pA->pList->n
6aa0: 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d  Expr!=pB->pList-
6ab0: 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
6ac0: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
6ad0: 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  i<pA->pList->nEx
6ae0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
6af0: 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72 43  if( !sqliteExprC
6b00: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74  ompare(pA->pList
6b10: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42  ->a[i].pExpr, pB
6b20: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
6b30: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
6b40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6b50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
6b60: 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b  if( pB->pList ){
6b70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6b80: 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65   }.  if( pA->pSe
6b90: 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c  lect || pB->pSel
6ba0: 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ect ) return 0;.
6bb0: 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e    if( pA->token.
6bc0: 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  z ){.    if( pB-
6bd0: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65  >token.z==0 ) re
6be0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
6bf0: 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d  pB->token.n!=pA-
6c00: 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72  >token.n ) retur
6c10: 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 0;.    if( sql
6c20: 69 74 65 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e  iteStrNICmp(pA->
6c30: 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b  token.z, pB->tok
6c40: 65 6e 2e 7a 2c 20 70 41 2d 3e 74 6f 6b 65 6e 2e  en.z, pA->token.
6c50: 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  n)!=0 ) return 0
6c60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
6c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
6c80: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
6c90: 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
6ca0: 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 72 65 74  [] array and ret
6cb0: 75 72 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a  urn its index..*
6cc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70  /.static int app
6cd0: 65 6e 64 41 67 67 49 6e 66 6f 28 50 61 72 73 65  endAggInfo(Parse
6ce0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
6cf0: 20 28 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 26   (pParse->nAgg &
6d00: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
6d10: 69 6e 74 20 61 6d 74 20 3d 20 70 50 61 72 73 65  int amt = pParse
6d20: 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20 20  ->nAgg + 8;.    
6d30: 41 67 67 45 78 70 72 20 2a 61 41 67 67 20 3d 20  AggExpr *aAgg = 
6d40: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 50  sqliteRealloc(pP
6d50: 61 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a  arse->aAgg, amt*
6d60: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
6d70: 41 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Agg[0]));.    if
6d80: 28 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20  ( aAgg==0 ){.   
6d90: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
6da0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
6db0: 61 41 67 67 20 3d 20 61 41 67 67 3b 0a 20 20 7d  aAgg = aAgg;.  }
6dc0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73  .  memset(&pPars
6dd0: 65 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d 3e  e->aAgg[pParse->
6de0: 6e 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nAgg], 0, sizeof
6df0: 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d  (pParse->aAgg[0]
6e00: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  ));.  return pPa
6e10: 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a  rse->nAgg++;.}..
6e20: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
6e30: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
6e40: 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
6e50: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
6e60: 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
6e70: 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
6e80: 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
6e90: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
6ea0: 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61  g[] array..** Ma
6eb0: 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e  ke additional en
6ec0: 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61  tries to the pPa
6ed0: 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
6ee0: 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
6ef0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6f00: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
6f10: 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
6f20: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
6f30: 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
6f40: 65 64 20 62 79 20 73 71 6c 69 74 65 45 78 70 72  ed by sqliteExpr
6f50: 52 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64  ResolveIds() and
6f60: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
6f70: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72  ()..**.** If err
6f80: 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65  ors are seen, le
6f90: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
6fa0: 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20  sage in zErrMsg 
6fb0: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  and return.** th
6fc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
6fd0: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
6fe0: 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  eExprAnalyzeAggr
6ff0: 65 67 61 74 65 73 28 50 61 72 73 65 20 2a 70 50  egates(Parse *pP
7000: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
7010: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41  r){.  int i;.  A
7020: 67 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20 20  ggExpr *aAgg;.  
7030: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
7040: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
7050: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
7060: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
7070: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
7080: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67  UMN: {.      aAg
7090: 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  g = pParse->aAgg
70a0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
70b0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
70c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
70d0: 66 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  f( aAgg[i].isAgg
70e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
70f0: 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d       if( aAgg[i]
7100: 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d  .pExpr->iTable==
7110: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20  pExpr->iTable.  
7120: 20 20 20 20 20 20 20 26 26 20 61 41 67 67 5b 69         && aAgg[i
7130: 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
7140: 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
7150: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
7160: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
7170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7180: 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67   i>=pParse->nAgg
7190: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
71a0: 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50  appendAggInfo(pP
71b0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
71c0: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
71d0: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
71e0: 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
71f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
7200: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45  arse->aAgg[i].pE
7210: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
7220: 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72     }.      pExpr
7230: 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20  ->iAgg = i;.    
7240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7250: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
7260: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
7270: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
7280: 75 6d 6e 3d 3d 46 4e 5f 43 6f 75 6e 74 20 7c 7c  umn==FN_Count ||
7290: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
72a0: 3d 46 4e 5f 41 76 67 20 29 7b 0a 20 20 20 20 20  =FN_Avg ){.     
72b0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69     if( pParse->i
72c0: 41 67 67 43 6f 75 6e 74 3e 3d 30 20 29 7b 0a 20  AggCount>=0 ){. 
72d0: 20 20 20 20 20 20 20 20 20 69 20 3d 20 70 50 61           i = pPa
72e0: 72 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74 3b 0a  rse->iAggCount;.
72f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7300: 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70           i = app
7310: 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73  endAggInfo(pPars
7320: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
7330: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31  ( i<0 ) return 1
7340: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
7350: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
7360: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  g = 1;.         
7370: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
7380: 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
7390: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 41        pParse->iA
73a0: 67 67 43 6f 75 6e 74 20 3d 20 69 3b 0a 20 20 20  ggCount = i;.   
73b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
73c0: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
73d0: 6e 3d 3d 46 4e 5f 43 6f 75 6e 74 20 29 7b 0a 20  n==FN_Count ){. 
73e0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
73f0: 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20  iAgg = i;.      
7400: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7410: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7420: 20 20 20 61 41 67 67 20 3d 20 70 50 61 72 73 65     aAgg = pParse
7430: 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f  ->aAgg;.      fo
7440: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
7450: 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAgg; i++){.   
7460: 20 20 20 20 20 69 66 28 20 21 61 41 67 67 5b 69       if( !aAgg[i
7470: 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ].isAgg ) contin
7480: 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
7490: 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72  sqliteExprCompar
74a0: 65 28 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c  e(aAgg[i].pExpr,
74b0: 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20   pExpr) ){.     
74c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
74d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
74e0: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
74f0: 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20  e->nAgg ){.     
7500: 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67     i = appendAgg
7510: 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20  Info(pParse);.  
7520: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 20        if( i<0 ) 
7530: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
7540: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
7550: 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20  ].isAgg = 1;.   
7560: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67       pParse->aAg
7570: 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78  g[i].pExpr = pEx
7580: 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pr;.      }.    
7590: 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
75a0: 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  i;.      break;.
75b0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
75c0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
75d0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
75e0: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
75f0: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
7600: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
7610: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
7620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7630: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
7640: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
7650: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
7660: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
7670: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
7680: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
7690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
76a0: 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70  if( nErr==0 && p
76b0: 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  Expr->pList ){. 
76c0: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70         int n = p
76d0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
76e0: 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pr;.        int 
76f0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
7700: 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69  =0; nErr==0 && i
7710: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
7720: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
7730: 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  eExprAnalyzeAggr
7740: 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
7750: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
7760: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
7770: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
77a0: 3b 0a 7d 0a                                      ;.}.