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

Artifact 4cae8bf44d5732182e5e8c25b4552c05ea55593e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 33 39 20 32 30 30 32 2f 30 31 2f 32 32 20 31  .39 2002/01/22 1
0220: 34 3a 31 31 3a 32 39 20 64 72 68 20 45 78 70 20  4:11:29 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 69 66 28 20 7a 3d 3d 30 20 29 20       if( z==0 ) 
1570: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
1580: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
1590: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
15a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
15b0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
15c0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
15d0: 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [i].pTab;.      
15e0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
15f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1600: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
1610: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
1620: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
1630: 69 74 65 53 74 72 49 43 6d 70 28 70 54 61 62 2d  iteStrICmp(pTab-
1640: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
1650: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
1660: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
1670: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1680: 54 61 62 6c 65 20 3d 20 69 20 2b 20 70 50 61 72  Table = i + pPar
1690: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 20 20  se->nTab;.      
16a0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
16b0: 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
16d0: 73 74 69 74 75 74 65 20 74 68 65 20 72 65 63 6f  stitute the reco
16e0: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
16f0: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
1700: 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20  Y KEY */.       
1710: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
1720: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
1730: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1750: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  pr->iColumn = j;
1760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1770: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1780: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
1790: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17b0: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30        if( cnt==0
17c0: 20 26 26 20 70 45 4c 69 73 74 21 3d 30 20 29 7b   && pEList!=0 ){
17d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
17e0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
17f0: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
1800: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1810: 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45    char *zAs = pE
1820: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
1830: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1840: 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65  zAs!=0 && sqlite
1850: 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 29 3d  StrICmp(zAs, z)=
1860: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1870: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
1880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1890: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
18a0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
18b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
18c0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
18d0: 53 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  S;.            p
18e0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
18f0: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  j;.            p
1900: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 45  Expr->pLeft = pE
1910: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
1920: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1930: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
1940: 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  .      if( cnt==
1950: 30 20 26 26 20 73 71 6c 69 74 65 49 73 52 6f 77  0 && sqliteIsRow
1960: 69 64 28 7a 29 20 29 7b 0a 20 20 20 20 20 20 20  id(z) ){.       
1970: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
1980: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45  = -1;.        pE
1990: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
19a0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
19b0: 20 20 20 20 63 6e 74 20 3d 20 31 20 2b 20 28 70      cnt = 1 + (p
19c0: 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3e 31 29 3b  TabList->nId>1);
19d0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
19e0: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
19f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1a00: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
1a10: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b     if( cnt==0 ){
1a20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
1a30: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
1a40: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
1a50: 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 22 2c 20  such column: ", 
1a60: 2d 31 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20  -1,  .          
1a70: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
1a80: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pExpr->token.n, 
1a90: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
1aa0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
1ab0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1ac0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6e      }else if( cn
1ad0: 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  t>1 ){.        s
1ae0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
1af0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
1b00: 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c  , "ambiguous col
1b10: 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 2d 31 2c  umn name: ", -1,
1b20: 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78    .          pEx
1b30: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
1b40: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b  pr->token.n, 0);
1b50: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
1b60: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
1b70: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1b80: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20   }.      break; 
1b90: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1ba0: 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   A table name an
1bb0: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20  d column name:  
1bc0: 49 44 2e 49 44 20 2a 2f 0a 20 20 20 20 63 61 73  ID.ID */.    cas
1bd0: 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20  e TK_DOT: {.    
1be0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20    int cnt = 0;  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c00: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 65 73 20  mber of matches 
1c10: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  */.      int cnt
1c20: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
1c30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
1c40: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 73 20 2a  atching tables *
1c50: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1c80: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
1c90: 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 20  pLeft, *pRight; 
1ca0: 20 20 20 2f 2a 20 4c 65 66 74 20 61 6e 64 20 72     /* Left and r
1cb0: 69 67 68 74 20 73 75 62 62 72 61 6e 63 68 65 73  ight subbranches
1cc0: 20 6f 66 20 74 68 65 20 65 78 70 72 20 2a 2f 0a   of the expr */.
1cd0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4c 65 66        char *zLef
1ce0: 74 2c 20 2a 7a 52 69 67 68 74 3b 20 20 20 20 2f  t, *zRight;    /
1cf0: 2a 20 54 65 78 74 20 6f 66 20 61 6e 20 69 64 65  * Text of an ide
1d00: 6e 74 69 66 69 65 72 20 2a 2f 0a 0a 20 20 20 20  ntifier */..    
1d10: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
1d20: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52  >pLeft;.      pR
1d30: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
1d40: 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
1d50: 72 74 28 20 70 4c 65 66 74 20 26 26 20 70 4c 65  rt( pLeft && pLe
1d60: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  ft->op==TK_ID );
1d70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1d80: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
1d90: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
1da0: 20 20 20 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69      zLeft = sqli
1db0: 74 65 53 74 72 4e 44 75 70 28 70 4c 65 66 74 2d  teStrNDup(pLeft-
1dc0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d  >token.z, pLeft-
1dd0: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
1de0: 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   zRight = sqlite
1df0: 53 74 72 4e 44 75 70 28 70 52 69 67 68 74 2d 3e  StrNDup(pRight->
1e00: 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d  token.z, pRight-
1e10: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
1e20: 20 69 66 28 20 7a 4c 65 66 74 3d 3d 30 20 7c 7c   if( zLeft==0 ||
1e30: 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   zRight==0 ){.  
1e40: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1e50: 28 7a 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  (zLeft);.       
1e60: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67   sqliteFree(zRig
1e70: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ht);.        ret
1e80: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
1e90: 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f       sqliteDequo
1ea0: 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 20 20 20  te(zLeft);.     
1eb0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
1ec0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 45  Right);.      pE
1ed0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31  xpr->iTable = -1
1ee0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1ef0: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64   i<pTabList->nId
1f00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1f10: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 63  int j;.        c
1f20: 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20 20 20 20  har *zTab;.     
1f30: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
1f40: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
1f50: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66  pTab;.        if
1f60: 28 20 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pTab==0 ) cont
1f70: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1f80: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
1f90: 2e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  .zAlias ){.     
1fa0: 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62       zTab = pTab
1fb0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
1fc0: 73 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  s;.        }else
1fd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 61 62  {.          zTab
1fe0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
1ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2000: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
2010: 43 6d 70 28 7a 54 61 62 2c 20 7a 4c 65 66 74 29  Cmp(zTab, zLeft)
2020: 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
2030: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28          if( 0==(
2040: 63 6e 74 54 61 62 2b 2b 29 20 29 20 70 45 78 70  cntTab++) ) pExp
2050: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 2b 20  r->iTable = i + 
2060: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
2070: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2080: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
2090: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
20a0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70   sqliteStrICmp(p
20b0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
20c0: 6d 65 2c 20 7a 52 69 67 68 74 29 3d 3d 30 20 29  me, zRight)==0 )
20d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  {.            cn
20e0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
20f0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
2100: 20 69 20 2b 20 70 50 61 72 73 65 2d 3e 6e 54 61   i + pParse->nTa
2110: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  b;.            i
2120: 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  f( j==pTab->iPKe
2130: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
2140: 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
2150: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
2160: 65 72 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  er for the INTEG
2170: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
2180: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
2190: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
21a0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
21b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21c0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
21d0: 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
21e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2200: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2210: 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62  cnt==0 && cntTab
2220: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 49 73 52  ==1 && sqliteIsR
2230: 6f 77 69 64 28 7a 52 69 67 68 74 29 20 29 7b 0a  owid(zRight) ){.
2240: 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b          cnt = 1;
2250: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
2260: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
2270: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2280: 74 65 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20  teFree(zLeft);. 
2290: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
22a0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69  zRight);.      i
22b0: 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  f( cnt==0 ){.   
22c0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
22d0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
22e0: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
22f0: 20 63 6f 6c 75 6d 6e 3a 20 22 2c 20 2d 31 2c 20   column: ", -1, 
2300: 20 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 66   .          pLef
2310: 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66  t->token.z, pLef
2320: 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 2e 22 2c  t->token.n, ".",
2330: 20 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70   1, .          p
2340: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  Right->token.z, 
2350: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c  pRight->token.n,
2360: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
2370: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
2380: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2390: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
23a0: 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  nt>1 ){.        
23b0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
23c0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
23d0: 67 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f  g, "ambiguous co
23e0: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 2d 31  lumn name: ", -1
23f0: 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4c  ,  .          pL
2400: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c  eft->token.z, pL
2410: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 2e  eft->token.n, ".
2420: 22 2c 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ", 1,.          
2430: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c  pRight->token.z,
2440: 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e   pRight->token.n
2450: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
2460: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
2470: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2480: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2490: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
24a0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 45 78  Left);.      pEx
24b0: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr->pLeft = 0;. 
24c0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
24d0: 65 6c 65 74 65 28 70 52 69 67 68 74 29 3b 0a 20  elete(pRight);. 
24e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
24f0: 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 45  ht = 0;.      pE
2500: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
2510: 55 4d 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  UMN;.      break
2520: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
2530: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
2540: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
2550: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
2560: 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30  ;.      if( v==0
2570: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2580: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
2590: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
25a0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
25b0: 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  List, pExpr->pLe
25c0: 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ft) ){.        r
25d0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
25e0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
25f0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
2600: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20       /* Case 1: 
2610: 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
2620: 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20  ECT ...).       
2630: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47   **.        ** G
2640: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
2650: 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  write the result
2660: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  s of the select 
2670: 69 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79  into a temporary
2680: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
2690: 65 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e  e.  The cursor n
26a0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
26b0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 61 73  porary table has
26c0: 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 20   already.       
26d0: 20 2a 2a 20 62 65 65 6e 20 70 75 74 20 69 6e 20   ** been put in 
26e0: 69 54 61 62 6c 65 20 62 79 20 73 71 6c 69 74 65  iTable by sqlite
26f0: 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c  ExprResolveInSel
2700: 65 63 74 28 29 2e 0a 20 20 20 20 20 20 20 20 2a  ect()..        *
2710: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
2720: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2730: 4f 70 65 6e 54 65 6d 70 2c 20 70 45 78 70 72 2d  OpenTemp, pExpr-
2740: 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20  >iTable, 1);.   
2750: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
2760: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
2770: 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52  xpr->pSelect, SR
2780: 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
2790: 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 7d  able) );.      }
27a0: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
27b0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
27c0: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
27d0: 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
27e0: 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
27f0: 20 20 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20        ** Create 
2800: 61 20 73 65 74 20 74 6f 20 70 75 74 20 74 68 65  a set to put the
2810: 20 65 78 70 72 6c 69 73 74 20 76 61 6c 75 65 73   exprlist values
2820: 20 69 6e 2e 20 20 54 68 65 20 53 65 74 20 69 64   in.  The Set id
2830: 20 69 73 20 73 74 6f 72 65 64 0a 20 20 20 20 20   is stored.     
2840: 20 20 20 2a 2a 20 69 6e 20 69 54 61 62 6c 65 2e     ** in iTable.
2850: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2860: 20 20 20 20 69 6e 74 20 69 2c 20 69 53 65 74 3b      int i, iSet;
2870: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2880: 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74  ; i<pExpr->pList
2890: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
28a0: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
28b0: 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  E2 = pExpr->pLis
28c0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
28d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
28e0: 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61  liteExprIsConsta
28f0: 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
2900: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
2910: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
2920: 7a 45 72 72 4d 73 67 2c 0a 20 20 20 20 20 20 20  zErrMsg,.       
2930: 20 20 20 20 20 20 20 22 72 69 67 68 74 2d 68 61         "right-ha
2940: 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 6f 70  nd side of IN op
2950: 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 63  erator must be c
2960: 6f 6e 73 74 61 6e 74 22 2c 20 30 29 3b 0a 20 20  onstant", 0);.  
2970: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
2980: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
2990: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
29a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29c0: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
29d0: 2c 20 70 45 32 2c 20 30 2c 20 30 29 20 29 7b 0a  , pE2, 0, 0) ){.
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
29f0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 1;.          
2a00: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2a10: 20 20 20 20 69 53 65 74 20 3d 20 70 45 78 70 72      iSet = pExpr
2a20: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
2a30: 65 2d 3e 6e 53 65 74 2b 2b 3b 0a 20 20 20 20 20  e->nSet++;.     
2a40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
2a50: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
2a60: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
2a70: 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
2a80: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
2a90: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
2aa0: 20 20 20 73 77 69 74 63 68 28 20 70 45 32 2d 3e     switch( pE2->
2ab0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  op ){.          
2ac0: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
2ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
2ae0: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
2af0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
2b00: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
2b10: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64            int ad
2b20: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
2b30: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 49 6e  ddOp(v, OP_SetIn
2b40: 73 65 72 74 2c 20 69 53 65 74 2c 20 30 29 3b 0a  sert, iSet, 0);.
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2b60: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
2b70: 28 76 2c 20 61 64 64 72 2c 20 70 45 32 2d 3e 74  (v, addr, pE2->t
2b80: 6f 6b 65 6e 2e 7a 2c 20 70 45 32 2d 3e 74 6f 6b  oken.z, pE2->tok
2b90: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  en.n);.         
2ba0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44       sqliteVdbeD
2bb0: 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72  equoteP3(v, addr
2bc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2bd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2be0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2bf0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
2c00: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2c10: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
2c20: 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20  , pE2);.        
2c30: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
2c40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 49  AddOp(v, OP_SetI
2c50: 6e 73 65 72 74 2c 20 69 53 65 74 2c 20 30 29 3b  nsert, iSet, 0);
2c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
2c70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2c80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2c90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ca0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
2cb0: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
2cc0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
2cd0: 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f    /* This has to
2ce0: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
2cf0: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
2d00: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
2d10: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
2d20: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
2d30: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
2d40: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
2d50: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
2d60: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
2d70: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20  in iColumn..    
2d80: 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72    */.      pExpr
2d90: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 61 72  ->iColumn = pPar
2da0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
2db0: 20 20 69 66 28 20 73 71 6c 69 74 65 53 65 6c 65    if( sqliteSele
2dc0: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
2dd0: 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 4d  ->pSelect, SRT_M
2de0: 65 6d 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  em, pExpr->iColu
2df0: 6d 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  mn) ){.        r
2e00: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
2e10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2e20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
2e30: 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20 72  all else, just r
2e40: 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20  ecursively walk 
2e50: 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 20 20  the tree */.    
2e60: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
2e70: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
2e80: 74 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  t.      && sqlit
2e90: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
2ea0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2eb0: 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d  , pEList, pExpr-
2ec0: 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20  >pLeft) ){.     
2ed0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2ee0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2ef0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 0a 20 20  Expr->pRight .  
2f00: 20 20 20 20 26 26 20 73 71 6c 69 74 65 45 78 70      && sqliteExp
2f10: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
2f20: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
2f30: 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  List, pExpr->pRi
2f40: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ght) ){.        
2f50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2f60: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
2f70: 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  r->pList ){.    
2f80: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2f90: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
2fa0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
2fb0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  t;.        for(i
2fc0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
2fd0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
2fe0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
2ff0: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
3000: 72 73 65 2c 70 54 61 62 4c 69 73 74 2c 70 45 4c  rse,pTabList,pEL
3010: 69 73 74 2c 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ist,pList->a[i].
3020: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
3030: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3040: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3050: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3060: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3070: 20 30 3b 0a 7d 0a 0a 23 69 66 20 30 20 2f 2a 20   0;.}..#if 0 /* 
3080: 4e 4f 54 20 55 53 45 44 20 2a 2f 0a 2f 2a 0a 2a  NOT USED */./*.*
3090: 2a 20 43 6f 6d 70 61 72 65 20 61 20 74 6f 6b 65  * Compare a toke
30a0: 6e 20 61 67 61 69 6e 73 74 20 61 20 73 74 72 69  n against a stri
30b0: 6e 67 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ng.  Return TRUE
30c0: 20 69 66 20 74 68 65 79 20 6d 61 74 63 68 2e 0a   if they match..
30d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
30e0: 6c 69 74 65 54 6f 6b 65 6e 43 6d 70 28 54 6f 6b  liteTokenCmp(Tok
30f0: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 63 6f 6e 73  en *pToken, cons
3100: 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20  t char *zStr){. 
3110: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
3120: 7a 53 74 72 29 3b 0a 20 20 69 66 28 20 6e 21 3d  zStr);.  if( n!=
3130: 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 72 65 74 75  pToken->n ) retu
3140: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73  rn 0;.  return s
3150: 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70 54  qliteStrNICmp(pT
3160: 6f 6b 65 6e 2d 3e 7a 2c 20 7a 53 74 72 2c 20 6e  oken->z, zStr, n
3170: 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  )==0;.}.#endif..
3180: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
3190: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e  function name in
31a0: 74 6f 20 69 74 73 20 69 6e 74 65 67 65 72 20 69  to its integer i
31b0: 64 65 6e 74 69 66 69 65 72 2e 20 20 52 65 74 75  dentifier.  Retu
31c0: 72 6e 20 74 68 65 0a 2a 2a 20 69 64 65 6e 74 69  rn the.** identi
31d0: 66 69 65 72 2e 20 20 52 65 74 75 72 6e 20 46 4e  fier.  Return FN
31e0: 5f 55 6e 6b 6e 6f 77 6e 20 69 66 20 74 68 65 20  _Unknown if the 
31f0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 73  function name is
3200: 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2f 0a 69 6e 74   unknown..*/.int
3210: 20 73 71 6c 69 74 65 46 75 6e 63 49 64 28 54 6f   sqliteFuncId(To
3220: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
3230: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
3240: 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
3250: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74  *zName;.     int
3260: 20 6c 65 6e 3b 0a 20 20 20 20 20 69 6e 74 20 69   len;.     int i
3270: 64 3b 0a 20 20 7d 20 61 46 75 6e 63 5b 5d 20 3d  d;.  } aFunc[] =
3280: 20 7b 0a 20 20 20 20 20 7b 20 22 63 6f 75 6e 74   {.     { "count
3290: 22 2c 20 20 35 2c 20 46 4e 5f 43 6f 75 6e 74 20  ",  5, FN_Count 
32a0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 69 6e 22   },.     { "min"
32b0: 2c 20 20 20 20 33 2c 20 46 4e 5f 4d 69 6e 20 20  ,    3, FN_Min  
32c0: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 61 78    },.     { "max
32d0: 22 2c 20 20 20 20 33 2c 20 46 4e 5f 4d 61 78 20  ",    3, FN_Max 
32e0: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 75     },.     { "su
32f0: 6d 22 2c 20 20 20 20 33 2c 20 46 4e 5f 53 75 6d  m",    3, FN_Sum
3300: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61      },.     { "a
3310: 76 67 22 2c 20 20 20 20 33 2c 20 46 4e 5f 41 76  vg",    3, FN_Av
3320: 67 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  g    },.     { "
3330: 6c 65 6e 67 74 68 22 2c 20 36 2c 20 46 4e 5f 4c  length", 6, FN_L
3340: 65 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20 7b 20  ength },.     { 
3350: 22 73 75 62 73 74 72 22 2c 20 36 2c 20 46 4e 5f  "substr", 6, FN_
3360: 53 75 62 73 74 72 20 7d 2c 0a 20 20 20 20 20 7b  Substr },.     {
3370: 20 22 61 62 73 22 2c 20 20 20 20 33 2c 20 46 4e   "abs",    3, FN
3380: 5f 41 62 73 20 20 20 20 7d 2c 0a 20 20 20 20 20  _Abs    },.     
3390: 7b 20 22 72 6f 75 6e 64 22 2c 20 20 35 2c 20 46  { "round",  5, F
33a0: 4e 5f 52 6f 75 6e 64 20 20 7d 2c 0a 20 20 7d 3b  N_Round  },.  };
33b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
33c0: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
33d0: 28 61 46 75 6e 63 29 3b 20 69 2b 2b 29 7b 0a 20  (aFunc); i++){. 
33e0: 20 20 20 69 66 28 20 61 46 75 6e 63 5b 69 5d 2e     if( aFunc[i].
33f0: 6c 65 6e 3d 3d 70 54 6f 6b 65 6e 2d 3e 6e 20 0a  len==pToken->n .
3400: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 53 74       && sqliteSt
3410: 72 4e 49 43 6d 70 28 70 54 6f 6b 65 6e 2d 3e 7a  rNICmp(pToken->z
3420: 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a 4e 61 6d 65  , aFunc[i].zName
3430: 2c 20 61 46 75 6e 63 5b 69 5d 2e 6c 65 6e 29 3d  , aFunc[i].len)=
3440: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74  =0 ){.       ret
3450: 75 72 6e 20 61 46 75 6e 63 5b 69 5d 2e 69 64 3b  urn aFunc[i].id;
3460: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3470: 75 72 6e 20 46 4e 5f 55 6e 6b 6e 6f 77 6e 3b 0a  urn FN_Unknown;.
3480: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 63  }../*.** Error c
3490: 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f  heck the functio
34a0: 6e 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73  ns in an express
34b0: 69 6f 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ion.  Make sure 
34c0: 61 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  all.** function 
34d0: 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e  names are recogn
34e0: 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e  ized and all fun
34f0: 63 74 69 6f 6e 73 20 68 61 76 65 20 74 68 65 20  ctions have the 
3500: 63 6f 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62 65  correct.** numbe
3510: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
3520: 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
3530: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
3540: 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69 66  e->zErrMsg.** if
3550: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
3560: 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ss.  Return the 
3570: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
3580: 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41 67  ..**.** if pIsAg
3590: 67 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61 6e  g is not null an
35a0: 64 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  d this expressio
35b0: 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  n is an aggregat
35c0: 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28 6c  e function.** (l
35d0: 69 6b 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72 20  ike count(*) or 
35e0: 6d 61 78 28 76 61 6c 75 65 29 29 20 74 68 65 6e  max(value)) then
35f0: 20 77 72 69 74 65 20 61 20 31 20 69 6e 74 6f 20   write a 1 into 
3600: 2a 70 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20  *pIsAgg..*/.int 
3610: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
3620: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
3630: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
3640: 61 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20 2a 70  allowAgg, int *p
3650: 49 73 41 67 67 29 7b 0a 20 20 69 6e 74 20 6e 45  IsAgg){.  int nE
3660: 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45  rr = 0;.  if( pE
3670: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
3680: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
3690: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
36a0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
36b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 20 3d  {.      int id =
36c0: 20 73 71 6c 69 74 65 46 75 6e 63 49 64 28 26 70   sqliteFuncId(&p
36d0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  Expr->token);.  
36e0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70      int n = pExp
36f0: 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  r->pList ? pExpr
3700: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ->pList->nExpr :
3710: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f   0;.      int no
3720: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b 0a  _such_func = 0;.
3730: 20 20 20 20 20 20 69 6e 74 20 74 6f 6f 5f 6d 61        int too_ma
3740: 6e 79 5f 61 72 67 73 20 3d 20 30 3b 0a 20 20 20  ny_args = 0;.   
3750: 20 20 20 69 6e 74 20 74 6f 6f 5f 66 65 77 5f 61     int too_few_a
3760: 72 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rgs = 0;.      i
3770: 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20  nt is_agg = 0;. 
3780: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
3790: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
37a0: 20 3d 20 69 64 3b 0a 20 20 20 20 20 20 73 77 69   = id;.      swi
37b0: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 20  tch( id ){.     
37c0: 20 20 20 63 61 73 65 20 46 4e 5f 55 6e 6b 6e 6f     case FN_Unkno
37d0: 77 6e 3a 20 7b 20 0a 20 20 20 20 20 20 20 20 20  wn: { .         
37e0: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
37f0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
3800: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
3810: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 43 6f        case FN_Co
3820: 75 6e 74 3a 20 7b 20 0a 20 20 20 20 20 20 20 20  unt: { .        
3830: 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d    no_such_func =
3840: 20 21 61 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20   !allowAgg;.    
3850: 20 20 20 20 20 20 74 6f 6f 5f 6d 61 6e 79 5f 61        too_many_a
3860: 72 67 73 20 3d 20 6e 3e 31 3b 0a 20 20 20 20 20  rgs = n>1;.     
3870: 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 31 3b       is_agg = 1;
3880: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
3890: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
38a0: 20 20 20 20 63 61 73 65 20 46 4e 5f 4d 61 78 3a      case FN_Max:
38b0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e  .        case FN
38c0: 5f 4d 69 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  _Min: {.        
38d0: 20 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73 20 3d    too_few_args =
38e0: 20 61 6c 6c 6f 77 41 67 67 20 3f 20 6e 3c 31 20   allowAgg ? n<1 
38f0: 3a 20 6e 3c 32 3b 0a 20 20 20 20 20 20 20 20 20  : n<2;.         
3900: 20 69 73 5f 61 67 67 20 3d 20 6e 3d 3d 31 3b 0a   is_agg = n==1;.
3910: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
3920: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3930: 20 20 20 63 61 73 65 20 46 4e 5f 41 76 67 3a 0a     case FN_Avg:.
3940: 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f          case FN_
3950: 53 75 6d 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  Sum: {.         
3960: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
3970: 21 61 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 20  !allowAgg;.     
3980: 20 20 20 20 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72       too_many_ar
3990: 67 73 20 3d 20 6e 3e 31 3b 0a 20 20 20 20 20 20  gs = n>1;.      
39a0: 20 20 20 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73      too_few_args
39b0: 20 3d 20 6e 3c 31 3b 0a 20 20 20 20 20 20 20 20   = n<1;.        
39c0: 20 20 69 73 5f 61 67 67 20 3d 20 31 3b 0a 20 20    is_agg = 1;.  
39d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
39e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
39f0: 20 63 61 73 65 20 46 4e 5f 41 62 73 3a 0a 20 20   case FN_Abs:.  
3a00: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4c 65        case FN_Le
3a10: 6e 67 74 68 3a 20 7b 0a 20 20 20 20 20 20 20 20  ngth: {.        
3a20: 20 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73 20 3d    too_few_args =
3a30: 20 6e 3c 31 3b 0a 20 20 20 20 20 20 20 20 20 20   n<1;.          
3a40: 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73 20 3d 20  too_many_args = 
3a50: 6e 3e 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  n>1;.          b
3a60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
3a70: 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f          case FN_
3a80: 52 6f 75 6e 64 3a 20 7b 0a 20 20 20 20 20 20 20  Round: {.       
3a90: 20 20 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73 20     too_few_args 
3aa0: 3d 20 6e 3c 31 3b 0a 20 20 20 20 20 20 20 20 20  = n<1;.         
3ab0: 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73 20 3d   too_many_args =
3ac0: 20 6e 3e 32 3b 0a 20 20 20 20 20 20 20 20 20 20   n>2;.          
3ad0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
3ae0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e  .        case FN
3af0: 5f 53 75 62 73 74 72 3a 20 7b 0a 20 20 20 20 20  _Substr: {.     
3b00: 20 20 20 20 20 74 6f 6f 5f 66 65 77 5f 61 72 67       too_few_arg
3b10: 73 20 3d 20 6e 3c 33 3b 0a 20 20 20 20 20 20 20  s = n<3;.       
3b20: 20 20 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73     too_many_args
3b30: 20 3d 20 6e 3e 33 3b 0a 20 20 20 20 20 20 20 20   = n>3;.        
3b40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
3b50: 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75   }.        defau
3b60: 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  lt: break;.     
3b70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 5f   }.      if( no_
3b80: 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20  such_func ){.   
3b90: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
3ba0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
3bb0: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
3bc0: 20 66 75 6e 63 74 69 6f 6e 3a 20 22 2c 20 2d 31   function: ", -1
3bd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 45 78  ,.           pEx
3be0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
3bf0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b  pr->token.n, 0);
3c00: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
3c10: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
3c20: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d   nErr++;.      }
3c30: 65 6c 73 65 20 69 66 28 20 74 6f 6f 5f 6d 61 6e  else if( too_man
3c40: 79 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20  y_args ){.      
3c50: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
3c60: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
3c70: 4d 73 67 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61  Msg, "too many a
3c80: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
3c90: 74 69 6f 6e 20 22 2c 2d 31 2c 0a 20 20 20 20 20  tion ",-1,.     
3ca0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
3cb0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
3cc0: 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c 20 30  en.n, "()", 2, 0
3cd0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
3ce0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3cf0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
3d00: 20 7d 65 6c 73 65 20 69 66 28 20 74 6f 6f 5f 66   }else if( too_f
3d10: 65 77 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20  ew_args ){.     
3d20: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
3d30: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
3d40: 72 4d 73 67 2c 20 22 74 6f 6f 20 66 65 77 20 61  rMsg, "too few a
3d50: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
3d60: 74 69 6f 6e 20 22 2c 2d 31 2c 0a 20 20 20 20 20  tion ",-1,.     
3d70: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
3d80: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
3d90: 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c 20 30  en.n, "()", 2, 0
3da0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
3db0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3dc0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
3dd0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
3de0: 61 67 67 20 29 20 70 45 78 70 72 2d 3e 6f 70 20  agg ) pExpr->op 
3df0: 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  = TK_AGG_FUNCTIO
3e00: 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f  N;.      if( is_
3e10: 61 67 67 20 26 26 20 70 49 73 41 67 67 20 29 20  agg && pIsAgg ) 
3e20: 2a 70 49 73 41 67 67 20 3d 20 31 3b 0a 20 20 20  *pIsAgg = 1;.   
3e30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72     for(i=0; nErr
3e40: 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29  ==0 && i<n; i++)
3e50: 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d  {.        nErr =
3e60: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
3e70: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
3e80: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3e90: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3eb0: 20 20 61 6c 6c 6f 77 41 67 67 20 26 26 20 21 69    allowAgg && !i
3ec0: 73 5f 61 67 67 2c 20 70 49 73 41 67 67 29 3b 0a  s_agg, pIsAgg);.
3ed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3ee0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
3ef0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
3f00: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  eft ){.        n
3f10: 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  Err = sqliteExpr
3f20: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
3f30: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 6c 6c 6f  xpr->pLeft, allo
3f40: 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20  wAgg, pIsAgg);. 
3f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3f60: 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70   nErr==0 && pExp
3f70: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
3f80: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
3f90: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
3fa0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
3fb0: 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73  t, allowAgg, pIs
3fc0: 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Agg);.      }.  
3fd0: 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20      if( nErr==0 
3fe0: 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20  && pExpr->pList 
3ff0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
4000: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
4010: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
4020: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
4030: 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20  or(i=0; nErr==0 
4040: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
4050: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
4060: 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  2 = pExpr->pList
4070: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
4080: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
4090: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
40a0: 50 61 72 73 65 2c 20 70 45 32 2c 20 61 6c 6c 6f  Parse, pE2, allo
40b0: 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20  wAgg, pIsAgg);. 
40c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
40d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
40e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
40f0: 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nErr;.}../*.** 
4100: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
4110: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
4120: 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
4130: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
4140: 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76  ression and leav
4150: 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20  e the result on 
4160: 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b  the top of stack
4170: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4180: 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
4190: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
41a0: 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  xpr){.  Vdbe *v 
41b0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
41c0: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28  .  int op;.  if(
41d0: 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
41e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77  0 ) return;.  sw
41f0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
4200: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  ){.    case TK_P
4210: 4c 55 53 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50  LUS:     op = OP
4220: 5f 41 64 64 3b 20 20 20 20 20 20 62 72 65 61 6b  _Add;      break
4230: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  ;.    case TK_MI
4240: 4e 55 53 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  NUS:    op = OP_
4250: 53 75 62 74 72 61 63 74 3b 20 62 72 65 61 6b 3b  Subtract; break;
4260: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
4270: 52 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4d  R:     op = OP_M
4280: 75 6c 74 69 70 6c 79 3b 20 62 72 65 61 6b 3b 0a  ultiply; break;.
4290: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
42a0: 48 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44 69  H:    op = OP_Di
42b0: 76 69 64 65 3b 20 20 20 62 72 65 61 6b 3b 0a 20  vide;   break;. 
42c0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
42d0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 6e 64       op = OP_And
42e0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
42f0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
4300: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 72 3b 20      op = OP_Or; 
4310: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4320: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
4330: 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20     op = OP_Lt;  
4340: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4350: 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20  case TK_LE:     
4360: 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20    op = OP_Le;   
4370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
4380: 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
4390: 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20   op = OP_Gt;    
43a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
43b0: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20  se TK_GE:       
43c0: 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20  op = OP_Ge;     
43d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
43e0: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f  e TK_NE:       o
43f0: 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20  p = OP_Ne;      
4400: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4410: 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70   TK_EQ:       op
4420: 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20   = OP_Eq;       
4430: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
4440: 54 4b 5f 4c 49 4b 45 3a 20 20 20 20 20 6f 70 20  TK_LIKE:     op 
4450: 3d 20 4f 50 5f 4c 69 6b 65 3b 20 20 20 20 20 62  = OP_Like;     b
4460: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
4470: 4b 5f 47 4c 4f 42 3a 20 20 20 20 20 6f 70 20 3d  K_GLOB:     op =
4480: 20 4f 50 5f 47 6c 6f 62 3b 20 20 20 20 20 62 72   OP_Glob;     br
4490: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
44a0: 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20  _ISNULL:   op = 
44b0: 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65  OP_IsNull;   bre
44c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
44d0: 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f  NOTNULL:  op = O
44e0: 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61  P_NotNull;  brea
44f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
4500: 4f 54 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  OT:      op = OP
4510: 5f 4e 6f 74 3b 20 20 20 20 20 20 62 72 65 61 6b  _Not;      break
4520: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  ;.    case TK_UM
4530: 49 4e 55 53 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  INUS:   op = OP_
4540: 4e 65 67 61 74 69 76 65 3b 20 62 72 65 61 6b 3b  Negative; break;
4550: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
4560: 41 4e 44 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42  AND:   op = OP_B
4570: 69 74 41 6e 64 3b 20 20 20 62 72 65 61 6b 3b 0a  itAnd;   break;.
4580: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
4590: 52 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69  R:    op = OP_Bi
45a0: 74 4f 72 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  tOr;    break;. 
45b0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
45c0: 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69 74  T:   op = OP_Bit
45d0: 4e 6f 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  Not;   break;.  
45e0: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
45f0: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68 69 66  :   op = OP_Shif
4600: 74 4c 65 66 74 3b 20 20 62 72 65 61 6b 3b 0a 20  tLeft;  break;. 
4610: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
4620: 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68 69  T:   op = OP_Shi
4630: 66 74 52 69 67 68 74 3b 20 62 72 65 61 6b 3b 0a  ftRight; break;.
4640: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
4650: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52 65        op = OP_Re
4660: 6d 61 69 6e 64 65 72 3b 20 20 62 72 65 61 6b 3b  mainder;  break;
4670: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
4680: 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  eak;.  }.  switc
4690: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
46a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
46b0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
46c0: 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 29  pParse->useAgg )
46d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
46e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
46f0: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
4700: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d  ->iAgg);.      }
4710: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
4720: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
4730: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4740: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
4750: 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  mn, pExpr->iTabl
4760: 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
4770: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
4780: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
4790: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
47a0: 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69 54 61  ecno, pExpr->iTa
47b0: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ble, 0);.      }
47c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
47d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
47e0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
47f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4800: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
4810: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4820: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
4830: 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  , -1, pExpr->tok
4840: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
4850: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  en.n);.      bre
4860: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4870: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
4880: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
4890: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
48a0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
48b0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
48c0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
48d0: 20 61 64 64 72 2c 20 70 45 78 70 72 2d 3e 74 6f   addr, pExpr->to
48e0: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
48f0: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72  ken.n);.      br
4900: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4910: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
4920: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20  .      int addr 
4930: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
4940: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
4950: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
4960: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
4970: 76 2c 20 61 64 64 72 2c 20 70 45 78 70 72 2d 3e  v, addr, pExpr->
4980: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
4990: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
49a0: 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74  sqliteVdbeDequot
49b0: 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  eP3(v, addr);.  
49c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
49d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
49e0: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
49f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4a00: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
4a10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4a20: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
4a30: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
4a40: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
4a50: 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
4a60: 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
4a70: 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
4a80: 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
4a90: 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
4aa0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
4ab0: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
4ac0: 4c 41 53 48 3a 20 7b 0a 20 20 20 20 20 20 73 71  LASH: {.      sq
4ad0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
4ae0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
4af0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
4b00: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
4b10: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
4b20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4b30: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
4b40: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
4b50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4b60: 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
4b70: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
4b80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
4b90: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
4ba0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
4bb0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
4bc0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
4bd0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
4be0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4bf0: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
4c00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4c10: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
4c20: 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  NCAT: {.      sq
4c30: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
4c40: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
4c50: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
4c60: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
4c70: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
4c80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4c90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e  eAddOp(v, OP_Con
4ca0: 63 61 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  cat, 2, 0);.    
4cb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4cc0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
4cd0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
4ce0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
4cf0: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
4d00: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
4d10: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 0a     case TK_EQ: .
4d20: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45      case TK_LIKE
4d30: 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  : .    case TK_G
4d40: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
4d50: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 73 71 6c   dest;.      sql
4d60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4d70: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30  OP_Integer, 1, 0
4d80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
4d90: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
4da0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
4db0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
4dc0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
4dd0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
4de0: 20 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65 56    dest = sqliteV
4df0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4e00: 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 2;.      sql
4e10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4e20: 6f 70 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  op, 0, dest);.  
4e30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4e40: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
4e50: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , -1, 0);.      
4e60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4e70: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
4e80: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
4e90: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
4ea0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
4eb0: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
4ec0: 46 4c 4f 41 54 20 7c 7c 20 70 45 78 70 72 2d 3e  FLOAT || pExpr->
4ed0: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
4ee0: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
4ef0: 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 45 78   Token *p = &pEx
4f00: 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pr->pLeft->token
4f10: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
4f20: 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  z = sqliteMalloc
4f30: 28 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20  ( p->n + 2 );.  
4f40: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 2c        sprintf(z,
4f50: 20 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20   "-%.*s", p->n, 
4f60: 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 73  p->z);.        s
4f70: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4f80: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
4f90: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
4fa0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
4fb0: 2c 20 2d 31 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29  , -1, z, p->n+1)
4fc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4fd0: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  Free(z);.       
4fe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4ff0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
5000: 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f  rough into TK_NO
5010: 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  T */.    }.    c
5020: 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
5030: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
5040: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
5050: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
5060: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
5070: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5080: 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29  dOp(v, op, 0, 0)
5090: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
50a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
50b0: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
50c0: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
50d0: 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a        int dest;.
50e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
50f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
5100: 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ger, 1, 0);.    
5110: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
5120: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
5130: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65  pLeft);.      de
5140: 73 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  st = sqliteVdbeC
5150: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
5160: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  2;.      sqliteV
5170: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
5180: 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
5190: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
51a0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
51b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
51c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
51d0: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
51e0: 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  N: {.      sqlit
51f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5200: 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70  _AggGet, 0, pExp
5210: 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20  r->iAgg);.      
5220: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
5230: 6d 6e 3d 3d 46 4e 5f 41 76 67 20 29 7b 0a 20 20  mn==FN_Avg ){.  
5240: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
5250: 61 72 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74 3e  arse->iAggCount>
5260: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 69 41  =0 && pParse->iA
5270: 67 67 43 6f 75 6e 74 3c 70 50 61 72 73 65 2d 3e  ggCount<pParse->
5280: 6e 41 67 67 20 29 3b 0a 20 20 20 20 20 20 20 20  nAgg );.        
5290: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
52a0: 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c  v, OP_AggGet, 0,
52b0: 20 70 50 61 72 73 65 2d 3e 69 41 67 67 43 6f 75   pParse->iAggCou
52c0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
52d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
52e0: 4f 50 5f 44 69 76 69 64 65 2c 20 30 2c 20 30 29  OP_Divide, 0, 0)
52f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5300: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5310: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
5320: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  N: {.      int i
5330: 64 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  d = pExpr->iColu
5340: 6d 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70  mn;.      int op
5350: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
5360: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
5370: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
5380: 69 73 74 3b 0a 20 20 20 20 20 20 73 77 69 74 63  ist;.      switc
5390: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 20 20 20  h( id ){.       
53a0: 20 63 61 73 65 20 46 4e 5f 4d 69 6e 3a 20 0a 20   case FN_Min: . 
53b0: 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4d         case FN_M
53c0: 61 78 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ax: {.          
53d0: 6f 70 20 3d 20 69 64 3d 3d 46 4e 5f 4d 69 6e 20  op = id==FN_Min 
53e0: 3f 20 4f 50 5f 4d 69 6e 20 3a 20 4f 50 5f 4d 61  ? OP_Min : OP_Ma
53f0: 78 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  x;.          for
5400: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
5410: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5420: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
5430: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
5440: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
5450: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
5460: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
5470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
5480: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
5490: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
54a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
54b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
54c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
54d0: 20 20 20 63 61 73 65 20 46 4e 5f 41 62 73 3a 20     case FN_Abs: 
54e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
54f0: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
5500: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  e, pList->a[0].p
5510: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
5520: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5530: 28 76 2c 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c  (v, OP_AbsValue,
5540: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
5550: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5560: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
5570: 46 4e 5f 52 6f 75 6e 64 3a 20 7b 0a 20 20 20 20  FN_Round: {.    
5580: 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
5590: 3e 6e 45 78 70 72 3d 3d 32 20 29 7b 0a 20 20 20  >nExpr==2 ){.   
55a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45           sqliteE
55b0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
55c0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
55d0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  r);.          }e
55e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
55f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5600: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
5610: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
5620: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
5630: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
5640: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  se, pList->a[0].
5650: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
5660: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5670: 70 28 76 2c 20 4f 50 5f 50 72 65 63 69 73 69 6f  p(v, OP_Precisio
5680: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
5690: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
56a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
56b0: 65 20 46 4e 5f 4c 65 6e 67 74 68 3a 20 7b 0a 20  e FN_Length: {. 
56c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45           sqliteE
56d0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
56e0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
56f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
5700: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5710: 20 4f 50 5f 53 74 72 6c 65 6e 2c 20 30 2c 20 30   OP_Strlen, 0, 0
5720: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
5730: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5740: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 53 75        case FN_Su
5750: 62 73 74 72 3a 20 7b 0a 20 20 20 20 20 20 20 20  bstr: {.        
5760: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
5770: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
5780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
5790: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
57a0: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
57b0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
57c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
57d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
57e0: 20 4f 50 5f 53 75 62 73 74 72 2c 20 30 2c 20 30   OP_Substr, 0, 0
57f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
5800: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5810: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
5820: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
5830: 6e 27 74 20 68 61 70 70 65 6e 21 20 2a 2f 0a 20  n't happen! */. 
5840: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5850: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5860: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5870: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
5880: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
5890: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
58a0: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
58b0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
58c0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
58d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
58e0: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
58f0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73  nt addr;.      s
5900: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5910: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
5920: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5930: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
5940: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
5950: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
5960: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
5970: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 66  ddr(v);.      if
5980: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
5990: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
59a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
59b0: 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
59c0: 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 32 29 3b  iTable, addr+2);
59d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
59e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
59f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 46  AddOp(v, OP_SetF
5a00: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
5a10: 62 6c 65 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  ble, addr+2);.  
5a20: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
5a30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5a40: 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29  P_AddImm, -1, 0)
5a50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5a60: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
5a70: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
5a80: 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69    int lbl = sqli
5a90: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
5aa0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
5ab0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5ac0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
5ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5ae0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
5af0: 70 45 78 70 72 2c 20 6c 62 6c 29 3b 0a 20 20 20  pExpr, lbl);.   
5b00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5b10: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
5b20: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
5b30: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
5b40: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20  abel(v, lbl);.  
5b50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5b60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
5b70: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
5b80: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
5b90: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
5ba0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5bb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  }.  }.  return;.
5bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5bd0: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
5be0: 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
5bf0: 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
5c00: 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
5c10: 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
5c20: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
5c30: 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
5c40: 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
5c50: 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
5c60: 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
5c70: 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
5c80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70  /.void sqliteExp
5c90: 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
5ca0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
5cb0: 70 72 2c 20 69 6e 74 20 64 65 73 74 29 7b 0a 20  pr, int dest){. 
5cc0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
5cd0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
5ce0: 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d  op = 0;.  if( v=
5cf0: 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29  =0 || pExpr==0 )
5d00: 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63   return;.  switc
5d10: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
5d20: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20      case TK_LT: 
5d30: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74        op = OP_Lt
5d40: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
5d50: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
5d60: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b       op = OP_Le;
5d70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5d80: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20    case TK_GT:   
5d90: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20      op = OP_Gt; 
5da0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5db0: 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20   case TK_GE:    
5dc0: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20     op = OP_Ge;  
5dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5de0: 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20  case TK_NE:     
5df0: 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20    op = OP_Ne;   
5e00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5e10: 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20  ase TK_EQ:      
5e20: 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20   op = OP_Eq;    
5e30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
5e40: 73 65 20 54 4b 5f 4c 49 4b 45 3a 20 20 20 20 20  se TK_LIKE:     
5e50: 6f 70 20 3d 20 4f 50 5f 4c 69 6b 65 3b 20 20 20  op = OP_Like;   
5e60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5e70: 65 20 54 4b 5f 47 4c 4f 42 3a 20 20 20 20 20 6f  e TK_GLOB:     o
5e80: 70 20 3d 20 4f 50 5f 47 6c 6f 62 3b 20 20 20 20  p = OP_Glob;    
5e90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5ea0: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70   TK_ISNULL:   op
5eb0: 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20   = OP_IsNull;   
5ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5ed0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20  TK_NOTNULL:  op 
5ee0: 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62  = OP_NotNull;  b
5ef0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
5f00: 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  t:  break;.  }. 
5f10: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
5f20: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
5f30: 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
5f40: 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 56 64  nt d2 = sqliteVd
5f50: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
5f60: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5f70: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
5f80: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
5f90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
5fa0: 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
5fb0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
5fc0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
5fd0: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
5fe0: 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
5ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6000: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
6010: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
6020: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
6030: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
6040: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
6050: 74 65 45 78 70 72 49 66 54 72 75 65 28 70 50 61  teExprIfTrue(pPa
6060: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
6070: 68 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ht, dest);.     
6080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6090: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
60a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
60b0: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
60c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
60d0: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
60e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
60f0: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
6100: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
6110: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
6120: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
6130: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
6140: 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73  e TK_EQ:.    cas
6150: 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63  e TK_LIKE:.    c
6160: 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20  ase TK_GLOB: {. 
6170: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
6180: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
6190: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
61a0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
61b0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
61c0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71  Right);.      sq
61d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
61e0: 20 6f 70 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20   op, 0, dest);. 
61f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6200: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
6210: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
6220: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
6230: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
6240: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
6250: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
6260: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6270: 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74 29 3b 0a  , op, 0, dest);.
6280: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6290: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
62a0: 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  N: {.      sqlit
62b0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
62c0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
62d0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
62e0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
62f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6300: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  ddOp(v, OP_Found
6310: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
6320: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
6330: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
6340: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6350: 4f 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45 78  OP_SetFound, pEx
6360: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
6370: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6390: 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
63a0: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  N: {.      int l
63b0: 62 6c 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  bl = sqliteVdbeM
63c0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
63d0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
63e0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
63f0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
6400: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6410: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
6420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
6430: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
6440: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
6450: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  .pExpr);.      s
6460: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6470: 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 6c 62 6c 29  , OP_Lt, 0, lbl)
6480: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
6490: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
64a0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
64b0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
64c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
64d0: 76 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 64 65 73  v, OP_Le, 0, des
64e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
64f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6500: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
6510: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6520: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
6530: 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lbl);.      sqli
6540: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6550: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
6560: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6570: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
6580: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
6590: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
65a0: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
65b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
65c0: 5f 49 66 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20  _If, 0, dest);. 
65d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
65e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
65f0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
6600: 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
6610: 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
6620: 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
6630: 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
6640: 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
6650: 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
6660: 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
6670: 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
6680: 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
6690: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
66a0: 72 75 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rue..*/.void sql
66b0: 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 50  iteExprIfFalse(P
66c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
66d0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
66e0: 65 73 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  est){.  Vdbe *v 
66f0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
6700: 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
6710: 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
6720: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
6730: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
6740: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
6750: 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20  TK_LT:       op 
6760: 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20 20 20 62  = OP_Ge;       b
6770: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
6780: 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_LE:       op =
6790: 20 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62 72   OP_Gt;       br
67a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
67b0: 5f 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _GT:       op = 
67c0: 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65  OP_Le;       bre
67d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
67e0: 47 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  GE:       op = O
67f0: 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65 61  P_Lt;       brea
6800: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
6810: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
6820: 5f 45 71 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Eq;       break
6830: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
6840: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
6850: 4e 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Ne;       break;
6860: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b  .    case TK_LIK
6870: 45 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c  E:     op = OP_L
6880: 69 6b 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ike;     break;.
6890: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42      case TK_GLOB
68a0: 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 6c  :     op = OP_Gl
68b0: 6f 62 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ob;     break;. 
68c0: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
68d0: 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74  L:   op = OP_Not
68e0: 4e 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20  Null;  break;.  
68f0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
6900: 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75  L:  op = OP_IsNu
6910: 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ll;   break;.   
6920: 20 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b   default:  break
6930: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
6940: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
6950: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
6960: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
6970: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
6980: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
6990: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
69a0: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
69b0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
69c0: 68 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ht, dest);.     
69d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
69e0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
69f0: 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
6a00: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
6a10: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
6a20: 69 74 65 45 78 70 72 49 66 54 72 75 65 28 70 50  iteExprIfTrue(pP
6a30: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
6a40: 66 74 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  ft, d2);.      s
6a50: 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65  qliteExprIfFalse
6a60: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
6a70: 70 52 69 67 68 74 2c 20 64 65 73 74 29 3b 0a 20  pRight, dest);. 
6a80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
6a90: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
6aa0: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
6ab0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6ac0: 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
6ad0: 73 71 6c 69 74 65 45 78 70 72 49 66 54 72 75 65  sqliteExprIfTrue
6ae0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
6af0: 70 4c 65 66 74 2c 20 64 65 73 74 29 3b 0a 20 20  pLeft, dest);.  
6b00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6b10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
6b20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
6b30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
6b40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
6b50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
6b60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
6b70: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
6b80: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
6b90: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
6ba0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
6bb0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
6bc0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
6bd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6be0: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74  p(v, op, 0, dest
6bf0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6c00: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
6c10: 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63 61 73 65  K_LIKE:.    case
6c20: 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_GLOB: {.    
6c30: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6c40: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
6c50: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
6c60: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
6c70: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
6c80: 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ht);.      sqlit
6c90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
6ca0: 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
6cb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6cc0: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
6cd0: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
6ce0: 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
6cf0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
6d00: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
6d10: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
6d20: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
6d30: 70 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 0, dest);.   
6d40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6d50: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
6d60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
6d70: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
6d80: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
6d90: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
6da0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
6db0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6dc0: 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  p(v, OP_NotFound
6dd0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
6de0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
6df0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
6e00: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6e10: 4f 50 5f 53 65 74 4e 6f 74 46 6f 75 6e 64 2c 20  OP_SetNotFound, 
6e20: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
6e30: 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  est);.      }.  
6e40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6e50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
6e60: 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  WEEN: {.      in
6e70: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73 71  t addr;.      sq
6e80: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
6e90: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
6ea0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
6eb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6ec0: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
6ed0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6ee0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
6ef0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
6f00: 72 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  r);.      addr =
6f10: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
6f20: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
6f30: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6f40: 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 61 64  (v, OP_Ge, 0, ad
6f50: 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+3);.      sql
6f60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6f70: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
6f80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6f90: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
6fa0: 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   0, dest);.     
6fb0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
6fc0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
6fd0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
6fe0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6ff0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
7000: 74 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  t, 0, dest);.   
7010: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7020: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
7030: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
7040: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
7050: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7060: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7070: 4e 6f 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Not, 0, 0);.    
7080: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7090: 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 64  p(v, OP_If, 0, d
70a0: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
70b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
70c0: 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20  /*.** Do a deep 
70d0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77  comparison of tw
70e0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  o expression tre
70f0: 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  es.  Return TRUE
7100: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69   (non-zero).** i
7110: 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
7120: 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  ical and return 
7130: 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64 69  FALSE if they di
7140: 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
7150: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78  .*/.int sqliteEx
7160: 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
7170: 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20  pA, Expr *pB){. 
7180: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
7190: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
71a0: 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65  n pB==0;.  }else
71b0: 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20   if( pB==0 ){.  
71c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
71d0: 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
71e0: 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ->op ) return 0;
71f0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 45 78  .  if( !sqliteEx
7200: 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
7210: 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20  eft, pB->pLeft) 
7220: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
7230: 28 20 21 73 71 6c 69 74 65 45 78 70 72 43 6f 6d  ( !sqliteExprCom
7240: 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
7250: 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
7260: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
7270: 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  A->pList ){.    
7280: 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30  if( pB->pList==0
7290: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
72a0: 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e   if( pA->pList->
72b0: 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74  nExpr!=pB->pList
72c0: 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e  ->nExpr ) return
72d0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
72e0: 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45   i<pA->pList->nE
72f0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
7300: 20 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72   if( !sqliteExpr
7310: 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73  Compare(pA->pLis
7320: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  t->a[i].pExpr, p
7330: 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  B->pList->a[i].p
7340: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
7350: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
7360: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
7370: 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29   if( pB->pList )
7380: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
7390: 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53    }.  if( pA->pS
73a0: 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65  elect || pB->pSe
73b0: 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
73c0: 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e  .  if( pA->token
73d0: 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  .z ){.    if( pB
73e0: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72  ->token.z==0 ) r
73f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
7400: 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41   pB->token.n!=pA
7410: 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75  ->token.n ) retu
7420: 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 0;.    if( sq
7430: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70 41 2d  liteStrNICmp(pA-
7440: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f  >token.z, pB->to
7450: 6b 65 6e 2e 7a 2c 20 70 41 2d 3e 74 6f 6b 65 6e  ken.z, pA->token
7460: 2e 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  .n)!=0 ) return 
7470: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7480: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  1;.}../*.** Add 
7490: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
74a0: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
74b0: 67 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 72 65  g[] array and re
74c0: 74 75 72 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a  turn its index..
74d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  */.static int ap
74e0: 70 65 6e 64 41 67 67 49 6e 66 6f 28 50 61 72 73  pendAggInfo(Pars
74f0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
7500: 28 20 28 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  ( (pParse->nAgg 
7510: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
7520: 20 69 6e 74 20 61 6d 74 20 3d 20 70 50 61 72 73   int amt = pPars
7530: 65 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20  e->nAgg + 8;.   
7540: 20 41 67 67 45 78 70 72 20 2a 61 41 67 67 20 3d   AggExpr *aAgg =
7550: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
7560: 50 61 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74  Parse->aAgg, amt
7570: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
7580: 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aAgg[0]));.    i
7590: 66 28 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20  f( aAgg==0 ){.  
75a0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
75b0: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
75c0: 3e 61 41 67 67 20 3d 20 61 41 67 67 3b 0a 20 20  >aAgg = aAgg;.  
75d0: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72  }.  memset(&pPar
75e0: 73 65 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d  se->aAgg[pParse-
75f0: 3e 6e 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nAgg], 0, sizeo
7600: 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30  f(pParse->aAgg[0
7610: 5d 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ]));.  return pP
7620: 61 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a  arse->nAgg++;.}.
7630: 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
7640: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
7650: 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ion looking for 
7660: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
7670: 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76  ons and.** for v
7680: 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65  ariables that ne
7690: 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ed to be added t
76a0: 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
76b0: 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d  gg[] array..** M
76c0: 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ake additional e
76d0: 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50  ntries to the pP
76e0: 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
76f0: 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ay as necessary.
7700: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7710: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
7720: 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
7730: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
7740: 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
7750: 7a 65 64 20 62 79 20 73 71 6c 69 74 65 45 78 70  zed by sqliteExp
7760: 72 52 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e  rResolveIds() an
7770: 64 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  d sqliteExprChec
7780: 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72  k()..**.** If er
7790: 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c  rors are seen, l
77a0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
77b0: 73 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67  ssage in zErrMsg
77c0: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74   and return.** t
77d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
77e0: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
77f0: 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
7800: 72 65 67 61 74 65 73 28 50 61 72 73 65 20 2a 70  regates(Parse *p
7810: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7820: 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
7830: 41 67 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20  AggExpr *aAgg;. 
7840: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a   int nErr = 0;..
7850: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
7860: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
7870: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
7880: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
7890: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41  LUMN: {.      aA
78a0: 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67  gg = pParse->aAg
78b0: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  g;.      for(i=0
78c0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
78d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
78e0: 69 66 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67  if( aAgg[i].isAg
78f0: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
7900: 20 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69        if( aAgg[i
7910: 5d 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ].pExpr->iTable=
7920: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20  =pExpr->iTable. 
7930: 20 20 20 20 20 20 20 20 26 26 20 61 41 67 67 5b          && aAgg[
7940: 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  i].pExpr->iColum
7950: 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
7960: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  n ){.          b
7970: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7990: 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67  ( i>=pParse->nAg
79a0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  g ){.        i =
79b0: 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70   appendAggInfo(p
79c0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
79d0: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
79e0: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   1;.        pPar
79f0: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
7a00: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  g = 0;.        p
7a10: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
7a20: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
7a30: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70      }.      pExp
7a40: 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20  r->iAgg = i;.   
7a50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7a60: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
7a70: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
7a80: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
7a90: 6c 75 6d 6e 3d 3d 46 4e 5f 43 6f 75 6e 74 20 7c  lumn==FN_Count |
7aa0: 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  | pExpr->iColumn
7ab0: 3d 3d 46 4e 5f 41 76 67 20 29 7b 0a 20 20 20 20  ==FN_Avg ){.    
7ac0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
7ad0: 69 41 67 67 43 6f 75 6e 74 3e 3d 30 20 29 7b 0a  iAggCount>=0 ){.
7ae0: 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 70 50            i = pP
7af0: 61 72 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74 3b  arse->iAggCount;
7b00: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7b10: 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 70            i = ap
7b20: 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72  pendAggInfo(pPar
7b30: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  se);.          i
7b40: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
7b50: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  1;.          pPa
7b60: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41  rse->aAgg[i].isA
7b70: 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gg = 1;.        
7b80: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
7b90: 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
7ba0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69         pParse->i
7bb0: 41 67 67 43 6f 75 6e 74 20 3d 20 69 3b 0a 20 20  AggCount = i;.  
7bc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7bd0: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
7be0: 6d 6e 3d 3d 46 4e 5f 43 6f 75 6e 74 20 29 7b 0a  mn==FN_Count ){.
7bf0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7c00: 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
7c10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7c20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7c30: 20 20 20 20 61 41 67 67 20 3d 20 70 50 61 72 73      aAgg = pPars
7c40: 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66  e->aAgg;.      f
7c50: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
7c60: 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
7c70: 20 20 20 20 20 20 69 66 28 20 21 61 41 67 67 5b        if( !aAgg[
7c80: 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  i].isAgg ) conti
7c90: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
7ca0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61   sqliteExprCompa
7cb0: 72 65 28 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  re(aAgg[i].pExpr
7cc0: 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  , pExpr) ){.    
7cd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7cf0: 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72       if( i>=pPar
7d00: 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20  se->nAgg ){.    
7d10: 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67      i = appendAg
7d20: 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20  gInfo(pParse);. 
7d30: 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29         if( i<0 )
7d40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
7d50: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
7d60: 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20  i].isAgg = 1;.  
7d70: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
7d80: 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45  gg[i].pExpr = pE
7d90: 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xpr;.      }.   
7da0: 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
7db0: 20 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   i;.      break;
7dc0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
7dd0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  lt: {.      if( 
7de0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
7df0: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
7e00: 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65  qliteExprAnalyze
7e10: 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
7e20: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
7e30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7e40: 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70  if( nErr==0 && p
7e50: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
7e60: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
7e70: 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65  qliteExprAnalyze
7e80: 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
7e90: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
7ea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7eb0: 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20   if( nErr==0 && 
7ec0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
7ed0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
7ee0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
7ef0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  xpr;.        int
7f00: 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
7f10: 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20  i=0; nErr==0 && 
7f20: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
7f30: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
7f40: 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
7f50: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
7f60: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
7f70: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
7f80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7f90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7fa0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72    }.  return nEr
7fb0: 72 3b 0a 7d 0a                                   r;.}.