/ Hex Artifact Content
Login

Artifact 7aff65ea0732b07d36925087ad611019103ad69a:


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 34 31 20 32 30 30 32 2f 30 32 2f 31 34 20 32  .41 2002/02/14 2
0220: 31 3a 34 32 3a 35 31 20 64 72 68 20 45 78 70 20  1:42:51 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 0a 2f 2a  qliteInt.h".../*
0250: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
0260: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
0270: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f  sion tree..*/.vo
0280: 69 64 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c  id sqliteExprDel
0290: 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ete(Expr *p){.  
02a0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
02b0: 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d  n;.  if( p->op!=
02c0: 54 4b 5f 41 53 20 29 7b 0a 20 20 20 20 69 66 28  TK_AS ){.    if(
02d0: 20 70 2d 3e 70 4c 65 66 74 20 29 20 73 71 6c 69   p->pLeft ) sqli
02e0: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  teExprDelete(p->
02f0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
0300: 70 2d 3e 70 52 69 67 68 74 20 29 20 73 71 6c 69  p->pRight ) sqli
0310: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  teExprDelete(p->
0320: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69  pRight);.  }.  i
0330: 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 20 73 71  f( p->pList ) sq
0340: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
0350: 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  te(p->pList);.  
0360: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20 29  if( p->pSelect )
0370: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
0380: 65 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b  ete(p->pSelect);
0390: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
03a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
03b0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
03c0: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
03d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
03e0: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
03f0: 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
0400: 76 65 73 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  ves variables..*
0410: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72  /.int sqliteExpr
0420: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
0430: 2a 70 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  *p){.  switch( p
0440: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
0450: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
0460: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
0470: 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20  case TK_DOT:.   
0480: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
0490: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
04a0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
04b0: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
04c0: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 72  _STRING:.      r
04d0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 64 65 66  eturn 1;.    def
04e0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  ault: {.      if
04f0: 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 21 73  ( p->pLeft && !s
0500: 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74  qliteExprIsConst
0510: 61 6e 74 28 70 2d 3e 70 4c 65 66 74 29 20 29 20  ant(p->pLeft) ) 
0520: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
0530: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 26 26  if( p->pRight &&
0540: 20 21 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f   !sqliteExprIsCo
0550: 6e 73 74 61 6e 74 28 70 2d 3e 70 52 69 67 68 74  nstant(p->pRight
0560: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
0570: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74      if( p->pList
0580: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
0590: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
05a0: 3d 30 3b 20 69 3c 70 2d 3e 70 4c 69 73 74 2d 3e  =0; i<p->pList->
05b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
05c0: 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
05d0: 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  teExprIsConstant
05e0: 28 70 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  (p->pList->a[i].
05f0: 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 20  pExpr) ) return 
0600: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
0610: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
0620: 6e 20 70 2d 3e 70 4c 65 66 74 21 3d 30 20 7c 7c  n p->pLeft!=0 ||
0630: 20 70 2d 3e 70 52 69 67 68 74 21 3d 30 20 7c 7c   p->pRight!=0 ||
0640: 20 28 70 2d 3e 70 4c 69 73 74 20 26 26 20 70 2d   (p->pList && p-
0650: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29  >pList->nExpr>0)
0660: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
0670: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
0680: 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72 65 73   Walk the expres
0690: 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 70 72  sion tree and pr
06a0: 6f 63 65 73 73 20 6f 70 65 72 61 74 6f 72 73 20  ocess operators 
06b0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
06c0: 2a 2a 20 20 20 20 20 20 20 65 78 70 72 20 49 4e  **       expr IN
06d0: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
06e0: 0a 2a 2a 20 54 68 65 73 65 20 6f 70 65 72 61 74  .** These operat
06f0: 6f 72 73 20 68 61 76 65 20 74 6f 20 62 65 20 70  ors have to be p
0700: 72 6f 63 65 73 73 65 64 20 62 65 66 6f 72 65 20  rocessed before 
0710: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  column names are
0720: 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 65 63  .** resolved bec
0730: 61 75 73 65 20 65 61 63 68 20 73 75 63 68 20 6f  ause each such o
0740: 70 65 72 61 74 6f 72 20 69 6e 63 72 65 6d 65 6e  perator incremen
0750: 74 73 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 0a  ts pParse->nTab.
0760: 2a 2a 20 74 6f 20 72 65 73 65 72 76 65 20 63 75  ** to reserve cu
0770: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  rsor numbers for
0780: 20 69 74 73 20 6f 77 6e 20 75 73 65 2e 20 20 42   its own use.  B
0790: 75 74 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 0a  ut pParse->nTab.
07a0: 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63  ** needs to be c
07b0: 6f 6e 73 74 61 6e 74 20 6f 6e 63 65 20 77 65 20  onstant once we 
07c0: 62 65 67 69 6e 20 72 65 73 6f 6c 76 69 6e 67 20  begin resolving 
07d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 46  column names.  F
07e0: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
07f0: 6e 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  n, this procedur
0800: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  e needs to be ca
0810: 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 65 78  lled on every ex
0820: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 62 65 66 6f  pression.** befo
0830: 72 65 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  re sqliteExprRes
0840: 6f 6c 76 65 49 64 73 28 29 20 69 73 20 63 61 6c  olveIds() is cal
0850: 6c 65 64 20 6f 6e 20 61 6e 79 20 65 78 70 72 65  led on any expre
0860: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 63 74  ssion..**.** Act
0870: 75 61 6c 6c 79 2c 20 74 68 65 20 70 72 6f 63 65  ually, the proce
0880: 73 73 69 6e 67 20 6f 66 20 49 4e 2d 53 45 4c 45  ssing of IN-SELE
0890: 43 54 20 69 73 20 6f 6e 6c 79 20 73 74 61 72 74  CT is only start
08a0: 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 72 6f  ed by this.** ro
08b0: 75 74 69 6e 65 2e 20 20 54 68 69 73 20 72 6f 75  utine.  This rou
08c0: 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
08d0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 74   cursor number t
08e0: 6f 20 74 68 65 20 49 4e 2d 53 45 4c 45 43 54 0a  o the IN-SELECT.
08f0: 2a 2a 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65  ** and then move
0900: 73 20 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  s on.  The code 
0910: 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 20 64 6f  generation is do
0920: 6e 65 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65  ne by .** sqlite
0930: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 29  ExprResolveIds()
0940: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 63   which must be c
0950: 61 6c 6c 65 64 20 61 66 74 65 72 77 61 72 64 73  alled afterwards
0960: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0970: 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c  ExprResolveInSel
0980: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
0990: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
09a0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
09b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
09c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
09d0: 20 26 26 20 70 45 78 70 72 2d 3e 70 53 65 6c 65   && pExpr->pSele
09e0: 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 70 45 78  ct!=0 ){.    pEx
09f0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
0a00: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d  rse->nTab++;.  }
0a10: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45  else{.    if( pE
0a20: 78 70 72 2d 3e 70 4c 65 66 74 20 29 20 73 71 6c  xpr->pLeft ) sql
0a30: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e  iteExprResolveIn
0a40: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
0a50: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
0a60: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69    if( pExpr->pRi
0a70: 67 68 74 20 29 20 73 71 6c 69 74 65 45 78 70 72  ght ) sqliteExpr
0a80: 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28  ResolveInSelect(
0a90: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
0aa0: 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20  Right);.    if( 
0ab0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
0ac0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
0ad0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
0ae0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
0af0: 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  t;.      for(i=0
0b00: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
0b10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
0b20: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
0b30: 65 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65  eInSelect(pParse
0b40: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
0b50: 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
0b60: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
0b70: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
0b80: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
0b90: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
0ba0: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  umn name..*/.sta
0bb0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 49 73  tic int sqliteIs
0bc0: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
0bd0: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
0be0: 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  teStrICmp(z, "_R
0bf0: 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
0c00: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
0c10: 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 22 52  iteStrICmp(z, "R
0c20: 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  OWID")==0 ) retu
0c30: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
0c40: 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  teStrICmp(z, "OI
0c50: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
0c60: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
0c70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0c80: 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78  tine walks an ex
0c90: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
0ca0: 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72  d resolves refer
0cb0: 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c  ences to.** tabl
0cc0: 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65  e columns.  Node
0cd0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 49 44  s of the form ID
0ce0: 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f 6c 76  .ID or ID resolv
0cf0: 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64  e into an.** ind
0d00: 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ex to the table 
0d10: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73  in the table lis
0d20: 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e 20 6f  t and a column o
0d30: 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a 2a 20  ffset.  The .** 
0d40: 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f 72 20  Expr.opcode for 
0d50: 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20 63 68  such nodes is ch
0d60: 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55  anged to TK_COLU
0d70: 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e 69 54  MN.  The Expr.iT
0d80: 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73  able.** value is
0d90: 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20   changed to the 
0da0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72 65 66  index of the ref
0db0: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 69 6e  erenced table in
0dc0: 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70 6c 75   pTabList.** plu
0dd0: 73 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 54  s the pParse->nT
0de0: 61 62 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  ab value.  This 
0df0: 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d  value will ultim
0e00: 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65  ately become the
0e10: 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20  .** VDBE cursor 
0e20: 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72  number for a cur
0e30: 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e  sor that is poin
0e40: 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65  ting into the re
0e50: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c  ferenced.** tabl
0e60: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
0e70: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68  lumn value is ch
0e80: 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64  anged to the ind
0e90: 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
0ea0: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65   .** of the refe
0eb0: 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54  renced table.  T
0ec0: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
0ed0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70  value for the sp
0ee0: 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63  ecial.** ROWID c
0ef0: 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e  olumn is -1.  An
0f00: 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  y INTEGER PRIMAR
0f10: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20  Y KEY column is 
0f20: 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61  tried as an.** a
0f30: 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a  lias for ROWID..
0f40: 2a 2a 0a 2a 2a 20 57 65 20 61 6c 73 6f 20 63 68  **.** We also ch
0f50: 65 63 6b 20 66 6f 72 20 69 6e 73 74 61 6e 63 65  eck for instance
0f60: 73 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  s of the IN oper
0f70: 61 74 6f 72 2e 20 20 49 4e 20 63 6f 6d 65 73 20  ator.  IN comes 
0f80: 69 6e 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a  in two.** forms:
0f90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
0fa0: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
0fb0: 73 74 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20  st).** and.**   
0fc0: 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e 20          expr IN 
0fd0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a  (SELECT ...).**.
0fe0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
0ff0: 6d 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20  m is handled by 
1000: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 68  creating a set h
1010: 6f 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74 0a  olding the list.
1020: 2a 2a 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61  ** of allowed va
1030: 6c 75 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e  lues.  The secon
1040: 64 20 66 6f 72 6d 20 63 61 75 73 65 73 20 74 68  d form causes th
1050: 65 20 53 45 4c 45 43 54 20 74 6f 20 67 65 6e 65  e SELECT to gene
1060: 72 61 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f  rate .** a tempo
1070: 72 61 72 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  rary table..**.*
1080: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1090: 6c 73 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20 73 63  lso looks for sc
10a0: 61 6c 61 72 20 53 45 4c 45 43 54 73 20 74 68 61  alar SELECTs tha
10b0: 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 61 6e  t are part of an
10c0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
10d0: 49 66 20 69 74 20 66 69 6e 64 73 20 61 6e 79 2c  If it finds any,
10e0: 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 63 6f   it generates co
10f0: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
1100: 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73 65  value of that se
1110: 6c 65 63 74 0a 2a 2a 20 69 6e 74 6f 20 61 20 6d  lect.** into a m
1120: 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  emory cell..**.*
1130: 2a 20 55 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e  * Unknown column
1140: 73 20 6f 72 20 74 61 62 6c 65 73 20 70 72 6f 76  s or tables prov
1150: 6f 6b 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 54  oke an error.  T
1160: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
1170: 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  rns.** the numbe
1180: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
1190: 20 61 6e 64 20 6c 65 61 76 65 73 20 61 6e 20 65   and leaves an e
11a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e 20  rror message on 
11b0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
11c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78  .*/.int sqliteEx
11d0: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 0a 20 20  prResolveIds(.  
11e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11f0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1200: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64   context */.  Id
1210: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
1220: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
1230: 65 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c  es used to resol
1240: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
1250: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1260: 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  EList,  /* List 
1270: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75  of expressions u
1280: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 22  sed to resolve "
1290: 41 53 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  AS" */.  Expr *p
12a0: 45 78 70 72 20 20 20 20 20 20 20 20 2f 2a 20 54  Expr        /* T
12b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
12c0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f   be analyzed. */
12d0: 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  .){.  if( pExpr=
12e0: 3d 30 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d  =0 || pTabList==
12f0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1300: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
1310: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6c 6f  p ){.    /* A lo
1320: 6e 65 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ne identifier.  
1330: 54 72 79 20 61 6e 64 20 6d 61 74 63 68 20 69 74  Try and match it
1340: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
1350: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 31   **.    **     1
1360: 2e 20 20 54 6f 20 74 68 65 20 6e 61 6d 65 20 6f  .  To the name o
1370: 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 6e  f a column of on
1380: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
1390: 69 6e 20 70 54 61 62 4c 69 73 74 0a 20 20 20 20  in pTabList.    
13a0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 32 2e  **.    **     2.
13b0: 20 20 54 6f 20 74 68 65 20 72 69 67 68 74 20 73    To the right s
13c0: 69 64 65 20 6f 66 20 61 6e 20 41 53 20 6b 65 79  ide of an AS key
13d0: 77 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  word in the colu
13e0: 6d 6e 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 2a  mn list of.    *
13f0: 2a 20 20 20 20 20 20 20 20 20 61 20 53 45 4c 45  *         a SELE
1400: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 28  CT statement.  (
1410: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 6d 61 74  For example, mat
1420: 63 68 20 61 67 61 69 6e 73 74 20 27 78 27 20 69  ch against 'x' i
1430: 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
1440: 20 22 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20   "SELECT a+b AS 
1450: 27 78 27 20 46 52 4f 4d 20 74 31 22 2e 29 0a 20  'x' FROM t1".). 
1460: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1470: 20 33 2e 20 20 4f 6e 65 20 6f 66 20 74 68 65 20   3.  One of the 
1480: 73 70 65 63 69 61 6c 20 6e 61 6d 65 73 20 22 52  special names "R
1490: 4f 57 49 44 22 2c 20 22 4f 49 44 22 2c 20 6f 72  OWID", "OID", or
14a0: 20 22 5f 52 4f 57 49 44 5f 22 2e 0a 20 20 20 20   "_ROWID_"..    
14b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
14c0: 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  D: {.      int c
14d0: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  nt = 0;      /* 
14e0: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 65  Number of matche
14f0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
1500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1510: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1520: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
1530: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45  sqliteStrNDup(pE
1540: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
1550: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
1560: 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f       sqliteDequo
1570: 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  te(z);.      if(
1580: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   z==0 ) return 1
1590: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
15a0: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64   i<pTabList->nId
15b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15c0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 54  int j;.        T
15d0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
15e0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
15f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
1600: 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ab==0 ) continue
1610: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
1620: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
1630: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1640: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
1650: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  mp(pTab->aCol[j]
1660: 2e 7a 4e 61 6d 65 2c 20 7a 29 3d 3d 30 20 29 7b  .zName, z)==0 ){
1670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74  .            cnt
1680: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1690: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
16a0: 69 20 2b 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  i + pParse->nTab
16b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
16c0: 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  ( j==pTab->iPKey
16d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16e0: 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
16f0: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
1700: 72 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45  r for the INTEGE
1710: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f  R PRIMARY KEY */
1720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1730: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
1740: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
1750: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1760: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
1770: 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
1780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1790: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
17a0: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
17b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
17c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17d0: 28 20 63 6e 74 3d 3d 30 20 26 26 20 70 45 4c 69  ( cnt==0 && pELi
17e0: 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st!=0 ){.       
17f0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
1800: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73  for(j=0; j<pELis
1810: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
1820: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1830: 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  zAs = pEList->a[
1840: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
1850: 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26      if( zAs!=0 &
1860: 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  & sqliteStrICmp(
1870: 7a 41 73 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20  zAs, z)==0 ){.  
1880: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
1890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
18a0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
18b0: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
18c0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
18d0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
18e0: 70 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20  p = TK_AS;.     
18f0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
1900: 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
1910: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
1920: 65 66 74 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  eft = pEList->a[
1930: 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  j].pExpr;.      
1940: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
1950: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1960: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 73 71 6c  f( cnt==0 && sql
1970: 69 74 65 49 73 52 6f 77 69 64 28 7a 29 20 29 7b  iteIsRowid(z) ){
1980: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
1990: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
19a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
19b0: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ble = pParse->nT
19c0: 61 62 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 20  ab;.        cnt 
19d0: 3d 20 31 20 2b 20 28 70 54 61 62 4c 69 73 74 2d  = 1 + (pTabList-
19e0: 3e 6e 49 64 3e 31 29 3b 0a 20 20 20 20 20 20 20  >nId>1);.       
19f0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1a00: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 7d 0a  COLUMN;.      }.
1a10: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1a20: 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  (z);.      if( c
1a30: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nt==0 ){.       
1a40: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
1a50: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
1a60: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  sg, "no such col
1a70: 75 6d 6e 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20  umn: ", -1,  .  
1a80: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
1a90: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
1aa0: 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20  oken.n, 0);.    
1ab0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
1ac0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ++;.        retu
1ad0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 1;.      }els
1ae0: 65 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a 20  e if( cnt>1 ){. 
1af0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
1b00: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
1b10: 3e 7a 45 72 72 4d 73 67 2c 20 22 61 6d 62 69 67  >zErrMsg, "ambig
1b20: 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uous column name
1b30: 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20  : ", -1,  .     
1b40: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
1b50: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
1b60: 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  n.n, 0);.       
1b70: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
1b80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1b90: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1ba0: 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 20   break; .    }. 
1bb0: 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65   .    /* A table
1bc0: 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e   name and column
1bd0: 20 6e 61 6d 65 3a 20 20 49 44 2e 49 44 20 2a 2f   name:  ID.ID */
1be0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
1bf0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e  : {.      int cn
1c00: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1c10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c20: 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
1c30: 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b   int cntTab = 0;
1c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c50: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
1c60: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
1c70: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1c90: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
1ca0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a    Expr *pLeft, *
1cb0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 4c 65  pRight;    /* Le
1cc0: 66 74 20 61 6e 64 20 72 69 67 68 74 20 73 75 62  ft and right sub
1cd0: 62 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20  branches of the 
1ce0: 65 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 63 68  expr */.      ch
1cf0: 61 72 20 2a 7a 4c 65 66 74 2c 20 2a 7a 52 69 67  ar *zLeft, *zRig
1d00: 68 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  ht;    /* Text o
1d10: 66 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  f an identifier 
1d20: 2a 2f 0a 0a 20 20 20 20 20 20 70 4c 65 66 74 20  */..      pLeft 
1d30: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1d40: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
1d50: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
1d60: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
1d70: 74 20 26 26 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d  t && pLeft->op==
1d80: 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 61  TK_ID );.      a
1d90: 73 73 65 72 74 28 20 70 52 69 67 68 74 20 26 26  ssert( pRight &&
1da0: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
1db0: 49 44 20 29 3b 0a 20 20 20 20 20 20 7a 4c 65 66  ID );.      zLef
1dc0: 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  t = sqliteStrNDu
1dd0: 70 28 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a  p(pLeft->token.z
1de0: 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e  , pLeft->token.n
1df0: 29 3b 0a 20 20 20 20 20 20 7a 52 69 67 68 74 20  );.      zRight 
1e00: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
1e10: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c  pRight->token.z,
1e20: 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e   pRight->token.n
1e30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 65  );.      if( zLe
1e40: 66 74 3d 3d 30 20 7c 7c 20 7a 52 69 67 68 74 3d  ft==0 || zRight=
1e50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1e60: 6c 69 74 65 46 72 65 65 28 7a 4c 65 66 74 29 3b  liteFree(zLeft);
1e70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
1e80: 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  ree(zRight);.   
1e90: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1ea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1eb0: 69 74 65 44 65 71 75 6f 74 65 28 7a 4c 65 66 74  iteDequote(zLeft
1ec0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44  );.      sqliteD
1ed0: 65 71 75 6f 74 65 28 7a 52 69 67 68 74 29 3b 0a  equote(zRight);.
1ee0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
1ef0: 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ble = -1;.      
1f00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
1f10: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
1f20: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
1f30: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
1f40: 62 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  b;.        Table
1f50: 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73   *pTab = pTabLis
1f60: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20  t->a[i].pTab;.  
1f70: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
1f80: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1f90: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69        if( pTabLi
1fa0: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 20  st->a[i].zAlias 
1fb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 61  ){.          zTa
1fc0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
1fd0: 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  i].zAlias;.     
1fe0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ff0: 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 2d      zTab = pTab-
2000: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
2010: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
2020: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 54 61 62  liteStrICmp(zTab
2030: 2c 20 7a 4c 65 66 74 29 21 3d 30 20 29 20 63 6f  , zLeft)!=0 ) co
2040: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2050: 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b  if( 0==(cntTab++
2060: 29 20 29 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ) ) pExpr->iTabl
2070: 65 20 3d 20 69 20 2b 20 70 50 61 72 73 65 2d 3e  e = i + pParse->
2080: 6e 54 61 62 3b 0a 20 20 20 20 20 20 20 20 66 6f  nTab;.        fo
2090: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
20a0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
20b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
20c0: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
20d0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 52 69 67  l[j].zName, zRig
20e0: 68 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ht)==0 ){.      
20f0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
2100: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2110: 69 54 61 62 6c 65 20 3d 20 69 20 2b 20 70 50 61  iTable = i + pPa
2120: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 20  rse->nTab;.     
2130: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54         if( j==pT
2140: 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
2150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
2160: 62 73 74 69 74 75 74 65 20 74 68 65 20 72 65 63  bstitute the rec
2170: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
2180: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
2190: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20  RY KEY */.      
21a0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
21b0: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
21c0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
21e0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
21f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2200: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2210: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2220: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26      if( cnt==0 &
2230: 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73  & cntTab==1 && s
2240: 71 6c 69 74 65 49 73 52 6f 77 69 64 28 7a 52 69  qliteIsRowid(zRi
2250: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ght) ){.        
2260: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  cnt = 1;.       
2270: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
2280: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
2290: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
22a0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
22b0: 69 74 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b  iteFree(zRight);
22c0: 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  .      if( cnt==
22d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
22e0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
22f0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
2300: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a  "no such column:
2310: 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20 20   ", -1,  .      
2320: 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e      pLeft->token
2330: 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  .z, pLeft->token
2340: 2e 6e 2c 20 22 2e 22 2c 20 31 2c 20 0a 20 20 20  .n, ".", 1, .   
2350: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74         pRight->t
2360: 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e  oken.z, pRight->
2370: 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  token.n, 0);.   
2380: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
2390: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
23a0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 1;.      }el
23b0: 73 65 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a  se if( cnt>1 ){.
23c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
23d0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
23e0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61 6d 62 69  ->zErrMsg, "ambi
23f0: 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  guous column nam
2400: 65 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20  e: ", -1,  .    
2410: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
2420: 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b  en.z, pLeft->tok
2430: 65 6e 2e 6e 2c 20 22 2e 22 2c 20 31 2c 0a 20 20  en.n, ".", 1,.  
2440: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
2450: 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d  token.z, pRight-
2460: 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20  >token.n, 0);.  
2470: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
2480: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65  rr++;.        re
2490: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
24a0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
24b0: 44 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20  Delete(pLeft);. 
24c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
24d0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  t = 0;.      sql
24e0: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 52  iteExprDelete(pR
24f0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 45 78  ight);.      pEx
2500: 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a  pr->pRight = 0;.
2510: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
2520: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
2530: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2540: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
2550: 20 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76   {.      Vdbe *v
2560: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
2570: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2580: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
2590: 6e 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73  n 1;.      if( s
25a0: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
25b0: 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
25c0: 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45  List, pEList, pE
25d0: 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20  xpr->pLeft) ){. 
25e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
25f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2600: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
2610: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
2620: 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72  Case 1:     expr
2630: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
2640: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2650: 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20      ** Generate 
2660: 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68  code to write th
2670: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
2680: 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 61 20 74   select into a t
2690: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
26a0: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20   ** table.  The 
26b0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
26c0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
26d0: 61 62 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  able has already
26e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 65 6e  .        ** been
26f0: 20 70 75 74 20 69 6e 20 69 54 61 62 6c 65 20 62   put in iTable b
2700: 79 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  y sqliteExprReso
2710: 6c 76 65 49 6e 53 65 6c 65 63 74 28 29 2e 0a 20  lveInSelect().. 
2720: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2730: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
2740: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
2750: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
2760: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
2770: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
2780: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
2790: 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 70  lect, SRT_Set, p
27a0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 20 29 3b  Expr->iTable) );
27b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
27c0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
27d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
27e0: 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
27f0: 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
2800: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2810: 20 43 72 65 61 74 65 20 61 20 73 65 74 20 74 6f   Create a set to
2820: 20 70 75 74 20 74 68 65 20 65 78 70 72 6c 69 73   put the exprlis
2830: 74 20 76 61 6c 75 65 73 20 69 6e 2e 20 20 54 68  t values in.  Th
2840: 65 20 53 65 74 20 69 64 20 69 73 20 73 74 6f 72  e Set id is stor
2850: 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ed.        ** in
2860: 20 69 54 61 62 6c 65 2e 0a 20 20 20 20 20 20 20   iTable..       
2870: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2880: 69 2c 20 69 53 65 74 3b 0a 20 20 20 20 20 20 20  i, iSet;.       
2890: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70   for(i=0; i<pExp
28a0: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  r->pList->nExpr;
28b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
28c0: 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78   Expr *pE2 = pEx
28d0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pr->pList->a[i].
28e0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
28f0: 20 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72   if( !sqliteExpr
2900: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
2910: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2920: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
2930: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
2940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
2950: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
2960: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d  of IN operator m
2970: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 22  ust be constant"
2980: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2990: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
29a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
29b0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
29c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
29d0: 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
29e0: 6b 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 30  k(pParse, pE2, 0
29f0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
2a00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2a10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a20: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 53 65 74    }.        iSet
2a30: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
2a40: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 2b   = pParse->nSet+
2a50: 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  +;.        for(i
2a60: 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69  =0; i<pExpr->pLi
2a70: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
2a80: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
2a90: 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c  *pE2 = pExpr->pL
2aa0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
2ab0: 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63  .          switc
2ac0: 68 28 20 70 45 32 2d 3e 6f 70 20 29 7b 0a 20 20  h( pE2->op ){.  
2ad0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
2ae0: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20  K_FLOAT:.       
2af0: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54       case TK_INT
2b00: 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20  EGER:.          
2b10: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
2b20: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
2b30: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
2b40: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2b50: 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 69 53  OP_SetInsert, iS
2b60: 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  et, 0);.        
2b70: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
2b80: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
2b90: 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  , pE2->token.z, 
2ba0: 70 45 32 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  pE2->token.n);. 
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2bc0: 69 74 65 56 64 62 65 44 65 71 75 6f 74 65 50 33  iteVdbeDequoteP3
2bd0: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
2be0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c00: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
2c10: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t: {.           
2c20: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
2c30: 65 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a  e(pParse, pE2);.
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2c50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2c60: 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 69   OP_SetInsert, i
2c70: 53 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Set, 0);.       
2c80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2c90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cb0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
2cd0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
2ce0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  : {.      /* Thi
2cf0: 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
2d00: 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
2d10: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
2d20: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
2d30: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
2d40: 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
2d50: 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
2d60: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
2d70: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
2d80: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
2d90: 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  mn..      */.   
2da0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
2db0: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n = pParse->nMem
2dc0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ++;.      if( sq
2dd0: 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
2de0: 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  e, pExpr->pSelec
2df0: 74 2c 20 53 52 54 5f 4d 65 6d 2c 20 70 45 78 70  t, SRT_Mem, pExp
2e00: 72 2d 3e 69 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20  r->iColumn) ){. 
2e10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2e20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
2e30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
2e40: 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 65 6c 73 65   /* For all else
2e50: 2c 20 6a 75 73 74 20 72 65 63 75 72 73 69 76 65  , just recursive
2e60: 6c 79 20 77 61 6c 6b 20 74 68 65 20 74 72 65 65  ly walk the tree
2e70: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
2e80: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
2e90: 70 72 2d 3e 70 4c 65 66 74 0a 20 20 20 20 20 20  pr->pLeft.      
2ea0: 26 26 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  && sqliteExprRes
2eb0: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
2ec0: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
2ed0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  , pExpr->pLeft) 
2ee0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2ef0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2f00: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52     if( pExpr->pR
2f10: 69 67 68 74 20 0a 20 20 20 20 20 20 26 26 20 73  ight .      && s
2f20: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
2f30: 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
2f40: 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45  List, pEList, pE
2f50: 78 70 72 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a  xpr->pRight) ){.
2f60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
2f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f80: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  if( pExpr->pList
2f90: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2fa0: 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
2fb0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
2fc0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
2fd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
2fe0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
2ff0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3000: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
3010: 65 49 64 73 28 70 50 61 72 73 65 2c 70 54 61 62  eIds(pParse,pTab
3020: 4c 69 73 74 2c 70 45 4c 69 73 74 2c 70 4c 69 73  List,pEList,pLis
3030: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
3040: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
3050: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
3060: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
3070: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3080: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
3090: 69 66 20 30 20 2f 2a 20 4e 4f 54 20 55 53 45 44  if 0 /* NOT USED
30a0: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72   */./*.** Compar
30b0: 65 20 61 20 74 6f 6b 65 6e 20 61 67 61 69 6e 73  e a token agains
30c0: 74 20 61 20 73 74 72 69 6e 67 2e 20 20 52 65 74  t a string.  Ret
30d0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 79  urn TRUE if they
30e0: 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69   match..*/.stati
30f0: 63 20 69 6e 74 20 73 71 6c 69 74 65 54 6f 6b 65  c int sqliteToke
3100: 6e 43 6d 70 28 54 6f 6b 65 6e 20 2a 70 54 6f 6b  nCmp(Token *pTok
3110: 65 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  en, const char *
3120: 7a 53 74 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  zStr){.  int n =
3130: 20 73 74 72 6c 65 6e 28 7a 53 74 72 29 3b 0a 20   strlen(zStr);. 
3140: 20 69 66 28 20 6e 21 3d 70 54 6f 6b 65 6e 2d 3e   if( n!=pToken->
3150: 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
3160: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 53 74 72  return sqliteStr
3170: 4e 49 43 6d 70 28 70 54 6f 6b 65 6e 2d 3e 7a 2c  NICmp(pToken->z,
3180: 20 7a 53 74 72 2c 20 6e 29 3d 3d 30 3b 0a 7d 0a   zStr, n)==0;.}.
3190: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
31a0: 6e 76 65 72 74 20 61 20 66 75 6e 63 74 69 6f 6e  nvert a function
31b0: 20 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 69   name into its i
31c0: 6e 74 65 67 65 72 20 69 64 65 6e 74 69 66 69 65  nteger identifie
31d0: 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  r.  Return the.*
31e0: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 52  * identifier.  R
31f0: 65 74 75 72 6e 20 46 4e 5f 55 6e 6b 6e 6f 77 6e  eturn FN_Unknown
3200: 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
3210: 20 6e 61 6d 65 20 69 73 20 75 6e 6b 6e 6f 77 6e   name is unknown
3220: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 46  ..*/.int sqliteF
3230: 75 6e 63 49 64 28 54 6f 6b 65 6e 20 2a 70 54 6f  uncId(Token *pTo
3240: 6b 65 6e 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ken){.  static c
3250: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
3260: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
3270: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
3280: 20 20 20 69 6e 74 20 69 64 3b 0a 20 20 7d 20 61     int id;.  } a
3290: 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Func[] = {.     
32a0: 7b 20 22 63 6f 75 6e 74 22 2c 20 20 35 2c 20 46  { "count",  5, F
32b0: 4e 5f 43 6f 75 6e 74 20 20 7d 2c 0a 20 20 20 20  N_Count  },.    
32c0: 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 33 2c 20   { "min",    3, 
32d0: 46 4e 5f 4d 69 6e 20 20 20 20 7d 2c 0a 20 20 20  FN_Min    },.   
32e0: 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 33 2c    { "max",    3,
32f0: 20 46 4e 5f 4d 61 78 20 20 20 20 7d 2c 0a 20 20   FN_Max    },.  
3300: 20 20 20 7b 20 22 73 75 6d 22 2c 20 20 20 20 33     { "sum",    3
3310: 2c 20 46 4e 5f 53 75 6d 20 20 20 20 7d 2c 0a 20  , FN_Sum    },. 
3320: 20 20 20 20 7b 20 22 61 76 67 22 2c 20 20 20 20      { "avg",    
3330: 33 2c 20 46 4e 5f 41 76 67 20 20 20 20 7d 2c 0a  3, FN_Avg    },.
3340: 20 20 20 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c       { "length",
3350: 20 36 2c 20 46 4e 5f 4c 65 6e 67 74 68 20 7d 2c   6, FN_Length },
3360: 0a 20 20 20 20 20 7b 20 22 73 75 62 73 74 72 22  .     { "substr"
3370: 2c 20 36 2c 20 46 4e 5f 53 75 62 73 74 72 20 7d  , 6, FN_Substr }
3380: 2c 0a 20 20 20 20 20 7b 20 22 61 62 73 22 2c 20  ,.     { "abs", 
3390: 20 20 20 33 2c 20 46 4e 5f 41 62 73 20 20 20 20     3, FN_Abs    
33a0: 7d 2c 0a 20 20 20 20 20 7b 20 22 72 6f 75 6e 64  },.     { "round
33b0: 22 2c 20 20 35 2c 20 46 4e 5f 52 6f 75 6e 64 20  ",  5, FN_Round 
33c0: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
33d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
33e0: 72 72 61 79 53 69 7a 65 28 61 46 75 6e 63 29 3b  rraySize(aFunc);
33f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
3400: 46 75 6e 63 5b 69 5d 2e 6c 65 6e 3d 3d 70 54 6f  Func[i].len==pTo
3410: 6b 65 6e 2d 3e 6e 20 0a 20 20 20 20 20 26 26 20  ken->n .     && 
3420: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70  sqliteStrNICmp(p
3430: 54 6f 6b 65 6e 2d 3e 7a 2c 20 61 46 75 6e 63 5b  Token->z, aFunc[
3440: 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 5b  i].zName, aFunc[
3450: 69 5d 2e 6c 65 6e 29 3d 3d 30 20 29 7b 0a 20 20  i].len)==0 ){.  
3460: 20 20 20 20 20 72 65 74 75 72 6e 20 61 46 75 6e       return aFun
3470: 63 5b 69 5d 2e 69 64 3b 0a 20 20 20 20 7d 0a 20  c[i].id;.    }. 
3480: 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 4e 5f 55   }.  return FN_U
3490: 6e 6b 6e 6f 77 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nknown;.}../*.**
34a0: 20 45 72 72 6f 72 20 63 68 65 63 6b 20 74 68 65   Error check the
34b0: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 61 6e   functions in an
34c0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4d 61   expression.  Ma
34d0: 6b 65 20 73 75 72 65 20 61 6c 6c 0a 2a 2a 20 66  ke sure all.** f
34e0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72  unction names ar
34f0: 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64  e recognized and
3500: 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 20 68   all functions h
3510: 61 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  ave the correct.
3520: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ** number of arg
3530: 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61  uments.  Leave a
3540: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
3550: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
3560: 73 67 0a 2a 2a 20 69 66 20 61 6e 79 74 68 69 6e  sg.** if anythin
3570: 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74  g is amiss.  Ret
3580: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
3590: 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  f errors..**.** 
35a0: 69 66 20 70 49 73 41 67 67 20 69 73 20 6e 6f 74  if pIsAgg is not
35b0: 20 6e 75 6c 6c 20 61 6e 64 20 74 68 69 73 20 65   null and this e
35c0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
35d0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
35e0: 6f 6e 0a 2a 2a 20 28 6c 69 6b 65 20 63 6f 75 6e  on.** (like coun
35f0: 74 28 2a 29 20 6f 72 20 6d 61 78 28 76 61 6c 75  t(*) or max(valu
3600: 65 29 29 20 74 68 65 6e 20 77 72 69 74 65 20 61  e)) then write a
3610: 20 31 20 69 6e 74 6f 20 2a 70 49 73 41 67 67 2e   1 into *pIsAgg.
3620: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78  .*/.int sqliteEx
3630: 70 72 43 68 65 63 6b 28 50 61 72 73 65 20 2a 70  prCheck(Parse *p
3640: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
3650: 70 72 2c 20 69 6e 74 20 61 6c 6c 6f 77 41 67 67  pr, int allowAgg
3660: 2c 20 69 6e 74 20 2a 70 49 73 41 67 67 29 7b 0a  , int *pIsAgg){.
3670: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
3680: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
3690: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
36a0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
36b0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  {.    case TK_FU
36c0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
36d0: 69 6e 74 20 69 64 20 3d 20 73 71 6c 69 74 65 46  int id = sqliteF
36e0: 75 6e 63 49 64 28 26 70 45 78 70 72 2d 3e 74 6f  uncId(&pExpr->to
36f0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ken);.      int 
3700: 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  n = pExpr->pList
3710: 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   ? pExpr->pList-
3720: 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
3730: 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75    int no_such_fu
3740: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  nc = 0;.      in
3750: 74 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73 20  t too_many_args 
3760: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 74  = 0;.      int t
3770: 6f 6f 5f 66 65 77 5f 61 72 67 73 20 3d 20 30 3b  oo_few_args = 0;
3780: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67  .      int is_ag
3790: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  g = 0;.      int
37a0: 20 69 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   i;.      pExpr-
37b0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 64 3b 0a 20  >iColumn = id;. 
37c0: 20 20 20 20 20 73 77 69 74 63 68 28 20 69 64 20       switch( id 
37d0: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
37e0: 46 4e 5f 55 6e 6b 6e 6f 77 6e 3a 20 7b 20 0a 20  FN_Unknown: { . 
37f0: 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68           no_such
3800: 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  _func = 1;.     
3810: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
3830: 73 65 20 46 4e 5f 43 6f 75 6e 74 3a 20 7b 20 0a  se FN_Count: { .
3840: 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63            no_suc
3850: 68 5f 66 75 6e 63 20 3d 20 21 61 6c 6c 6f 77 41  h_func = !allowA
3860: 67 67 3b 0a 20 20 20 20 20 20 20 20 20 20 74 6f  gg;.          to
3870: 6f 5f 6d 61 6e 79 5f 61 72 67 73 20 3d 20 6e 3e  o_many_args = n>
3880: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 73 5f  1;.          is_
3890: 61 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  agg = 1;.       
38a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
38b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
38c0: 20 46 4e 5f 4d 61 78 3a 0a 20 20 20 20 20 20 20   FN_Max:.       
38d0: 20 63 61 73 65 20 46 4e 5f 4d 69 6e 3a 20 7b 0a   case FN_Min: {.
38e0: 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 66 65            too_fe
38f0: 77 5f 61 72 67 73 20 3d 20 61 6c 6c 6f 77 41 67  w_args = allowAg
3900: 67 20 3f 20 6e 3c 31 20 3a 20 6e 3c 32 3b 0a 20  g ? n<1 : n<2;. 
3910: 20 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20           is_agg 
3920: 3d 20 6e 3d 3d 31 3b 0a 20 20 20 20 20 20 20 20  = n==1;.        
3930: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
3940: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
3950: 46 4e 5f 41 76 67 3a 0a 20 20 20 20 20 20 20 20  FN_Avg:.        
3960: 63 61 73 65 20 46 4e 5f 53 75 6d 3a 20 7b 0a 20  case FN_Sum: {. 
3970: 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68           no_such
3980: 5f 66 75 6e 63 20 3d 20 21 61 6c 6c 6f 77 41 67  _func = !allowAg
3990: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6f  g;.          too
39a0: 5f 6d 61 6e 79 5f 61 72 67 73 20 3d 20 6e 3e 31  _many_args = n>1
39b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f  ;.          too_
39c0: 66 65 77 5f 61 72 67 73 20 3d 20 6e 3c 31 3b 0a  few_args = n<1;.
39d0: 20 20 20 20 20 20 20 20 20 20 69 73 5f 61 67 67            is_agg
39e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
39f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
3a00: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e  .        case FN
3a10: 5f 41 62 73 3a 0a 20 20 20 20 20 20 20 20 63 61  _Abs:.        ca
3a20: 73 65 20 46 4e 5f 4c 65 6e 67 74 68 3a 20 7b 0a  se FN_Length: {.
3a30: 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 66 65            too_fe
3a40: 77 5f 61 72 67 73 20 3d 20 6e 3c 31 3b 0a 20 20  w_args = n<1;.  
3a50: 20 20 20 20 20 20 20 20 74 6f 6f 5f 6d 61 6e 79          too_many
3a60: 5f 61 72 67 73 20 3d 20 6e 3e 31 3b 0a 20 20 20  _args = n>1;.   
3a70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3a90: 63 61 73 65 20 46 4e 5f 52 6f 75 6e 64 3a 20 7b  case FN_Round: {
3aa0: 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 66  .          too_f
3ab0: 65 77 5f 61 72 67 73 20 3d 20 6e 3c 31 3b 0a 20  ew_args = n<1;. 
3ac0: 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 6d 61 6e           too_man
3ad0: 79 5f 61 72 67 73 20 3d 20 6e 3e 32 3b 0a 20 20  y_args = n>2;.  
3ae0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3af0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3b00: 20 63 61 73 65 20 46 4e 5f 53 75 62 73 74 72 3a   case FN_Substr:
3b10: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6f   {.          too
3b20: 5f 66 65 77 5f 61 72 67 73 20 3d 20 6e 3c 33 3b  _few_args = n<3;
3b30: 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 6d  .          too_m
3b40: 61 6e 79 5f 61 72 67 73 20 3d 20 6e 3e 33 3b 0a  any_args = n>3;.
3b50: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
3b60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3b70: 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
3b80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3b90: 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e   if( no_such_fun
3ba0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
3bb0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
3bc0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
3bd0: 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f  "no such functio
3be0: 6e 3a 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20  n: ", -1,.      
3bf0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
3c00: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
3c10: 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  n.n, 0);.       
3c20: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3c30: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  .        nErr++;
3c40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
3c50: 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73 20 29   too_many_args )
3c60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3c70: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
3c80: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 6f  se->zErrMsg, "to
3c90: 6f 20 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74 73  o many arguments
3ca0: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 22 2c 2d   to function ",-
3cb0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 45  1,.           pE
3cc0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
3cd0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 28  xpr->token.n, "(
3ce0: 29 22 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  )", 2, 0);.     
3cf0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3d00: 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  +;.        nErr+
3d10: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
3d20: 66 28 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73 20  f( too_few_args 
3d30: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3d40: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
3d50: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
3d60: 6f 6f 20 66 65 77 20 61 72 67 75 6d 65 6e 74 73  oo few arguments
3d70: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 22 2c 2d   to function ",-
3d80: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 45  1,.           pE
3d90: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
3da0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 28  xpr->token.n, "(
3db0: 29 22 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  )", 2, 0);.     
3dc0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3dd0: 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  +;.        nErr+
3de0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
3df0: 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 45   if( is_agg ) pE
3e00: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
3e10: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20  _FUNCTION;.     
3e20: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 70   if( is_agg && p
3e30: 49 73 41 67 67 20 29 20 2a 70 49 73 41 67 67 20  IsAgg ) *pIsAgg 
3e40: 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 1;.      for(i
3e50: 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69  =0; nErr==0 && i
3e60: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
3e70: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45    nErr = sqliteE
3e80: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
3e90: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
3ea0: 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20  [i].pExpr,.     
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 41            allowA
3ed0: 67 67 20 26 26 20 21 69 73 5f 61 67 67 2c 20 70  gg && !is_agg, p
3ee0: 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a  IsAgg);.      }.
3ef0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
3f00: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
3f10: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
3f20: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
3f30: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
3f40: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
3f50: 66 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49  ft, allowAgg, pI
3f60: 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sAgg);.      }. 
3f70: 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30       if( nErr==0
3f80: 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
3f90: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72  t ){.        nEr
3fa0: 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 43 68  r = sqliteExprCh
3fb0: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70  eck(pParse, pExp
3fc0: 72 2d 3e 70 52 69 67 68 74 2c 20 61 6c 6c 6f 77  r->pRight, allow
3fd0: 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20  Agg, pIsAgg);.  
3fe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
3ff0: 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72  nErr==0 && pExpr
4000: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
4010: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
4020: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  ->pList->nExpr;.
4030: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
4040: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
4050: 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20  nErr==0 && i<n; 
4060: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
4070: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70  Expr *pE2 = pExp
4080: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
4090: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
40a0: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70  nErr = sqliteExp
40b0: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
40c0: 45 32 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49  E2, allowAgg, pI
40d0: 73 41 67 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  sAgg);.        }
40e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
40f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4100: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d    return nErr;.}
4110: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
4120: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
4130: 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
4140: 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
4150: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
4160: 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65  and leave the re
4170: 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  sult on the top 
4180: 6f 66 20 73 74 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  of stack..*/.voi
4190: 64 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65  d sqliteExprCode
41a0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
41b0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
41c0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
41d0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
41e0: 70 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  p;.  if( v==0 ||
41f0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
4200: 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  rn;.  switch( pE
4210: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
4220: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20  ase TK_PLUS:    
4230: 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20 20 20   op = OP_Add;   
4240: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
4250: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 20  se TK_MINUS:    
4260: 6f 70 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74  op = OP_Subtract
4270: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4280: 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 20 6f  e TK_STAR:     o
4290: 70 20 3d 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3b  p = OP_Multiply;
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
42b0: 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 20 6f 70   TK_SLASH:    op
42c0: 20 3d 20 4f 50 5f 44 69 76 69 64 65 3b 20 20 20   = OP_Divide;   
42d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
42e0: 54 4b 5f 41 4e 44 3a 20 20 20 20 20 20 6f 70 20  TK_AND:      op 
42f0: 3d 20 4f 50 5f 41 6e 64 3b 20 20 20 20 20 20 62  = OP_And;      b
4300: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
4310: 4b 5f 4f 52 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_OR:       op =
4320: 20 4f 50 5f 4f 72 3b 20 20 20 20 20 20 20 62 72   OP_Or;       br
4330: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
4340: 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _LT:       op = 
4350: 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Lt;       bre
4360: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
4370: 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LE:       op = O
4380: 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Le;       brea
4390: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
43a0: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
43b0: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
43c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
43d0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
43e0: 47 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Ge;       break;
43f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
4400: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e         op = OP_N
4410: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
4420: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
4430: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
4440: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
4450: 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a     case TK_LIKE:
4460: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 69 6b       op = OP_Lik
4470: 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e;     break;.  
4480: 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20    case TK_GLOB: 
4490: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 6c 6f 62      op = OP_Glob
44a0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
44b0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
44c0: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c     op = OP_IsNul
44d0: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
44e0: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
44f0: 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c    op = OP_NotNul
4500: 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  l;  break;.    c
4510: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20  ase TK_NOT:     
4520: 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 3b 20 20 20   op = OP_Not;   
4530: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
4540: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 20  se TK_UMINUS:   
4550: 6f 70 20 3d 20 4f 50 5f 4e 65 67 61 74 69 76 65  op = OP_Negative
4560: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
4570: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 20 6f  e TK_BITAND:   o
4580: 70 20 3d 20 4f 50 5f 42 69 74 41 6e 64 3b 20 20  p = OP_BitAnd;  
4590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
45a0: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 20 6f 70   TK_BITOR:    op
45b0: 20 3d 20 4f 50 5f 42 69 74 4f 72 3b 20 20 20 20   = OP_BitOr;    
45c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
45d0: 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 20 6f 70 20  TK_BITNOT:   op 
45e0: 3d 20 4f 50 5f 42 69 74 4e 6f 74 3b 20 20 20 62  = OP_BitNot;   b
45f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
4600: 4b 5f 4c 53 48 49 46 54 3a 20 20 20 6f 70 20 3d  K_LSHIFT:   op =
4610: 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3b 20 20   OP_ShiftLeft;  
4620: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4630: 54 4b 5f 52 53 48 49 46 54 3a 20 20 20 6f 70 20  TK_RSHIFT:   op 
4640: 3d 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3b  = OP_ShiftRight;
4650: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4660: 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 20 6f 70   TK_REM:      op
4670: 20 3d 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3b   = OP_Remainder;
4680: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
4690: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
46a0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
46b0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
46c0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
46d0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
46e0: 75 73 65 41 67 67 20 29 7b 0a 20 20 20 20 20 20  useAgg ){.      
46f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4700: 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20  p(v, OP_AggGet, 
4710: 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b  0, pExpr->iAgg);
4720: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
4730: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
4740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
4750: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4760: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70   OP_Column, pExp
4770: 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
4780: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
4790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
47a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
47b0: 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 70 45  (v, OP_Recno, pE
47c0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
47d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
47e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
47f0: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
4800: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
4810: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
4820: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4830: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
4840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4850: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
4860: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
4870: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
4880: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4890: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
48a0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
48b0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
48c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
48d0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
48e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
48f0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
4900: 72 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r, pExpr->token.
4910: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
4920: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
4930: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
4940: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
4950: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4960: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
4970: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4980: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
4990: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
49a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
49b0: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
49c0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
49d0: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
49e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
49f0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
4a00: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
4a10: 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
4a20: 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
4a30: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
4a40: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
4a50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
4a60: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
4a70: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
4a80: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
4a90: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
4aa0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
4ab0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4ac0: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
4ad0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4ae0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  }.    case TK_LS
4af0: 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
4b00: 4b 5f 52 53 48 49 46 54 3a 20 7b 0a 20 20 20 20  K_RSHIFT: {.    
4b10: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
4b20: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
4b30: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
4b40: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
4b50: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
4b60: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
4b70: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
4b80: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
4b90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4ba0: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
4bb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
4bc0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
4bd0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
4be0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
4bf0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
4c00: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
4c10: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4c20: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32  (v, OP_Concat, 2
4c30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4c40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4c50: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
4c60: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
4c70: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
4c80: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
4c90: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
4ca0: 65 20 54 4b 5f 45 51 3a 20 0a 20 20 20 20 63 61  e TK_EQ: .    ca
4cb0: 73 65 20 54 4b 5f 4c 49 4b 45 3a 20 0a 20 20 20  se TK_LIKE: .   
4cc0: 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b   case TK_GLOB: {
4cd0: 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b  .      int dest;
4ce0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4cf0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
4d00: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
4d10: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
4d20: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
4d30: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
4d40: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
4d50: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
4d60: 67 68 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74  ght);.      dest
4d70: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72   = sqliteVdbeCur
4d80: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
4d90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4da0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
4db0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
4dc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4dd0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20   OP_AddImm, -1, 
4de0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4df0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4e00: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
4e10: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
4e20: 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ->pLeft );.     
4e30: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
4e40: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
4e50: 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  || pExpr->pLeft-
4e60: 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
4e70: 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e  ){.        Token
4e80: 20 2a 70 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c   *p = &pExpr->pL
4e90: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
4ea0: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
4eb0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e  liteMalloc( p->n
4ec0: 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20   + 2 );.        
4ed0: 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a  sprintf(z, "-%.*
4ee0: 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b  s", p->n, p->z);
4ef0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
4f00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4f10: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
4f20: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4f30: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
4f40: 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20  z, p->n+1);.    
4f50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4f60: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
4f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4f80: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
4f90: 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20  into TK_NOT */. 
4fa0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
4fb0: 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
4fc0: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
4fd0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
4fe0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
4ff0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
5000: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5010: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
5020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5030: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
5040: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
5050: 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
5060: 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  int dest;.      
5070: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5080: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
5090: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
50a0: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
50b0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
50c0: 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20 73  ;.      dest = s
50d0: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
50e0: 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20  Addr(v) + 2;.   
50f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5100: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73  Op(v, op, 0, des
5110: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
5120: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5130: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a  AddImm, -1, 0);.
5140: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5150: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
5160: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
5170: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
5180: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65  ddOp(v, OP_AggGe
5190: 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67  t, 0, pExpr->iAg
51a0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  g);.      if( pE
51b0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 46 4e  xpr->iColumn==FN
51c0: 5f 41 76 67 20 29 7b 0a 20 20 20 20 20 20 20 20  _Avg ){.        
51d0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
51e0: 69 41 67 67 43 6f 75 6e 74 3e 3d 30 20 26 26 20  iAggCount>=0 && 
51f0: 70 50 61 72 73 65 2d 3e 69 41 67 67 43 6f 75 6e  pParse->iAggCoun
5200: 74 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29  t<pParse->nAgg )
5210: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5220: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5230: 41 67 67 47 65 74 2c 20 30 2c 20 70 50 61 72 73  AggGet, 0, pPars
5240: 65 2d 3e 69 41 67 67 43 6f 75 6e 74 29 3b 0a 20  e->iAggCount);. 
5250: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
5260: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 76  eAddOp(v, OP_Div
5270: 69 64 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ide, 0, 0);.    
5280: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5290: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
52a0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
52b0: 20 20 20 20 20 69 6e 74 20 69 64 20 3d 20 70 45       int id = pE
52c0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
52d0: 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20      int op;.    
52e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45    int i;.      E
52f0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
5300: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
5310: 20 20 20 20 20 73 77 69 74 63 68 28 20 69 64 20       switch( id 
5320: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
5330: 46 4e 5f 4d 69 6e 3a 20 0a 20 20 20 20 20 20 20  FN_Min: .       
5340: 20 63 61 73 65 20 46 4e 5f 4d 61 78 3a 20 7b 0a   case FN_Max: {.
5350: 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20 69            op = i
5360: 64 3d 3d 46 4e 5f 4d 69 6e 20 3f 20 4f 50 5f 4d  d==FN_Min ? OP_M
5370: 69 6e 20 3a 20 4f 50 5f 4d 61 78 3b 0a 20 20 20  in : OP_Max;.   
5380: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
5390: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
53a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
53b0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
53c0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
53d0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
53e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
53f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5400: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5410: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
5420: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5430: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5440: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5450: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
5460: 65 20 46 4e 5f 41 62 73 3a 20 7b 0a 20 20 20 20  e FN_Abs: {.    
5470: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5480: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
5490: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
54a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
54b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
54c0: 5f 41 62 73 56 61 6c 75 65 2c 20 30 2c 20 30 29  _AbsValue, 0, 0)
54d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
54e0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
54f0: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 52 6f 75       case FN_Rou
5500: 6e 64 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  nd: {.          
5510: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
5520: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==2 ){.         
5530: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
5540: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
5550: 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
5560: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5570: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
5580: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5590: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
55a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
55b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
55c0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
55d0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
55e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
55f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5600: 50 5f 50 72 65 63 69 73 69 6f 6e 2c 20 30 2c 20  P_Precision, 0, 
5610: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
5620: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5630: 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4c         case FN_L
5640: 65 6e 67 74 68 3a 20 7b 0a 20 20 20 20 20 20 20  ength: {.       
5650: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
5660: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
5670: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
5680: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
5690: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
56a0: 72 6c 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rlen, 0, 0);.   
56b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
56c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
56d0: 63 61 73 65 20 46 4e 5f 53 75 62 73 74 72 3a 20  case FN_Substr: 
56e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
56f0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
5700: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
5710: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
5720: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
5730: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
5740: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5750: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
5760: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 75  beAddOp(v, OP_Su
5770: 62 73 74 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  bstr, 0, 0);.   
5780: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5790: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
57a0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
57b0: 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 68 61       /* Can't ha
57c0: 70 70 65 6e 21 20 2a 2f 0a 20 20 20 20 20 20 20  ppen! */.       
57d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
57e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
57f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5800: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
5810: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
5820: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5830: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d  _MemLoad, pExpr-
5840: 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20  >iColumn, 0);.  
5850: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5860: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
5870: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
5880: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  r;.      sqliteV
5890: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
58a0: 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20  nteger, 1, 0);. 
58b0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
58c0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
58d0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
58e0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
58f0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
5900: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
5910: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
5920: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5930: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e  AddOp(v, OP_Foun
5940: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
5950: 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20  , addr+2);.     
5960: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5970: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5980: 76 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64 2c 20  v, OP_SetFound, 
5990: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61  pExpr->iTable, a
59a0: 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 7d 0a  ddr+2);.      }.
59b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
59c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
59d0: 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  mm, -1, 0);.    
59e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
59f0: 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
5a00: 45 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  EN: {.      int 
5a10: 6c 62 6c 20 3d 20 73 71 6c 69 74 65 56 64 62 65  lbl = sqliteVdbe
5a20: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
5a30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5a40: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
5a50: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
5a60: 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73  sqliteExprIfFals
5a70: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
5a80: 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c   lbl);.      sql
5a90: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5aa0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29  OP_AddImm, 1, 0)
5ab0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
5ac0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
5ad0: 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 62 72  , lbl);.      br
5ae0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
5af0: 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20  ase TK_AS: {.   
5b00: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
5b10: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
5b20: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62  >pLeft);.      b
5b30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
5b40: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
5b50: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
5b60: 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
5b70: 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
5b80: 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
5b90: 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
5ba0: 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
5bb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
5bc0: 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
5bd0: 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
5be0: 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
5bf0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
5c00: 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64  s false..*/.void
5c10: 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72 75   sqliteExprIfTru
5c20: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
5c30: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
5c40: 74 20 64 65 73 74 29 7b 0a 20 20 56 64 62 65 20  t dest){.  Vdbe 
5c50: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
5c60: 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
5c70: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
5c80: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
5c90: 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  n;.  switch( pEx
5ca0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
5cb0: 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20  se TK_LT:       
5cc0: 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20  op = OP_Lt;     
5cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5ce0: 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f  e TK_LE:       o
5cf0: 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20  p = OP_Le;      
5d00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5d10: 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f 70   TK_GT:       op
5d20: 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20 20 20   = OP_Gt;       
5d30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5d40: 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_GE:       op 
5d50: 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20 20 20 62  = OP_Ge;       b
5d60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
5d70: 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_NE:       op =
5d80: 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20 62 72   OP_Ne;       br
5d90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
5da0: 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _EQ:       op = 
5db0: 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62 72 65  OP_Eq;       bre
5dc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
5dd0: 4c 49 4b 45 3a 20 20 20 20 20 6f 70 20 3d 20 4f  LIKE:     op = O
5de0: 50 5f 4c 69 6b 65 3b 20 20 20 20 20 62 72 65 61  P_Like;     brea
5df0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
5e00: 4c 4f 42 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50  LOB:     op = OP
5e10: 5f 47 6c 6f 62 3b 20 20 20 20 20 62 72 65 61 6b  _Glob;     break
5e20: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
5e30: 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  NULL:   op = OP_
5e40: 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b  IsNull;   break;
5e50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
5e60: 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e  NULL:  op = OP_N
5e70: 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a  otNull;  break;.
5e80: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 62 72      default:  br
5e90: 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  eak;.  }.  switc
5ea0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
5eb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
5ec0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
5ed0: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
5ee0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
5ef0: 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73  sqliteExprIfFals
5f00: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
5f10: 3e 70 4c 65 66 74 2c 20 64 32 29 3b 0a 20 20 20  >pLeft, d2);.   
5f20: 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54     sqliteExprIfT
5f30: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
5f40: 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 29  r->pRight, dest)
5f50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
5f60: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
5f70: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
5f80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
5f90: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
5fa0: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72    sqliteExprIfTr
5fb0: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
5fc0: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 29 3b 0a  ->pLeft, dest);.
5fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5fe0: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
5ff0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
6000: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
6010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6020: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
6030: 20 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c   sqliteExprIfFal
6040: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
6050: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 29 3b 0a  ->pLeft, dest);.
6060: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6070: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
6080: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
6090: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
60a0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
60b0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
60c0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
60d0: 51 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  Q:.    case TK_L
60e0: 49 4b 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IKE:.    case TK
60f0: 5f 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73  _GLOB: {.      s
6100: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
6110: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
6120: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
6130: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
6140: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
6150: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6160: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
6170: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
6180: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6190: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
61a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
61b0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
61c0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
61d0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
61e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
61f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
6200: 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
6210: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6220: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
6230: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
6240: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
6250: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
6260: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
6270: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
6280: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6290: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
62a0: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29  r->iTable, dest)
62b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
62c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
62d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
62e0: 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
62f0: 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20  able, dest);.   
6300: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
6310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6320: 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
6330: 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73       int lbl = s
6340: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
6350: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
6360: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
6370: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
6380: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6390: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
63a0: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
63b0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
63c0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
63d0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
63e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
63f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c  dbeAddOp(v, OP_L
6400: 74 2c 20 30 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  t, 0, lbl);.    
6410: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6420: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
6430: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
6440: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
6450: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6460: 4c 65 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  Le, 0, dest);.  
6470: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6480: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
6490: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
64a0: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
64b0: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a  eLabel(v, lbl);.
64c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
64d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
64e0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   1, 0);.      br
64f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
6500: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6510: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
6520: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
6530: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6540: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30  ddOp(v, OP_If, 0
6550: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
6560: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6570: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
6580: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
6590: 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
65a0: 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
65b0: 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
65c0: 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
65d0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
65e0: 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
65f0: 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
6600: 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
6610: 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
6620: 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
6630: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70  /.void sqliteExp
6640: 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
6650: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
6660: 78 70 72 2c 20 69 6e 74 20 64 65 73 74 29 7b 0a  xpr, int dest){.
6670: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
6680: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
6690: 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76   op = 0;.  if( v
66a0: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
66b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74  ) return;.  swit
66c0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
66d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
66e0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47         op = OP_G
66f0: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
6700: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
6710: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74        op = OP_Gt
6720: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
6730: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
6740: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b       op = OP_Le;
6750: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6760: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
6770: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20      op = OP_Lt; 
6780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6790: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
67a0: 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20     op = OP_Eq;  
67b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
67c0: 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
67d0: 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20    op = OP_Ne;   
67e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
67f0: 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 20 20 20 20  ase TK_LIKE:    
6800: 20 6f 70 20 3d 20 4f 50 5f 4c 69 6b 65 3b 20 20   op = OP_Like;  
6810: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
6820: 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 20 20 20 20  se TK_GLOB:     
6830: 6f 70 20 3d 20 4f 50 5f 47 6c 6f 62 3b 20 20 20  op = OP_Glob;   
6840: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6850: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f  e TK_ISNULL:   o
6860: 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20  p = OP_NotNull; 
6870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6880: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70   TK_NOTNULL:  op
6890: 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20   = OP_IsNull;   
68a0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
68b0: 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  lt:  break;.  }.
68c0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
68d0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
68e0: 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
68f0: 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73  sqliteExprIfFals
6900: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
6910: 3e 70 4c 65 66 74 2c 20 64 65 73 74 29 3b 0a 20  >pLeft, dest);. 
6920: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
6930: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
6940: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
6950: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
6960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6970: 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
6980: 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 56  int d2 = sqliteV
6990: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
69a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
69b0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
69c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
69d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
69e0: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
69f0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
6a00: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
6a10: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
6a20: 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
6a30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6a40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
6a50: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6a60: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
6a70: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
6a80: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
6a90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6aa0: 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
6ab0: 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
6ac0: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
6ad0: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
6ae0: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
6af0: 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
6b00: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
6b10: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
6b20: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
6b30: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
6b40: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
6b50: 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ght);.      sqli
6b60: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
6b70: 70 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 0, dest);.   
6b80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6b90: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45      case TK_LIKE
6ba0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c  :.    case TK_GL
6bb0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OB: {.      sqli
6bc0: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
6bd0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
6be0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
6bf0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
6c00: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
6c10: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6c20: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64  ddOp(v, op, 1, d
6c30: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
6c40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6c50: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
6c60: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
6c70: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6c80: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
6c90: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
6ca0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6cb0: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
6cc0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
6cd0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6ce0: 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
6cf0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6d00: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
6d10: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 69 66  pLeft);.      if
6d20: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
6d30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6d40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6d50: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_NotFound, pExp
6d60: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29  r->iTable, dest)
6d70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6d80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
6d90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
6da0: 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  NotFound, pExpr-
6db0: 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a  >iTable, dest);.
6dc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
6dd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6de0: 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
6df0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
6e00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
6e10: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
6e20: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
6e30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6e40: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
6e50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
6e60: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
6e70: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
6e80: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
6e90: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
6ea0: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
6eb0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
6ec0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6ed0: 5f 47 65 2c 20 30 2c 20 61 64 64 72 2b 33 29 3b  _Ge, 0, addr+3);
6ee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6ef0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
6f00: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
6f10: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6f20: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
6f30: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
6f40: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
6f50: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
6f60: 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[1].pExpr);.   
6f70: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6f80: 4f 70 28 76 2c 20 4f 50 5f 47 74 2c 20 30 2c 20  Op(v, OP_Gt, 0, 
6f90: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
6fa0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
6fb0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
6fc0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
6fd0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
6fe0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6ff0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 2c 20 30  dOp(v, OP_Not, 0
7000: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7010: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7020: 50 5f 49 66 2c 20 30 2c 20 64 65 73 74 29 3b 0a  P_If, 0, dest);.
7030: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7040: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7050: 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72  Do a deep compar
7060: 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72  ison of two expr
7070: 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52  ession trees.  R
7080: 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d  eturn TRUE (non-
7090: 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79  zero).** if they
70a0: 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
70b0: 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20  nd return FALSE 
70c0: 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
70d0: 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e  n any way..*/.in
70e0: 74 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70  t sqliteExprComp
70f0: 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78  are(Expr *pA, Ex
7100: 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69  pr *pB){.  int i
7110: 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 29 7b  ;.  if( pA==0 ){
7120: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d  .    return pB==
7130: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
7140: 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  B==0 ){.    retu
7150: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
7160: 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29  pA->op!=pB->op )
7170: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7180: 20 21 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70   !sqliteExprComp
7190: 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
71a0: 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  B->pLeft) ) retu
71b0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
71c0: 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70  iteExprCompare(p
71d0: 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70  A->pRight, pB->p
71e0: 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
71f0: 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  0;.  if( pA->pLi
7200: 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  st ){.    if( pB
7210: 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ->pList==0 ) ret
7220: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
7230: 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  A->pList->nExpr!
7240: 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  =pB->pList->nExp
7250: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
7260: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
7270: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
7280: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
7290: 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72  sqliteExprCompar
72a0: 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  e(pA->pList->a[i
72b0: 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69  ].pExpr, pB->pLi
72c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
72d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
72e0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
72f0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
7300: 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  B->pList ){.    
7310: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7320: 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20  if( pA->pSelect 
7330: 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29  || pB->pSelect )
7340: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7350: 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a   pA->token.z ){.
7360: 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
7370: 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  n.z==0 ) return 
7380: 30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74  0;.    if( pB->t
7390: 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65  oken.n!=pA->toke
73a0: 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n.n ) return 0;.
73b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
73c0: 72 4e 49 43 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e  rNICmp(pA->token
73d0: 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c  .z, pB->token.z,
73e0: 20 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30   pA->token.n)!=0
73f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
7400: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
7410: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
7420: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
7430: 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
7440: 72 61 79 20 61 6e 64 20 72 65 74 75 72 6e 20 69  ray and return i
7450: 74 73 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ts index..*/.sta
7460: 74 69 63 20 69 6e 74 20 61 70 70 65 6e 64 41 67  tic int appendAg
7470: 67 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  gInfo(Parse *pPa
7480: 72 73 65 29 7b 0a 20 20 69 66 28 20 28 70 50 61  rse){.  if( (pPa
7490: 72 73 65 2d 3e 6e 41 67 67 20 26 20 30 78 37 29  rse->nAgg & 0x7)
74a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  ==0 ){.    int a
74b0: 6d 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67  mt = pParse->nAg
74c0: 67 20 2b 20 38 3b 0a 20 20 20 20 41 67 67 45 78  g + 8;.    AggEx
74d0: 70 72 20 2a 61 41 67 67 20 3d 20 73 71 6c 69 74  pr *aAgg = sqlit
74e0: 65 52 65 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d  eRealloc(pParse-
74f0: 3e 61 41 67 67 2c 20 61 6d 74 2a 73 69 7a 65 6f  >aAgg, amt*sizeo
7500: 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30  f(pParse->aAgg[0
7510: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 41 67  ]));.    if( aAg
7520: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  g==0 ){.      re
7530: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
7540: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20     pParse->aAgg 
7550: 3d 20 61 41 67 67 3b 0a 20 20 7d 0a 20 20 6d 65  = aAgg;.  }.  me
7560: 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41  mset(&pParse->aA
7570: 67 67 5b 70 50 61 72 73 65 2d 3e 6e 41 67 67 5d  gg[pParse->nAgg]
7580: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 72  , 0, sizeof(pPar
7590: 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20  se->aAgg[0]));. 
75a0: 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
75b0: 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nAgg++;.}../*.**
75c0: 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76   Analyze the giv
75d0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  en expression lo
75e0: 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
75f0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
7600: 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
7610: 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
7620: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
7630: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
7640: 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64  rray..** Make ad
7650: 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
7660: 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
7670: 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20  aAgg[] array as 
7680: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
7690: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
76a0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
76b0: 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
76c0: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
76d0: 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
76e0: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
76f0: 76 65 49 64 73 28 29 20 61 6e 64 20 73 71 6c 69  veIds() and sqli
7700: 74 65 45 78 70 72 43 68 65 63 6b 28 29 2e 0a 2a  teExprCheck()..*
7710: 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61  *.** If errors a
7720: 72 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61  re seen, leave a
7730: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
7740: 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72  in zErrMsg and r
7750: 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
7760: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
7770: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72  /.int sqliteExpr
7780: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
7790: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
77a0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
77b0: 20 69 6e 74 20 69 3b 0a 20 20 41 67 67 45 78 70   int i;.  AggExp
77c0: 72 20 2a 61 41 67 67 3b 0a 20 20 69 6e 74 20 6e  r *aAgg;.  int n
77d0: 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Err = 0;..  if( 
77e0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
77f0: 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  n 0;.  switch( p
7800: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
7810: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
7820: 7b 0a 20 20 20 20 20 20 61 41 67 67 20 3d 20 70  {.      aAgg = p
7830: 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20  Parse->aAgg;.   
7840: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
7850: 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
7860: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 41  {.        if( aA
7870: 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f  gg[i].isAgg ) co
7880: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7890: 69 66 28 20 61 41 67 67 5b 69 5d 2e 70 45 78 70  if( aAgg[i].pExp
78a0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  r->iTable==pExpr
78b0: 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
78c0: 20 20 26 26 20 61 41 67 67 5b 69 5d 2e 70 45 78    && aAgg[i].pEx
78d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pr->iColumn==pEx
78e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
78f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7900: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7910: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70  }.      if( i>=p
7920: 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20  Parse->nAgg ){. 
7930: 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e         i = appen
7940: 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29  dAggInfo(pParse)
7950: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
7960: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
7970: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
7980: 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 30 3b  gg[i].isAgg = 0;
7990: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
79a0: 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d  >aAgg[i].pExpr =
79b0: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a   pExpr;.      }.
79c0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
79d0: 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 62 72 65  g = i;.      bre
79e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
79f0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
7a00: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ON: {.      if( 
7a10: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
7a20: 46 4e 5f 43 6f 75 6e 74 20 7c 7c 20 70 45 78 70  FN_Count || pExp
7a30: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 46 4e 5f 41  r->iColumn==FN_A
7a40: 76 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  vg ){.        if
7a50: 28 20 70 50 61 72 73 65 2d 3e 69 41 67 67 43 6f  ( pParse->iAggCo
7a60: 75 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  unt>=0 ){.      
7a70: 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
7a80: 69 41 67 67 43 6f 75 6e 74 3b 0a 20 20 20 20 20  iAggCount;.     
7a90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7aa0: 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67      i = appendAg
7ab0: 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20  gInfo(pParse);. 
7ac0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 30           if( i<0
7ad0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
7ae0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
7af0: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31  Agg[i].isAgg = 1
7b00: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
7b10: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70  se->aAgg[i].pExp
7b20: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  r = 0;.         
7b30: 20 70 50 61 72 73 65 2d 3e 69 41 67 67 43 6f 75   pParse->iAggCou
7b40: 6e 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  nt = i;.        
7b50: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  }.        if( pE
7b60: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 46 4e  xpr->iColumn==FN
7b70: 5f 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  _Count ){.      
7b80: 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
7b90: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = i;.          b
7ba0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 41        }.      aA
7bc0: 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67  gg = pParse->aAg
7bd0: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  g;.      for(i=0
7be0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
7bf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7c00: 69 66 28 20 21 61 41 67 67 5b 69 5d 2e 69 73 41  if( !aAgg[i].isA
7c10: 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
7c20: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
7c30: 65 45 78 70 72 43 6f 6d 70 61 72 65 28 61 41 67  eExprCompare(aAg
7c40: 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 78 70  g[i].pExpr, pExp
7c50: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
7c60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
7c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7c80: 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41  f( i>=pParse->nA
7c90: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  gg ){.        i 
7ca0: 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28  = appendAggInfo(
7cb0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
7cc0: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
7cd0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  n 1;.        pPa
7ce0: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41  rse->aAgg[i].isA
7cf0: 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gg = 1;.        
7d00: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
7d10: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
7d20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78       }.      pEx
7d30: 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20  pr->iAgg = i;.  
7d40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7d50: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
7d60: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
7d70: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
7d80: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45    nErr = sqliteE
7d90: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
7da0: 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 78  ates(pParse, pEx
7db0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
7dc0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45    }.      if( nE
7dd0: 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  rr==0 && pExpr->
7de0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
7df0: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45    nErr = sqliteE
7e00: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
7e10: 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 78  ates(pParse, pEx
7e20: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
7e30: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
7e40: 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  Err==0 && pExpr-
7e50: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
7e60: 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d    int n = pExpr-
7e70: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  >pList->nExpr;. 
7e80: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
7e90: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e        for(i=0; n
7ea0: 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69  Err==0 && i<n; i
7eb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ++){.          n
7ec0: 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  Err = sqliteExpr
7ed0: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
7ee0: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  s(pParse, pExpr-
7ef0: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
7f00: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
7f10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
7f30: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a     return nErr;.}.