/ Hex Artifact Content
Login

Artifact ecd8267f70f4099b760c3862527a52cdfb768612:


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 37 36 20 32 30 30 32 2f 30 36 2f 32 39 20 30  .76 2002/06/29 0
0220: 32 3a 32 30 3a 30 38 20 64 72 68 20 45 78 70 20  2:20:08 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 23 69 6e 63  qliteInt.h".#inc
0250: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a  lude <ctype.h>..
0260: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
0270: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
0280: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
0290: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
02a0: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
02b0: 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62   this node is ob
02c0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
02d0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65  teMalloc().  The
02e0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
02f0: 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  n.** is responsi
0300: 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
0310: 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65  ure the node eve
0320: 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65  ntually gets fre
0330: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
0340: 69 74 65 45 78 70 72 28 69 6e 74 20 6f 70 2c 20  iteExpr(int op, 
0350: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
0360: 72 20 2a 70 52 69 67 68 74 2c 20 54 6f 6b 65 6e  r *pRight, Token
0370: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
0380: 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20  r *pNew;.  pNew 
0390: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
03a0: 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a  sizeof(Expr) );.
03b0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
03c0: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44  .    sqliteExprD
03d0: 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20  elete(pLeft);.  
03e0: 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
03f0: 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20  te(pRight);.    
0400: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
0410: 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20  pNew->op = op;. 
0420: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
0430: 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  Left;.  pNew->pR
0440: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
0450: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
0460: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d     pNew->token =
0470: 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73   *pToken;.  }els
0480: 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  e{.    pNew->tok
0490: 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 70 4e  en.z = 0;.    pN
04a0: 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b  ew->token.n = 0;
04b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 65 66 74  .  }.  if( pLeft
04c0: 20 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20   && pRight ){.  
04d0: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e    sqliteExprSpan
04e0: 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73  (pNew, &pLeft->s
04f0: 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70  pan, &pRight->sp
0500: 61 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  an);.  }else{.  
0510: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70    pNew->span = p
0520: 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 7d 0a  New->token;.  }.
0530: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
0540: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
0550: 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64  Expr.token field
0560: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
0570: 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e  pression to span
0580: 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74   all.** text bet
0590: 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76  ween the two giv
05a0: 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f  en tokens..*/.vo
05b0: 69 64 20 73 71 6c 69 74 65 45 78 70 72 53 70 61  id sqliteExprSpa
05c0: 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  n(Expr *pExpr, T
05d0: 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b  oken *pLeft, Tok
05e0: 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  en *pRight){.  i
05f0: 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20  f( pExpr ){.    
0600: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
0610: 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 70 45  pLeft->z;.    pE
0620: 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52  xpr->span.n = pR
0630: 69 67 68 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70  ight->n + Addr(p
0640: 52 69 67 68 74 2d 3e 7a 29 20 2d 20 41 64 64 72  Right->z) - Addr
0650: 28 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 7d 0a  (pLeft->z);.  }.
0660: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
0670: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
0680: 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66  ion node for a f
0690: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c  unction with mul
06a0: 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  tiple.** argumen
06b0: 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ts..*/.Expr *sql
06c0: 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  iteExprFunction(
06d0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
06e0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
06f0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
0700: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
0710: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
0720: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
0730: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
0740: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
0750: 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
0760: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  rn 0;.  }.  pNew
0770: 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49  ->op = TK_FUNCTI
0780: 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73  ON;.  pNew->pLis
0790: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 69 66 28  t = pList;.  if(
07a0: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 70   pToken ){.    p
07b0: 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54  New->token = *pT
07c0: 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oken;.  }else{. 
07d0: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a     pNew->token.z
07e0: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
07f0: 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 7d  token.n = 0;.  }
0800: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
0810: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69  }../*.** Recursi
0820: 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65  vely delete an e
0830: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
0840: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78  */.void sqliteEx
0850: 70 72 44 65 6c 65 74 65 28 45 78 70 72 20 2a 70  prDelete(Expr *p
0860: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
0870: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
0880: 3e 70 4c 65 66 74 20 29 20 73 71 6c 69 74 65 45  >pLeft ) sqliteE
0890: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65  xprDelete(p->pLe
08a0: 66 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52  ft);.  if( p->pR
08b0: 69 67 68 74 20 29 20 73 71 6c 69 74 65 45 78 70  ight ) sqliteExp
08c0: 72 44 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68  rDelete(p->pRigh
08d0: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69  t);.  if( p->pLi
08e0: 73 74 20 29 20 73 71 6c 69 74 65 45 78 70 72 4c  st ) sqliteExprL
08f0: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  istDelete(p->pLi
0900: 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  st);.  if( p->pS
0910: 65 6c 65 63 74 20 29 20 73 71 6c 69 74 65 53 65  elect ) sqliteSe
0920: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53  lectDelete(p->pS
0930: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
0940: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
0950: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0960: 67 72 6f 75 70 20 6f 66 20 66 75 6e 63 74 69 6f  group of functio
0970: 6e 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ns are used to t
0980: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 73 74 72  ranslate the str
0990: 69 6e 67 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20  ing.** pointers 
09a0: 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20 65 78 70  of tokens in exp
09b0: 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 6f 6e 65  ression from one
09c0: 20 62 75 66 66 65 72 20 74 6f 20 61 6e 6f 74 68   buffer to anoth
09d0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  er..**.** Normal
09e0: 6c 79 2c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  ly, the Expr.tok
09f0: 65 6e 2e 7a 20 61 6e 64 20 45 78 70 72 2e 73 70  en.z and Expr.sp
0a00: 61 6e 2e 7a 20 66 69 65 6c 64 73 20 70 6f 69 6e  an.z fields poin
0a10: 74 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 6f 72  t into the.** or
0a20: 69 67 69 6e 61 6c 20 69 6e 70 75 74 20 62 75 66  iginal input buf
0a30: 66 65 72 20 6f 66 20 61 6e 20 53 51 4c 20 73 74  fer of an SQL st
0a40: 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 69  atement.  This i
0a50: 73 20 75 73 75 61 6c 6c 79 20 4f 4b 0a 2a 2a 20  s usually OK.** 
0a60: 73 69 6e 63 65 20 74 68 65 20 53 51 4c 20 73 74  since the SQL st
0a70: 61 74 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75  atement is execu
0a80: 74 65 64 20 61 6e 64 20 74 68 65 20 65 78 70 72  ted and the expr
0a90: 65 73 73 69 6f 6e 20 69 73 20 64 65 6c 65 74 65  ession is delete
0aa0: 64 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20  d.** before the 
0ab0: 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20  input buffer is 
0ac0: 66 72 65 65 64 2e 20 20 4d 61 6b 69 6e 67 20 74  freed.  Making t
0ad0: 68 65 20 74 6f 6b 65 6e 73 20 70 6f 69 6e 74 20  he tokens point 
0ae0: 74 6f 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  to the.** origin
0af0: 61 6c 20 69 6e 70 75 74 20 62 75 66 66 65 72 20  al input buffer 
0b00: 73 61 76 65 73 20 6d 61 6e 79 20 63 61 6c 6c 73  saves many calls
0b10: 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64   to malloc() and
0b20: 20 74 68 75 73 20 68 65 6c 70 73 0a 2a 2a 20 74   thus helps.** t
0b30: 68 65 20 6c 69 62 72 61 72 79 20 74 6f 20 72 75  he library to ru
0b40: 6e 20 66 61 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a  n faster. .**.**
0b50: 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 20 77   But sometimes w
0b60: 65 20 6e 65 65 64 20 61 6e 20 65 78 70 72 65 73  e need an expres
0b70: 73 69 6f 6e 20 74 6f 20 70 65 72 73 69 73 74 20  sion to persist 
0b80: 70 61 73 74 20 74 68 65 20 74 69 6d 65 20 77 68  past the time wh
0b90: 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 70 75 74 20  en.** the input 
0ba0: 62 75 66 66 65 72 20 69 73 20 66 72 65 65 64 2e  buffer is freed.
0bb0: 20 20 28 45 78 61 6d 70 6c 65 3a 20 54 68 65 20    (Example: The 
0bc0: 53 45 4c 45 43 54 20 63 6c 61 75 73 65 20 6f 66  SELECT clause of
0bd0: 20 61 0a 2a 2a 20 43 52 45 41 54 45 20 56 49 45   a.** CREATE VIE
0be0: 57 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74  W statement cont
0bf0: 61 69 6e 73 20 65 78 70 72 65 73 73 69 6f 6e 73  ains expressions
0c00: 20 74 68 61 74 20 6d 75 73 74 20 70 65 72 73 69   that must persi
0c10: 73 74 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 69  st for.** the li
0c20: 66 65 20 6f 66 20 74 68 65 20 76 69 65 77 2e 29  fe of the view.)
0c30: 20 20 57 68 65 6e 20 74 68 61 74 20 68 61 70 70    When that happ
0c40: 65 6e 73 20 77 65 20 68 61 76 65 20 74 6f 20 6d  ens we have to m
0c50: 61 6b 65 20 61 0a 2a 2a 20 70 65 72 73 69 73 74  ake a.** persist
0c60: 65 6e 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ent copy of the 
0c70: 69 6e 70 75 74 20 62 75 66 66 65 72 20 61 6e 64  input buffer and
0c80: 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65 20 45   translate the E
0c90: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 0a 2a 2a 20 61  xpr.token.z.** a
0ca0: 6e 64 20 45 78 70 72 2e 73 70 61 6e 2e 7a 20 66  nd Expr.span.z f
0cb0: 69 65 6c 64 73 20 74 6f 20 70 6f 69 6e 74 20 74  ields to point t
0cc0: 6f 20 74 68 65 20 63 6f 70 79 20 72 61 74 68 65  o the copy rathe
0cd0: 72 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6f  r than the .** o
0ce0: 72 69 67 69 6e 61 6c 20 69 6e 70 75 74 20 62 75  riginal input bu
0cf0: 66 66 65 72 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ffer.  The follo
0d00: 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f  wing group of ro
0d10: 75 74 69 6e 65 73 20 68 61 6e 64 6c 65 20 74 68  utines handle th
0d20: 61 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 69 6f  at.** translatio
0d30: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6f 66  n..**.** The "of
0d40: 66 73 65 74 22 20 70 61 72 61 6d 65 74 65 72 20  fset" parameter 
0d50: 69 73 20 74 68 65 20 64 69 73 74 61 6e 63 65 20  is the distance 
0d60: 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
0d70: 6c 20 69 6e 70 75 74 20 62 75 66 66 65 72 0a 2a  l input buffer.*
0d80: 2a 20 74 6f 20 74 68 65 20 70 65 72 73 69 73 74  * to the persist
0d90: 65 6e 74 20 63 6f 70 79 2e 20 20 54 68 65 73 65  ent copy.  These
0da0: 20 72 6f 75 74 69 6e 65 73 20 72 65 63 75 72 73   routines recurs
0db0: 69 76 65 6c 79 20 77 61 6c 6b 20 74 68 65 20 65  ively walk the e
0dc0: 6e 74 69 72 65 0a 2a 2a 20 65 78 70 72 65 73 73  ntire.** express
0dd0: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 73 68 69  ion tree and shi
0de0: 66 74 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 62 79  ft all tokens by
0df0: 20 22 6f 66 66 73 65 74 22 20 61 6d 6f 75 6e 74   "offset" amount
0e00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 6f 72 6b  ..**.** The work
0e10: 20 6f 66 20 66 69 67 75 72 69 6e 67 20 6f 75 74   of figuring out
0e20: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
0e30: 20 22 6f 66 66 73 65 74 22 20 61 6e 64 20 6d 61   "offset" and ma
0e40: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 70 72 65 73  king the.** pres
0e50: 69 73 74 65 6e 74 20 63 6f 70 79 20 6f 66 20 74  istent copy of t
0e60: 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 20  he input buffer 
0e70: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63  is done by the c
0e80: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a  alling routine..
0e90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78  */.void sqliteEx
0ea0: 70 72 4d 6f 76 65 53 74 72 69 6e 67 73 28 45 78  prMoveStrings(Ex
0eb0: 70 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65  pr *p, int offse
0ec0: 74 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  t){.  if( p==0 )
0ed0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
0ee0: 70 2d 3e 73 74 61 74 69 63 54 6f 6b 65 6e 20 29  p->staticToken )
0ef0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6f 6b  {.    if( p->tok
0f00: 65 6e 2e 7a 20 29 20 70 2d 3e 74 6f 6b 65 6e 2e  en.z ) p->token.
0f10: 7a 20 2b 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20  z += offset;.   
0f20: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 29   if( p->span.z )
0f30: 20 70 2d 3e 73 70 61 6e 2e 7a 20 2b 3d 20 6f 66   p->span.z += of
0f40: 66 73 65 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  fset;.  }.  if( 
0f50: 70 2d 3e 70 4c 65 66 74 20 29 20 73 71 6c 69 74  p->pLeft ) sqlit
0f60: 65 45 78 70 72 4d 6f 76 65 53 74 72 69 6e 67 73  eExprMoveStrings
0f70: 28 70 2d 3e 70 4c 65 66 74 2c 20 6f 66 66 73 65  (p->pLeft, offse
0f80: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 69  t);.  if( p->pRi
0f90: 67 68 74 20 29 20 73 71 6c 69 74 65 45 78 70 72  ght ) sqliteExpr
0fa0: 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 2d 3e 70  MoveStrings(p->p
0fb0: 52 69 67 68 74 2c 20 6f 66 66 73 65 74 29 3b 0a  Right, offset);.
0fc0: 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29    if( p->pList )
0fd0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 4d   sqliteExprListM
0fe0: 6f 76 65 53 74 72 69 6e 67 73 28 70 2d 3e 70 4c  oveStrings(p->pL
0ff0: 69 73 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ist, offset);.  
1000: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20 29  if( p->pSelect )
1010: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76   sqliteSelectMov
1020: 65 53 74 72 69 6e 67 73 28 70 2d 3e 70 53 65 6c  eStrings(p->pSel
1030: 65 63 74 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  ect, offset);.}.
1040: 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 4c  void sqliteExprL
1050: 69 73 74 4d 6f 76 65 53 74 72 69 6e 67 73 28 45  istMoveStrings(E
1060: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1070: 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 69  int offset){.  i
1080: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1090: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
10a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
10b0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
10c0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 4d 6f      sqliteExprMo
10d0: 76 65 53 74 72 69 6e 67 73 28 70 4c 69 73 74 2d  veStrings(pList-
10e0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6f 66 66  >a[i].pExpr, off
10f0: 73 65 74 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  set);.  }.}.void
1100: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76   sqliteSelectMov
1110: 65 53 74 72 69 6e 67 73 28 53 65 6c 65 63 74 20  eStrings(Select 
1120: 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20 6f 66  *pSelect, int of
1130: 66 73 65 74 29 7b 0a 20 20 69 66 28 20 70 53 65  fset){.  if( pSe
1140: 6c 65 63 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  lect==0 ) return
1150: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69  ;.  sqliteExprLi
1160: 73 74 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 53  stMoveStrings(pS
1170: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 6f  elect->pEList, o
1180: 66 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  ffset);.  sqlite
1190: 45 78 70 72 4d 6f 76 65 53 74 72 69 6e 67 73 28  ExprMoveStrings(
11a0: 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c  pSelect->pWhere,
11b0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 73 71 6c 69   offset);.  sqli
11c0: 74 65 45 78 70 72 4c 69 73 74 4d 6f 76 65 53 74  teExprListMoveSt
11d0: 72 69 6e 67 73 28 70 53 65 6c 65 63 74 2d 3e 70  rings(pSelect->p
11e0: 47 72 6f 75 70 42 79 2c 20 6f 66 66 73 65 74 29  GroupBy, offset)
11f0: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4d 6f  ;.  sqliteExprMo
1200: 76 65 53 74 72 69 6e 67 73 28 70 53 65 6c 65 63  veStrings(pSelec
1210: 74 2d 3e 70 48 61 76 69 6e 67 2c 20 6f 66 66 73  t->pHaving, offs
1220: 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  et);.  sqliteExp
1230: 72 4c 69 73 74 4d 6f 76 65 53 74 72 69 6e 67 73  rListMoveStrings
1240: 28 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72  (pSelect->pOrder
1250: 42 79 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 73  By, offset);.  s
1260: 71 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76 65 53  qliteSelectMoveS
1270: 74 72 69 6e 67 73 28 70 53 65 6c 65 63 74 2d 3e  trings(pSelect->
1280: 70 50 72 69 6f 72 2c 20 6f 66 66 73 65 74 29 3b  pPrior, offset);
1290: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
12a0: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
12b0: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
12c0: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
12d0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
12e0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
12f0: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
1300: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
1310: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
1320: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
1330: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
1340: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
1350: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
1360: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
1370: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
1380: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
1390: 0a 2a 2a 20 4e 6f 74 65 2c 20 68 6f 77 65 76 65  .** Note, howeve
13a0: 72 2c 20 74 68 61 74 20 74 68 65 20 45 78 70 72  r, that the Expr
13b0: 2e 74 6f 6b 65 6e 2e 7a 20 61 6e 64 20 45 78 70  .token.z and Exp
13c0: 72 2e 73 70 61 6e 2e 7a 20 66 69 65 6c 64 73 20  r.span.z fields 
13d0: 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 73 74 72 69  point to.** stri
13e0: 6e 67 20 73 70 61 63 65 20 74 68 61 74 20 69 73  ng space that is
13f0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 65 70 61 72   allocated separ
1400: 61 74 65 6c 79 20 66 72 6f 6d 20 74 68 65 20 65  ately from the e
1410: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 0a 2a  xpression tree.*
1420: 2a 20 69 74 73 65 6c 66 2e 20 20 54 68 65 73 65  * itself.  These
1430: 20 72 6f 75 74 69 6e 65 73 20 64 6f 20 4e 4f 54   routines do NOT
1440: 20 64 75 70 6c 69 63 61 74 65 20 74 68 61 74 20   duplicate that 
1450: 73 74 72 69 6e 67 20 73 70 61 63 65 2e 0a 2a 2a  string space..**
1460: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
1470: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
1480: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
1490: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 45 78  turn by sqliteEx
14a0: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
14b0: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 75 70 28  sqliteIdListDup(
14c0: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 53 72 63  ), and sqliteSrc
14d0: 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f  ListDup() can no
14e0: 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70  t be further exp
14f0: 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62  anded .** by sub
1500: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
1510: 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65   sqlite*ListAppe
1520: 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  nd() routines..*
1530: 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20  *.** Any tables 
1540: 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74  that the SrcList
1550: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1560: 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
1570: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
1580: 69 74 65 45 78 70 72 44 75 70 28 45 78 70 72 20  iteExprDup(Expr 
1590: 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  *p){.  Expr *pNe
15a0: 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  w;.  if( p==0 ) 
15b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
15c0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
15d0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
15e0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
15f0: 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70  eturn 0;.  memcp
1600: 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f  y(pNew, p, sizeo
1610: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 70 4e 65  f(*pNew));.  pNe
1620: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
1630: 65 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 65 66  eExprDup(p->pLef
1640: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  t);.  pNew->pRig
1650: 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  ht = sqliteExprD
1660: 75 70 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  up(p->pRight);. 
1670: 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73   pNew->pList = s
1680: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70  qliteExprListDup
1690: 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e  (p->pList);.  pN
16a0: 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  ew->pSelect = sq
16b0: 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28 70 2d  liteSelectDup(p-
16c0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74  >pSelect);.  ret
16d0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 45 78 70 72  urn pNew;.}.Expr
16e0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 45 78 70 72  List *sqliteExpr
16f0: 4c 69 73 74 44 75 70 28 45 78 70 72 4c 69 73 74  ListDup(ExprList
1700: 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74   *p){.  ExprList
1710: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
1720: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1730: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
1740: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
1750: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
1760: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
1770: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
1780: 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78  ->nExpr = p->nEx
1790: 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  pr;.  pNew->a = 
17a0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d  sqliteMalloc( p-
17b0: 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d  >nExpr*sizeof(p-
17c0: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
17d0: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 20 72 65 74  pNew->a==0 ) ret
17e0: 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
17f0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
1800: 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  +){.    pNew->a[
1810: 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  i].pExpr = sqlit
1820: 65 45 78 70 72 44 75 70 28 70 2d 3e 61 5b 69 5d  eExprDup(p->a[i]
1830: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 70 4e 65  .pExpr);.    pNe
1840: 77 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  w->a[i].zName = 
1850: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 2d 3e  sqliteStrDup(p->
1860: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
1870: 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 73 6f 72 74   pNew->a[i].sort
1880: 4f 72 64 65 72 20 3d 20 70 2d 3e 61 5b 69 5d 2e  Order = p->a[i].
1890: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70  sortOrder;.    p
18a0: 4e 65 77 2d 3e 61 5b 69 5d 2e 69 73 41 67 67 20  New->a[i].isAgg 
18b0: 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73 41 67 67 3b  = p->a[i].isAgg;
18c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e  .    pNew->a[i].
18d0: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  done = 0;.  }.  
18e0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53  return pNew;.}.S
18f0: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 53 72  rcList *sqliteSr
1900: 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69 73 74  cListDup(SrcList
1910: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
1920: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
1930: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1940: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
1950: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
1960: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
1970: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
1980: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
1990: 3e 6e 53 72 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  >nSrc = p->nSrc;
19a0: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
19b0: 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 53  iteMalloc( p->nS
19c0: 72 63 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  rc*sizeof(p->a[0
19d0: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ]) );.  if( pNew
19e0: 2d 3e 61 3d 3d 30 20 26 26 20 70 2d 3e 6e 53 72  ->a==0 && p->nSr
19f0: 63 20 21 3d 20 30 20 29 20 72 65 74 75 72 6e 20  c != 0 ) return 
1a00: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
1a10: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
1a20: 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 4e     pNew->a[i].zN
1a30: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
1a40: 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  up(p->a[i].zName
1a50: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69  );.    pNew->a[i
1a60: 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ].zAlias = sqlit
1a70: 65 53 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e  eStrDup(p->a[i].
1a80: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
1a90: 77 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65  w->a[i].jointype
1aa0: 20 3d 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74   = p->a[i].joint
1ab0: 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ype;.    pNew->a
1ac0: 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20  [i].pTab = 0;.  
1ad0: 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 70 53 65    pNew->a[i].pSe
1ae0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53 65 6c  lect = sqliteSel
1af0: 65 63 74 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 70  ectDup(p->a[i].p
1b00: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65  Select);.    pNe
1b10: 77 2d 3e 61 5b 69 5d 2e 70 4f 6e 20 3d 20 73 71  w->a[i].pOn = sq
1b20: 6c 69 74 65 45 78 70 72 44 75 70 28 70 2d 3e 61  liteExprDup(p->a
1b30: 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e  [i].pOn);.    pN
1b40: 65 77 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 20  ew->a[i].pUsing 
1b50: 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 75  = sqliteIdListDu
1b60: 70 28 70 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67  p(p->a[i].pUsing
1b70: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1b80: 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a  pNew;.}.IdList *
1b90: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 75 70 28  sqliteIdListDup(
1ba0: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
1bb0: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
1bc0: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
1bd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
1be0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
1bf0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
1c00: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
1c10: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1c20: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
1c30: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
1c40: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d  sqliteMalloc( p-
1c50: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
1c60: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
1c70: 65 77 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75 72  ew->a==0 ) retur
1c80: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
1c90: 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  i<p->nId; i++){.
1ca0: 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a      pNew->a[i].z
1cb0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
1cc0: 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  Dup(p->a[i].zNam
1cd0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  e);.    pNew->a[
1ce0: 69 5d 2e 69 64 78 20 3d 20 70 2d 3e 61 5b 69 5d  i].idx = p->a[i]
1cf0: 2e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  .idx;.  }.  retu
1d00: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
1d10: 74 20 2a 73 71 6c 69 74 65 53 65 6c 65 63 74 44  t *sqliteSelectD
1d20: 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  up(Select *p){. 
1d30: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
1d40: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1d50: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
1d60: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
1d70: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
1d80: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
1d90: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44  n 0;.  pNew->isD
1da0: 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
1db0: 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d  istinct;.  pNew-
1dc0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
1dd0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70  ExprListDup(p->p
1de0: 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  EList);.  pNew->
1df0: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 53 72 63  pSrc = sqliteSrc
1e00: 4c 69 73 74 44 75 70 28 70 2d 3e 70 53 72 63 29  ListDup(p->pSrc)
1e10: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
1e20: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70   = sqliteExprDup
1e30: 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70  (p->pWhere);.  p
1e40: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
1e50: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75  sqliteExprListDu
1e60: 70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  p(p->pGroupBy);.
1e70: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
1e80: 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  = sqliteExprDup(
1e90: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 70  p->pHaving);.  p
1ea0: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
1eb0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75  sqliteExprListDu
1ec0: 70 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  p(p->pOrderBy);.
1ed0: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
1ee0: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  op;.  pNew->pPri
1ef0: 6f 72 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  or = sqliteSelec
1f00: 74 44 75 70 28 70 2d 3e 70 50 72 69 6f 72 29 3b  tDup(p->pPrior);
1f10: 0a 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d 69 74 20  .  pNew->nLimit 
1f20: 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 70  = p->nLimit;.  p
1f30: 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 70  New->nOffset = p
1f40: 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65  ->nOffset;.  pNe
1f50: 77 2d 3e 7a 53 65 6c 65 63 74 20 3d 20 30 3b 0a  w->zSelect = 0;.
1f60: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
1f70: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
1f80: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1f90: 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72  e end of an expr
1fa0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66  ession list.  If
1fb0: 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69   pList is.** ini
1fc0: 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65  tially NULL, the
1fd0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65  n create a new e
1fe0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
1ff0: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
2000: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
2010: 64 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  d(ExprList *pLis
2020: 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  t, Expr *pExpr, 
2030: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
2040: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
2050: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
2060: 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
2070: 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  oc( sizeof(ExprL
2080: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
2090: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
20a0: 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
20b0: 74 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20  te(pExpr);.     
20c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
20d0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73  .  }.  if( (pLis
20e0: 74 2d 3e 6e 45 78 70 72 20 26 20 37 29 3d 3d 30  t->nExpr & 7)==0
20f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
2100: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 38  pList->nExpr + 8
2110: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  ;.    struct Exp
2120: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
2130: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61     a = sqliteRea
2140: 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 6e  lloc(pList->a, n
2150: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
2160: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
2170: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2180: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 45  iteExprDelete(pE
2190: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
21a0: 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a  rn pList;.    }.
21b0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
21c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
21d0: 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20  r || pName ){.  
21e0: 20 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78    i = pList->nEx
21f0: 70 72 2b 2b 3b 0a 20 20 20 20 70 4c 69 73 74 2d  pr++;.    pList-
2200: 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45  >a[i].pExpr = pE
2210: 78 70 72 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  xpr;.    pList->
2220: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[i].zName = 0;.
2230: 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b      if( pName ){
2240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
2250: 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e  NString(&pList->
2260: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[i].zName, pNam
2270: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
2280: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2290: 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61  Dequote(pList->a
22a0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
22b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
22c0: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  List;.}../*.** D
22d0: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
22e0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
22f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45  .*/.void sqliteE
2300: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78  xprListDelete(Ex
2310: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
2320: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
2330: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
2340: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2350: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
2360: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  ){.    sqliteExp
2370: 72 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61  rDelete(pList->a
2380: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2390: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
23a0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
23b0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
23c0: 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
23d0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
23e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
23f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
2400: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
2410: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
2420: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64   constant.** and
2430: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
2440: 73 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  s variables..**.
2450: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
2460: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
2470: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
2480: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
2490: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
24a0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
24b0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
24c0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
24d0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
24e0: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
24f0: 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72 49  .int sqliteExprI
2500: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
2510: 70 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  p){.  switch( p-
2520: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
2530: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
2540: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
2550: 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20  ase TK_DOT:.    
2560: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
2570: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
2580: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e        return p->
2590: 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27  token.z[0]=='\''
25a0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
25b0: 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20  TEGER:.    case 
25c0: 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20  TK_FLOAT:.      
25d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 64 65  return 1;.    de
25e0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
25f0: 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 21  f( p->pLeft && !
2600: 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73  sqliteExprIsCons
2610: 74 61 6e 74 28 70 2d 3e 70 4c 65 66 74 29 20 29  tant(p->pLeft) )
2620: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2630: 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 26   if( p->pRight &
2640: 26 20 21 73 71 6c 69 74 65 45 78 70 72 49 73 43  & !sqliteExprIsC
2650: 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 52 69 67 68  onstant(p->pRigh
2660: 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
2670: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 73       if( p->pLis
2680: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
2690: 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
26a0: 69 3d 30 3b 20 69 3c 70 2d 3e 70 4c 69 73 74 2d  i=0; i<p->pList-
26b0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
26c0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
26d0: 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  iteExprIsConstan
26e0: 74 28 70 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  t(p->pList->a[i]
26f0: 2e 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e  .pExpr) ) return
2700: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
2710: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2720: 72 6e 20 70 2d 3e 70 4c 65 66 74 21 3d 30 20 7c  rn p->pLeft!=0 |
2730: 7c 20 70 2d 3e 70 52 69 67 68 74 21 3d 30 20 7c  | p->pRight!=0 |
2740: 7c 20 28 70 2d 3e 70 4c 69 73 74 20 26 26 20 70  | (p->pList && p
2750: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ->pList->nExpr>0
2760: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2770: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2780: 2a 20 49 66 20 74 68 65 20 67 69 76 65 6e 20 65  * If the given e
2790: 78 70 72 65 73 73 69 6f 6e 20 63 6f 64 65 73 20  xpression codes 
27a0: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
27b0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
27c0: 20 70 75 74 0a 2a 2a 20 74 68 65 20 76 61 6c 75   put.** the valu
27d0: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
27e0: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
27f0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2800: 69 73 20 6e 6f 74 20 61 6e 0a 2a 2a 20 69 6e 74  is not an.** int
2810: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61  eger, return 0 a
2820: 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65  nd leave *pValue
2830: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
2840: 6e 74 20 73 71 6c 69 74 65 45 78 70 72 49 73 49  nt sqliteExprIsI
2850: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
2860: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
2870: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
2880: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
2890: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2a 70  EGER: {.      *p
28a0: 56 61 6c 75 65 20 3d 20 61 74 6f 69 28 70 2d 3e  Value = atoi(p->
28b0: 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20  token.z);.      
28c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
28d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
28e0: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  NG: {.      cons
28f0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 2d 3e 74  t char *z = p->t
2900: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
2910: 74 20 6e 20 3d 20 70 2d 3e 74 6f 6b 65 6e 2e 6e  t n = p->token.n
2920: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20  ;.      if( n>0 
2930: 26 26 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20  && z[0]=='-' ){ 
2940: 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20  z++; n--; }.    
2950: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
2960: 2a 7a 20 26 26 20 69 73 64 69 67 69 74 28 2a 7a  *z && isdigit(*z
2970: 29 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d  ) ){ z++; n--; }
2980: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
2990: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  ){.        *pVal
29a0: 75 65 20 3d 20 61 74 6f 69 28 70 2d 3e 74 6f 6b  ue = atoi(p->tok
29b0: 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 72  en.z);.        r
29c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
29d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
29f0: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
2a00: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
2a10: 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74   sqliteExprIsInt
2a20: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  eger(p->pLeft, &
2a30: 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  v) ){.        *p
2a40: 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20  Value = -v;.    
2a50: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2a60: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
2a70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
2a80: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
2a90: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2aa0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2ab0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
2ac0: 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
2ad0: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
2ae0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49 73 52 6f  /.int sqliteIsRo
2af0: 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  wid(const char *
2b00: 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  z){.  if( sqlite
2b10: 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
2b20: 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
2b30: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
2b40: 65 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57  eStrICmp(z, "ROW
2b50: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
2b60: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
2b70: 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
2b80: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
2b90: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2ba0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2bb0: 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72  ne walks an expr
2bc0: 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20  ession tree and 
2bd0: 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e  resolves referen
2be0: 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20  ces to.** table 
2bf0: 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20  columns.  Nodes 
2c00: 6f 66 20 74 68 65 20 66 6f 72 6d 20 49 44 2e 49  of the form ID.I
2c10: 44 20 6f 72 20 49 44 20 72 65 73 6f 6c 76 65 20  D or ID resolve 
2c20: 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  into an.** index
2c30: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e   to the table in
2c40: 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20   the table list 
2c50: 61 6e 64 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66  and a column off
2c60: 73 65 74 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78  set.  The .** Ex
2c70: 70 72 2e 6f 70 63 6f 64 65 20 66 6f 72 20 73 75  pr.opcode for su
2c80: 63 68 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e  ch nodes is chan
2c90: 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  ged to TK_COLUMN
2ca0: 2e 20 20 54 68 65 20 45 78 70 72 2e 69 54 61 62  .  The Expr.iTab
2cb0: 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 63  le.** value is c
2cc0: 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e  hanged to the in
2cd0: 64 65 78 20 6f 66 20 74 68 65 20 72 65 66 65 72  dex of the refer
2ce0: 65 6e 63 65 64 20 74 61 62 6c 65 20 69 6e 20 70  enced table in p
2cf0: 54 61 62 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20  TabList.** plus 
2d00: 74 68 65 20 22 62 61 73 65 22 20 76 61 6c 75 65  the "base" value
2d10: 2e 20 20 54 68 65 20 62 61 73 65 20 76 61 6c 75  .  The base valu
2d20: 65 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c  e will ultimatel
2d30: 79 20 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20  y become the.** 
2d40: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
2d50: 65 72 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20  er for a cursor 
2d60: 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67  that is pointing
2d70: 20 69 6e 74 6f 20 74 68 65 20 72 65 66 65 72 65   into the refere
2d80: 6e 63 65 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  nced.** table.  
2d90: 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  The Expr.iColumn
2da0: 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65   value is change
2db0: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  d to the index o
2dc0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  f the column .**
2dd0: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
2de0: 65 64 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45  ed table.  The E
2df0: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  xpr.iColumn valu
2e00: 65 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61  e for the specia
2e10: 6c 0a 2a 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d  l.** ROWID colum
2e20: 6e 20 69 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e  n is -1.  Any IN
2e30: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
2e40: 59 20 63 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65  Y column is trie
2e50: 64 20 61 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73  d as an.** alias
2e60: 20 66 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a   for ROWID..**.*
2e70: 2a 20 57 65 20 61 6c 73 6f 20 63 68 65 63 6b 20  * We also check 
2e80: 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
2e90: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
2ea0: 2e 20 20 49 4e 20 63 6f 6d 65 73 20 69 6e 20 74  .  IN comes in t
2eb0: 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a 0a  wo.** forms:.**.
2ec0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78 70  **           exp
2ed0: 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
2ee0: 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ** and.**       
2ef0: 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
2f00: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ECT ...).**.** T
2f10: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73  he first form is
2f20: 20 68 61 6e 64 6c 65 64 20 62 79 20 63 72 65 61   handled by crea
2f30: 74 69 6e 67 20 61 20 73 65 74 20 68 6f 6c 64 69  ting a set holdi
2f40: 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 6f  ng the list.** o
2f50: 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  f allowed values
2f60: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  .  The second fo
2f70: 72 6d 20 63 61 75 73 65 73 20 74 68 65 20 53 45  rm causes the SE
2f80: 4c 45 43 54 20 74 6f 20 67 65 6e 65 72 61 74 65  LECT to generate
2f90: 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79   .** a temporary
2fa0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
2fb0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
2fc0: 6c 6f 6f 6b 73 20 66 6f 72 20 73 63 61 6c 61 72  looks for scalar
2fd0: 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 61 72   SELECTs that ar
2fe0: 65 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  e part of an exp
2ff0: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20 69  ression..** If i
3000: 74 20 66 69 6e 64 73 20 61 6e 79 2c 20 69 74 20  t finds any, it 
3010: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
3020: 6f 20 77 72 69 74 65 20 74 68 65 20 76 61 6c 75  o write the valu
3030: 65 20 6f 66 20 74 68 61 74 20 73 65 6c 65 63 74  e of that select
3040: 0a 2a 2a 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72  .** into a memor
3050: 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 55 6e  y cell..**.** Un
3060: 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 73 20 6f 72  known columns or
3070: 20 74 61 62 6c 65 73 20 70 72 6f 76 6f 6b 65 20   tables provoke 
3080: 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 66  an error.  The f
3090: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a  unction returns.
30a0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
30b0: 20 65 72 72 6f 72 73 20 73 65 65 6e 20 61 6e 64   errors seen and
30c0: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
30d0: 20 6d 65 73 73 61 67 65 20 6f 6e 20 70 50 61 72   message on pPar
30e0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  se->zErrMsg..*/.
30f0: 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72 52 65  int sqliteExprRe
3100: 73 6f 6c 76 65 49 64 73 28 0a 20 20 50 61 72 73  solveIds(.  Pars
3110: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
3120: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
3130: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 62 61  text */.  int ba
3140: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
3150: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
3160: 65 72 20 66 6f 72 20 66 69 72 73 74 20 65 6e 74  er for first ent
3170: 72 79 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a  ry in pTabList *
3180: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
3190: 62 4c 69 73 74 2c 20 2f 2a 20 4c 69 73 74 20 6f  bList, /* List o
31a0: 66 20 74 61 62 6c 65 73 20 75 73 65 64 20 74 6f  f tables used to
31b0: 20 72 65 73 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20   resolve column 
31c0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  names */.  ExprL
31d0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 2f 2a  ist *pEList,  /*
31e0: 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   List of express
31f0: 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 72 65 73  ions used to res
3200: 6f 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20 20 45  olve "AS" */.  E
3210: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
3220: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
3230: 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  ion to be analyz
3240: 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ed. */.){.  if( 
3250: 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 54 61 62  pExpr==0 || pTab
3260: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
3270: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 62 61   0;.  assert( ba
3280: 73 65 2b 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  se+pTabList->nSr
3290: 63 3c 3d 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  c<=pParse->nTab 
32a0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  );.  switch( pEx
32b0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
32c0: 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   Double-quoted s
32d0: 74 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63  trings (ex: "abc
32e0: 22 29 20 61 72 65 20 75 73 65 64 20 61 73 20 69  ") are used as i
32f0: 64 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20  dentifiers if.  
3300: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20    ** possible.  
3310: 4f 74 68 65 72 77 69 73 65 20 74 68 65 79 20 72  Otherwise they r
3320: 65 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73  emain as strings
3330: 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64  .  Single-quoted
3340: 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  .    ** strings 
3350: 28 65 78 3a 20 27 61 62 63 27 29 20 61 72 65 20  (ex: 'abc') are 
3360: 61 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69  always string li
3370: 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20  terals..    */. 
3380: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
3390: 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  G: {.      if( p
33a0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  Expr->token.z[0]
33b0: 3d 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a  =='\'' ) break;.
33c0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
33d0: 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49  ru into the TK_I
33e0: 44 20 63 61 73 65 20 69 66 20 74 68 69 73 20 69  D case if this i
33f0: 73 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  s a double-quote
3400: 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  d string */.    
3410: 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20  }.    /* A lone 
3420: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 72 79  identifier.  Try
3430: 20 61 6e 64 20 6d 61 74 63 68 20 69 74 20 61 73   and match it as
3440: 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
3450: 0a 20 20 20 20 2a 2a 20 20 20 20 20 31 2e 20 20  .    **     1.  
3460: 54 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  To the name of a
3470: 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 6e 65 20 6f   column of one o
3480: 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
3490: 70 54 61 62 4c 69 73 74 0a 20 20 20 20 2a 2a 0a  pTabList.    **.
34a0: 20 20 20 20 2a 2a 20 20 20 20 20 32 2e 20 20 54      **     2.  T
34b0: 6f 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  o the right side
34c0: 20 6f 66 20 61 6e 20 41 53 20 6b 65 79 77 6f 72   of an AS keywor
34d0: 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
34e0: 6c 69 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 20  list of.    **  
34f0: 20 20 20 20 20 20 20 61 20 53 45 4c 45 43 54 20         a SELECT 
3500: 73 74 61 74 65 6d 65 6e 74 2e 20 20 28 46 6f 72  statement.  (For
3510: 20 65 78 61 6d 70 6c 65 2c 20 6d 61 74 63 68 20   example, match 
3520: 61 67 61 69 6e 73 74 20 27 78 27 20 69 6e 0a 20  against 'x' in. 
3530: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 22 53     **         "S
3540: 45 4c 45 43 54 20 61 2b 62 20 41 53 20 27 78 27  ELECT a+b AS 'x'
3550: 20 46 52 4f 4d 20 74 31 22 2e 29 0a 20 20 20 20   FROM t1".).    
3560: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 33 2e  **.    **     3.
3570: 20 20 4f 6e 65 20 6f 66 20 74 68 65 20 73 70 65    One of the spe
3580: 63 69 61 6c 20 6e 61 6d 65 73 20 22 52 4f 57 49  cial names "ROWI
3590: 44 22 2c 20 22 4f 49 44 22 2c 20 6f 72 20 22 5f  D", "OID", or "_
35a0: 52 4f 57 49 44 5f 22 2e 0a 20 20 20 20 2a 2f 0a  ROWID_"..    */.
35b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20      case TK_ID: 
35c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  {.      int cnt 
35d0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  = 0;      /* Num
35e0: 62 65 72 20 6f 66 20 6d 61 74 63 68 65 73 20 2a  ber of matches *
35f0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
3600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3610: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
3620: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
3630: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
3640: 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20  >token.z );.    
3650: 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e    z = sqliteStrN
3660: 44 75 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Dup(pExpr->token
3670: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
3680: 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  .n);.      sqlit
3690: 65 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 20  eDequote(z);.   
36a0: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65     if( z==0 ) re
36b0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f  turn 1;.      fo
36c0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
36d0: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
36e0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
36f0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
3700: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
3710: 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  i].pTab;.       
3720: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 63   if( pTab==0 ) c
3730: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
3740: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
3750: 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Col>0 );.       
3760: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
3770: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
3780: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
3790: 74 65 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  teStrICmp(pTab->
37a0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[j].zName, z
37b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
37c0: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
37d0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
37e0: 61 62 6c 65 20 3d 20 69 20 2b 20 62 61 73 65 3b  able = i + base;
37f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3800: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
3810: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3820: 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74   /* Substitute t
3830: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
3840: 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52   for the INTEGER
3850: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a   PRIMARY KEY */.
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
3870: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
3880: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
3890: 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65   pExpr->dataType
38a0: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d   = SQLITE_SO_NUM
38b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
38c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
38d0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
38e0: 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
38f0: 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61       pExpr->data
3900: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
3910: 6c 5b 6a 5d 2e 73 6f 72 74 4f 72 64 65 72 20 26  l[j].sortOrder &
3920: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d   SQLITE_SO_TYPEM
3930: 41 53 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ASK;.           
3940: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
3950: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
3960: 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
3970: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
3980: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6e    }.      if( cn
3990: 74 3d 3d 30 20 26 26 20 70 45 4c 69 73 74 21 3d  t==0 && pEList!=
39a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
39b0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
39c0: 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e  j=0; j<pEList->n
39d0: 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
39e0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20        char *zAs 
39f0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  = pEList->a[j].z
3a00: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
3a10: 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71  if( zAs!=0 && sq
3a20: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 41 73 2c  liteStrICmp(zAs,
3a30: 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   z)==0 ){.      
3a40: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
3a50: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
3a60: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
3a70: 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
3a80: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
3a90: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
3aa0: 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20 20 20 20  TK_AS;.         
3ab0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
3ac0: 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
3ad0: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
3ae0: 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  = sqliteExprDup(
3af0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
3b00: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  pr);.          }
3b10: 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
3b20: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6e    }.      if( cn
3b30: 74 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 49 73  t==0 && sqliteIs
3b40: 52 6f 77 69 64 28 7a 29 20 29 7b 0a 20 20 20 20  Rowid(z) ){.    
3b50: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
3b60: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
3b70: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
3b80: 20 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20 63   base;.        c
3b90: 6e 74 20 3d 20 31 20 2b 20 28 70 54 61 62 4c 69  nt = 1 + (pTabLi
3ba0: 73 74 2d 3e 6e 53 72 63 3e 31 29 3b 0a 20 20 20  st->nSrc>1);.   
3bb0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
3bc0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
3bd0: 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54      pExpr->dataT
3be0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  ype = SQLITE_SO_
3bf0: 4e 55 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NUM;.      }.   
3c00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
3c10: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d  ;.      if( cnt=
3c20: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 74 6f 6b  =0 && pExpr->tok
3c30: 65 6e 2e 7a 5b 30 5d 21 3d 27 22 27 20 29 7b 0a  en.z[0]!='"' ){.
3c40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
3c50: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
3c60: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
3c70: 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 22 2c 20 2d  uch column: ", -
3c80: 31 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 70  1,  .          p
3c90: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
3ca0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30  Expr->token.n, 0
3cb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
3cc0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3cd0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3ce0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6e 74     }else if( cnt
3cf0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >1 ){.        sq
3d00: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
3d10: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
3d20: 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75   "ambiguous colu
3d30: 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 2d 31 2c 20  mn name: ", -1, 
3d40: 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70   .          pExp
3d50: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
3d60: 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a  r->token.n, 0);.
3d70: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
3d80: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
3d90: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3da0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 0a  }.      break; .
3db0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
3dc0: 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  A table name and
3dd0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 49   column name:  I
3de0: 44 2e 49 44 20 2a 2f 0a 20 20 20 20 63 61 73 65  D.ID */.    case
3df0: 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_DOT: {.     
3e00: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20   int cnt = 0;   
3e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3e20: 62 65 72 20 6f 66 20 6d 61 74 63 68 65 73 20 2a  ber of matches *
3e30: 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 54  /.      int cntT
3e40: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
3e50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
3e60: 74 63 68 69 6e 67 20 74 61 62 6c 65 73 20 2a 2f  tching tables */
3e70: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
3ea0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
3eb0: 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 20 20  Left, *pRight;  
3ec0: 20 20 2f 2a 20 4c 65 66 74 20 61 6e 64 20 72 69    /* Left and ri
3ed0: 67 68 74 20 73 75 62 62 72 61 6e 63 68 65 73 20  ght subbranches 
3ee0: 6f 66 20 74 68 65 20 65 78 70 72 20 2a 2f 0a 20  of the expr */. 
3ef0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4c 65 66 74       char *zLeft
3f00: 2c 20 2a 7a 52 69 67 68 74 3b 20 20 20 20 2f 2a  , *zRight;    /*
3f10: 20 54 65 78 74 20 6f 66 20 61 6e 20 69 64 65 6e   Text of an iden
3f20: 74 69 66 69 65 72 20 2a 2f 0a 0a 20 20 20 20 20  tifier */..     
3f30: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
3f40: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 69  pLeft;.      pRi
3f50: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
3f60: 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
3f70: 74 28 20 70 4c 65 66 74 20 26 26 20 70 4c 65 66  t( pLeft && pLef
3f80: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 26 26 20  t->op==TK_ID && 
3f90: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  pLeft->token.z )
3fa0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3fb0: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
3fc0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 26 26 20 70  ->op==TK_ID && p
3fd0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  Right->token.z )
3fe0: 3b 0a 20 20 20 20 20 20 7a 4c 65 66 74 20 3d 20  ;.      zLeft = 
3ff0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4c  sqliteStrNDup(pL
4000: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c  eft->token.z, pL
4010: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  eft->token.n);. 
4020: 20 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71       zRight = sq
4030: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 52 69 67  liteStrNDup(pRig
4040: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69  ht->token.z, pRi
4050: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  ght->token.n);. 
4060: 20 20 20 20 20 69 66 28 20 7a 4c 65 66 74 3d 3d       if( zLeft==
4070: 30 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 20 29  0 || zRight==0 )
4080: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4090: 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 20  Free(zLeft);.   
40a0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
40b0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  zRight);.       
40c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
40d0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44   }.      sqliteD
40e0: 65 71 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20  equote(zLeft);. 
40f0: 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f       sqliteDequo
4100: 74 65 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  te(zRight);.    
4110: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
4120: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 66 6f 72 28  = -1;.      for(
4130: 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
4140: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
4150: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
4160: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a      char *zTab;.
4170: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
4180: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
4190: 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[i].pTab;.     
41a0: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
41b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
41c0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
41d0: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  >nCol>0 );.     
41e0: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
41f0: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 20 29 7b 0a  >a[i].zAlias ){.
4200: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d            zTab =
4210: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
4220: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
4230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
4240: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
4250: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
4260: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 3d         if( zTab=
4270: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 53 74 72 49  =0 || sqliteStrI
4280: 43 6d 70 28 7a 54 61 62 2c 20 7a 4c 65 66 74 29  Cmp(zTab, zLeft)
4290: 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
42a0: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28          if( 0==(
42b0: 63 6e 74 54 61 62 2b 2b 29 20 29 20 70 45 78 70  cntTab++) ) pExp
42c0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 2b 20  r->iTable = i + 
42d0: 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  base;.        fo
42e0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
42f0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
4300: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
4310: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
4320: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 52 69 67  l[j].zName, zRig
4330: 68 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ht)==0 ){.      
4340: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
4350: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
4360: 69 54 61 62 6c 65 20 3d 20 69 20 2b 20 62 61 73  iTable = i + bas
4370: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
4380: 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  f( j==pTab->iPKe
4390: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
43a0: 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
43b0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
43c0: 65 72 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  er for the INTEG
43d0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
43e0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
43f0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
4400: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
4410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4420: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
4430: 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
4440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4450: 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54      pExpr->dataT
4460: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
4470: 5b 6a 5d 2e 73 6f 72 74 4f 72 64 65 72 20 26 20  [j].sortOrder & 
4480: 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d 41  SQLITE_SO_TYPEMA
4490: 53 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  SK;.          }.
44a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
44b0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77  }..      /* If w
44c0: 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61  e have not alrea
44d0: 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 69 73  dy resolved this
44e0: 20 2a 2e 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c   *.* expression,
44f0: 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 20   then maybe .   
4500: 20 20 20 20 2a 20 69 74 20 69 73 20 61 20 6e 65      * it is a ne
4510: 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69  w.* or old.* tri
4520: 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65  gger argument re
4530: 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20  ference */.     
4540: 20 69 66 28 20 63 6e 74 20 3d 3d 20 30 20 26 26   if( cnt == 0 &&
4550: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
4560: 63 6b 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 20  ck != 0 ){.     
4570: 20 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20     TriggerStack 
4580: 2a 70 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d  *pTriggerStack =
4590: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
45a0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ck;.        int 
45b0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
45c0: 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  f( pTriggerStack
45d0: 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d 31 20 26  ->newIdx != -1 &
45e0: 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  & sqliteStrICmp(
45f0: 22 6e 65 77 22 2c 20 7a 4c 65 66 74 29 20 3d 3d  "new", zLeft) ==
4600: 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   0 ){.          
4610: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
4620: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
4630: 65 77 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20  ewIdx;.         
4640: 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20   cntTab++;.     
4650: 20 20 20 20 20 74 20 3d 20 31 3b 0a 20 20 20 20       t = 1;.    
4660: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
4670: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
4680: 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26 26  >oldIdx != -1 &&
4690: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 22   sqliteStrICmp("
46a0: 6f 6c 64 22 2c 20 7a 4c 65 66 74 29 20 3d 3d 20  old", zLeft) == 
46b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
46c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
46d0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c  TriggerStack->ol
46e0: 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  dIdx;.          
46f0: 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  cntTab++;.      
4700: 20 20 20 20 74 20 3d 20 31 3b 0a 20 20 20 20 20      t = 1;.     
4710: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
4720: 28 20 74 20 29 7b 20 0a 09 20 20 69 6e 74 20 6a  ( t ){ ..  int j
4730: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  ;.          Tabl
4740: 65 20 2a 70 54 61 62 20 3d 20 70 54 72 69 67 67  e *pTab = pTrigg
4750: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20  erStack->pTab;. 
4760: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
4770: 3b 20 6a 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c  ; j < pTab->nCol
4780: 3b 20 6a 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20  ; j++) {.       
4790: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
47a0: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
47b0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 52 69 67  l[j].zName, zRig
47c0: 68 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ht)==0 ){.      
47d0: 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
47f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  pr->iColumn = j;
4800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
4810: 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d  Expr->dataType =
4820: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 73   pTab->aCol[j].s
4830: 6f 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49 54  ortOrder & SQLIT
4840: 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 3b 0a 20  E_SO_TYPEMASK;. 
4850: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4860: 20 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20         }..}.    
4870: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 63    }..      if( c
4880: 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d  nt==0 && cntTab=
4890: 3d 31 20 26 26 20 73 71 6c 69 74 65 49 73 52 6f  =1 && sqliteIsRo
48a0: 77 69 64 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  wid(zRight) ){. 
48b0: 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a         cnt = 1;.
48c0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
48d0: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
48e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61       pExpr->data
48f0: 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f  Type = SQLITE_SO
4900: 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _NUM;.      }.  
4910: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4920: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
4930: 69 74 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b  iteFree(zRight);
4940: 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  .      if( cnt==
4950: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
4960: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
4970: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
4980: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a  "no such column:
4990: 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20 20   ", -1,  .      
49a0: 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e      pLeft->token
49b0: 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  .z, pLeft->token
49c0: 2e 6e 2c 20 22 2e 22 2c 20 31 2c 20 0a 20 20 20  .n, ".", 1, .   
49d0: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74         pRight->t
49e0: 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e  oken.z, pRight->
49f0: 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  token.n, 0);.   
4a00: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
4a10: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
4a20: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 1;.      }el
4a30: 73 65 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a  se if( cnt>1 ){.
4a40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
4a50: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
4a60: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61 6d 62 69  ->zErrMsg, "ambi
4a70: 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  guous column nam
4a80: 65 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20  e: ", -1,  .    
4a90: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
4aa0: 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b  en.z, pLeft->tok
4ab0: 65 6e 2e 6e 2c 20 22 2e 22 2c 20 31 2c 0a 20 20  en.n, ".", 1,.  
4ac0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
4ad0: 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d  token.z, pRight-
4ae0: 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20  >token.n, 0);.  
4af0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
4b00: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65  rr++;.        re
4b10: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
4b20: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
4b30: 44 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20  Delete(pLeft);. 
4b40: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
4b50: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  t = 0;.      sql
4b60: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 52  iteExprDelete(pR
4b70: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 45 78  ight);.      pEx
4b80: 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a  pr->pRight = 0;.
4b90: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
4ba0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
4bb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4bc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
4bd0: 20 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76   {.      Vdbe *v
4be0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
4bf0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
4c00: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
4c10: 6e 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73  n 1;.      if( s
4c20: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
4c30: 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65  Ids(pParse, base
4c40: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
4c50: 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  st, pExpr->pLeft
4c60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
4c70: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
4c80: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
4c90: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
4ca0: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
4cb0: 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
4cc0: 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
4cd0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
4ce0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
4cf0: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
4d00: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
4d10: 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 0a 20  to a temporary. 
4d20: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e         ** table.
4d30: 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    The cursor num
4d40: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
4d50: 72 61 72 79 20 74 61 62 6c 65 20 68 61 73 20 61  rary table has a
4d60: 6c 72 65 61 64 79 0a 20 20 20 20 20 20 20 20 2a  lready.        *
4d70: 2a 20 62 65 65 6e 20 70 75 74 20 69 6e 20 69 54  * been put in iT
4d80: 61 62 6c 65 20 62 79 20 73 71 6c 69 74 65 45 78  able by sqliteEx
4d90: 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63  prResolveInSelec
4da0: 74 28 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  t()..        */.
4db0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
4dc0: 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
4dd0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
4de0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4df0: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
4e00: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31  pExpr->iTable, 1
4e10: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4e20: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
4e30: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
4e40: 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e  SRT_Set, pExpr->
4e50: 69 54 61 62 6c 65 2c 20 30 2c 30 2c 30 29 3b 0a  iTable, 0,0,0);.
4e60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4e70: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
4e80: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
4e90: 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
4ea0: 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
4eb0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
4ec0: 43 72 65 61 74 65 20 61 20 73 65 74 20 74 6f 20  Create a set to 
4ed0: 70 75 74 20 74 68 65 20 65 78 70 72 6c 69 73 74  put the exprlist
4ee0: 20 76 61 6c 75 65 73 20 69 6e 2e 20 20 54 68 65   values in.  The
4ef0: 20 53 65 74 20 69 64 20 69 73 20 73 74 6f 72 65   Set id is store
4f00: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  d.        ** in 
4f10: 69 54 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20  iTable..        
4f20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4f30: 2c 20 69 53 65 74 3b 0a 20 20 20 20 20 20 20 20  , iSet;.        
4f40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72  for(i=0; i<pExpr
4f50: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  ->pList->nExpr; 
4f60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
4f70: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70  Expr *pE2 = pExp
4f80: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
4f90: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
4fa0: 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72 49  if( !sqliteExprI
4fb0: 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29  sConstant(pE2) )
4fc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
4fd0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
4fe0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 0a  Parse->zErrMsg,.
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
5000: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
5010: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75  f IN operator mu
5020: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 22 2c  st be constant",
5030: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
5040: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
5050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
5060: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20  urn 1;.         
5070: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
5080: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
5090: 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 30 2c  (pParse, pE2, 0,
50a0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
50b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
50c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
50d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 53 65 74 20   }.        iSet 
50e0: 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
50f0: 3d 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 2b 2b  = pParse->nSet++
5100: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
5110: 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73  0; i<pExpr->pLis
5120: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
5130: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
5140: 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  pE2 = pExpr->pLi
5150: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
5160: 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
5170: 28 20 70 45 32 2d 3e 6f 70 20 29 7b 0a 20 20 20  ( pE2->op ){.   
5180: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
5190: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20 20  _FLOAT:.        
51a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
51b0: 47 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20 20  GER:.           
51c0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
51d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
51e0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
51f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5200: 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 69 53 65  P_SetInsert, iSe
5210: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
5220: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 32       assert( pE2
5230: 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20  ->token.z );.   
5240: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
5250: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
5260: 20 61 64 64 72 2c 20 70 45 32 2d 3e 74 6f 6b 65   addr, pE2->toke
5270: 6e 2e 7a 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e  n.z, pE2->token.
5280: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
5290: 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75    sqliteVdbeDequ
52a0: 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a  oteP3(v, addr);.
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
52c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
52d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   }.            d
52e0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
52f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
5300: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
5310: 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  E2);.           
5320: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5330: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 49 6e 73 65  Op(v, OP_SetInse
5340: 72 74 2c 20 69 53 65 74 2c 20 30 29 3b 0a 20 20  rt, iSet, 0);.  
5350: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
5360: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
5370: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5390: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
53a0: 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  }..    case TK_S
53b0: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
53c0: 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65  * This has to be
53d0: 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
53e0: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
53f0: 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
5400: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
5410: 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
5420: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
5430: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
5440: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
5450: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
5460: 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
5470: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  /.      pExpr->i
5480: 43 6f 6c 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d  Column = pParse-
5490: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69  >nMem++;.      i
54a0: 66 28 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28  f( sqliteSelect(
54b0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
54c0: 53 65 6c 65 63 74 2c 20 53 52 54 5f 4d 65 6d 2c  Select, SRT_Mem,
54d0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
54e0: 30 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  0,0,0) ){.      
54f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
5500: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5510: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
5520: 6f 72 20 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73  or all else, jus
5530: 74 20 72 65 63 75 72 73 69 76 65 6c 79 20 77 61  t recursively wa
5540: 6c 6b 20 74 68 65 20 74 72 65 65 20 2a 2f 0a 20  lk the tree */. 
5550: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5560: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
5570: 4c 65 66 74 0a 20 20 20 20 20 20 26 26 20 73 71  Left.      && sq
5580: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
5590: 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ds(pParse, base,
55a0: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
55b0: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
55c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
55d0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
55e0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
55f0: 52 69 67 68 74 20 0a 20 20 20 20 20 20 26 26 20  Right .      && 
5600: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
5610: 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73  eIds(pParse, bas
5620: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
5630: 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  ist, pExpr->pRig
5640: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ht) ){.        r
5650: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
5660: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
5670: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
5680: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
5690: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
56a0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
56b0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
56c0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
56d0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
56e0: 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20     Expr *pArg = 
56f0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
5700: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  r;.          if(
5710: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
5720: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61  veIds(pParse, ba
5730: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
5740: 4c 69 73 74 2c 20 70 41 72 67 29 20 29 7b 0a 20  List, pArg) ){. 
5750: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
5760: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 1;.          }
5770: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5780: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5790: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
57a0: 2a 20 45 72 72 6f 72 20 63 68 65 63 6b 20 74 68  * Error check th
57b0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 61  e functions in a
57c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4d  n expression.  M
57d0: 61 6b 65 20 73 75 72 65 20 61 6c 6c 0a 2a 2a 20  ake sure all.** 
57e0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61  function names a
57f0: 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e  re recognized an
5800: 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 20  d all functions 
5810: 68 61 76 65 20 74 68 65 20 63 6f 72 72 65 63 74  have the correct
5820: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  .** number of ar
5830: 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20  guments.  Leave 
5840: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5850: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
5860: 4d 73 67 0a 2a 2a 20 69 66 20 61 6e 79 74 68 69  Msg.** if anythi
5870: 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65  ng is amiss.  Re
5880: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5890: 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
58a0: 20 69 66 20 70 49 73 41 67 67 20 69 73 20 6e 6f   if pIsAgg is no
58b0: 74 20 6e 75 6c 6c 20 61 6e 64 20 74 68 69 73 20  t null and this 
58c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
58d0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
58e0: 69 6f 6e 0a 2a 2a 20 28 6c 69 6b 65 20 63 6f 75  ion.** (like cou
58f0: 6e 74 28 2a 29 20 6f 72 20 6d 61 78 28 76 61 6c  nt(*) or max(val
5900: 75 65 29 29 20 74 68 65 6e 20 77 72 69 74 65 20  ue)) then write 
5910: 61 20 31 20 69 6e 74 6f 20 2a 70 49 73 41 67 67  a 1 into *pIsAgg
5920: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45  ..*/.int sqliteE
5930: 78 70 72 43 68 65 63 6b 28 50 61 72 73 65 20 2a  xprCheck(Parse *
5940: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
5950: 78 70 72 2c 20 69 6e 74 20 61 6c 6c 6f 77 41 67  xpr, int allowAg
5960: 67 2c 20 69 6e 74 20 2a 70 49 73 41 67 67 29 7b  g, int *pIsAgg){
5970: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
5980: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
5990: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77  ) return 0;.  sw
59a0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
59b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  ){.    case TK_F
59c0: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
59d0: 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e   int n = pExpr->
59e0: 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70  pList ? pExpr->p
59f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
5a00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
5a10: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
5a20: 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75    int no_such_fu
5a30: 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  nc = 0;       /*
5a40: 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68   True if no such
5a50: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
5a60: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73   */.      int is
5a70: 5f 74 79 70 65 5f 6f 66 20 3d 20 30 3b 20 20 20  _type_of = 0;   
5a80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5a90: 20 69 73 20 74 68 65 20 73 70 65 63 69 61 6c 20   is the special 
5aa0: 54 79 70 65 4f 66 28 29 20 66 75 6e 63 74 69 6f  TypeOf() functio
5ab0: 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77  n */.      int w
5ac0: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
5ad0: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
5ae0: 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  f wrong number o
5af0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
5b00: 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20       int is_agg 
5b10: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5b20: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61   /* True if is a
5b30: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
5b40: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
5b50: 74 20 69 3b 0a 20 20 20 20 20 20 46 75 6e 63 44  t i;.      FuncD
5b60: 65 66 20 2a 70 44 65 66 3b 0a 0a 20 20 20 20 20  ef *pDef;..     
5b70: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 46 69   pDef = sqliteFi
5b80: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
5b90: 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
5ba0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
5bb0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pExpr->token.n, 
5bc0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
5bd0: 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pDef==0 ){.    
5be0: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
5bf0: 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  eFindFunction(pP
5c00: 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
5c10: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
5c20: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
5c30: 6e 2e 6e 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20  n.n, -1, 0);.   
5c40: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
5c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
5c60: 28 20 6e 3d 3d 31 20 26 26 20 70 45 78 70 72 2d  ( n==1 && pExpr-
5c70: 3e 74 6f 6b 65 6e 2e 6e 3d 3d 36 0a 20 20 20 20  >token.n==6.    
5c80: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
5c90: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70 45 78  liteStrNICmp(pEx
5ca0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 22 74 79  pr->token.z, "ty
5cb0: 70 65 6f 66 22 2c 20 36 29 3d 3d 30 20 29 7b 0a  peof", 6)==0 ){.
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 5f 74              is_t
5cd0: 79 70 65 5f 6f 66 20 3d 20 31 3b 0a 20 20 20 20  ype_of = 1;.    
5ce0: 20 20 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20        }else {.  
5cf0: 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63            no_suc
5d00: 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20  h_func = 1;.    
5d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5d30: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
5d40: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
5d50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5d60: 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65      is_agg = pDe
5d70: 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20  f->xFunc==0;.   
5d80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
5d90: 73 5f 61 67 67 20 26 26 20 21 61 6c 6c 6f 77 41  s_agg && !allowA
5da0: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  gg ){.        sq
5db0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
5dc0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
5dd0: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
5de0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 22  egate function "
5df0: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
5e00: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
5e10: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
5e20: 20 22 28 29 22 2c 20 32 2c 20 30 29 3b 0a 20 20   "()", 2, 0);.  
5e30: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
5e40: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45  rr++;.        nE
5e50: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73  rr++;.        is
5e60: 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  _agg = 0;.      
5e70: 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63  }else if( no_suc
5e80: 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  h_func ){.      
5e90: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
5ea0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
5eb0: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 66 75  Msg, "no such fu
5ec0: 6e 63 74 69 6f 6e 3a 20 22 2c 20 2d 31 2c 0a 20  nction: ", -1,. 
5ed0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
5ee0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
5ef0: 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20  >token.n, 0);.  
5f00: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
5f10: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45  rr++;.        nE
5f20: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rr++;.      }els
5f30: 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f  e if( wrong_num_
5f40: 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  args ){.        
5f50: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
5f60: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
5f70: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22  g, .           "
5f80: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
5f90: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
5fa0: 63 74 69 6f 6e 20 22 2c 2d 31 2c 0a 20 20 20 20  ction ",-1,.    
5fb0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
5fc0: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
5fd0: 6b 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c 20  ken.n, "()", 2, 
5fe0: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
5ff0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
6000: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
6010: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
6020: 5f 61 67 67 20 29 20 70 45 78 70 72 2d 3e 6f 70  _agg ) pExpr->op
6030: 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49   = TK_AGG_FUNCTI
6040: 4f 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  ON;.      if( is
6050: 5f 61 67 67 20 26 26 20 70 49 73 41 67 67 20 29  _agg && pIsAgg )
6060: 20 2a 70 49 73 41 67 67 20 3d 20 31 3b 0a 20 20   *pIsAgg = 1;.  
6070: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72      for(i=0; nEr
6080: 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b  r==0 && i<n; i++
6090: 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20  ){.        nErr 
60a0: 3d 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  = sqliteExprChec
60b0: 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  k(pParse, pExpr-
60c0: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
60d0: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 61 6c 6c 6f 77 41 67 67 20 26 26 20 21     allowAgg && !
6100: 69 73 5f 61 67 67 2c 20 70 49 73 41 67 67 29 3b  is_agg, pIsAgg);
6110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6120: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
6130: 20 20 20 20 20 20 69 66 28 20 69 73 5f 74 79 70        if( is_typ
6140: 65 5f 6f 66 20 29 7b 0a 20 20 20 20 20 20 20 20  e_of ){.        
6150: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
6160: 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 20 20 20  _STRING;.       
6170: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
6180: 72 54 79 70 65 28 70 45 78 70 72 2d 3e 70 4c 69  rType(pExpr->pLi
6190: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3d  st->a[0].pExpr)=
61a0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29  =SQLITE_SO_NUM )
61b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  {.            pE
61c0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22  xpr->token.z = "
61d0: 6e 75 6d 65 72 69 63 22 3b 0a 20 20 20 20 20 20  numeric";.      
61e0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
61f0: 65 6e 2e 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20  en.n = 7;.      
6200: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6210: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
6220: 6b 65 6e 2e 7a 20 3d 20 22 74 65 78 74 22 3b 0a  ken.z = "text";.
6230: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
6240: 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 34 3b 0a  r->token.n = 4;.
6250: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6260: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6270: 65 20 69 66 28 20 70 44 65 66 2d 3e 64 61 74 61  e if( pDef->data
6280: 54 79 70 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20  Type>=0 ){.     
6290: 20 20 20 69 66 28 20 70 44 65 66 2d 3e 64 61 74     if( pDef->dat
62a0: 61 54 79 70 65 3c 6e 20 29 7b 0a 20 20 20 20 20  aType<n ){.     
62b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61       pExpr->data
62c0: 54 79 70 65 20 3d 20 0a 20 20 20 20 20 20 20 20  Type = .        
62d0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 54       sqliteExprT
62e0: 79 70 65 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ype(pExpr->pList
62f0: 2d 3e 61 5b 70 44 65 66 2d 3e 64 61 74 61 54 79  ->a[pDef->dataTy
6300: 70 65 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  pe].pExpr);.    
6310: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6320: 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61       pExpr->data
6330: 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f  Type = SQLITE_SO
6340: 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _NUM;.        }.
6350: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6360: 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65 3d 3d  pDef->dataType==
6370: 53 51 4c 49 54 45 5f 41 52 47 53 20 29 7b 0a 20  SQLITE_ARGS ){. 
6380: 20 20 20 20 20 20 20 70 44 65 66 2d 3e 64 61 74         pDef->dat
6390: 61 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53  aType = SQLITE_S
63a0: 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 20 20  O_TEXT;.        
63b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
63c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
63d0: 28 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  ( sqliteExprType
63e0: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61  (pExpr->pList->a
63f0: 5b 69 5d 2e 70 45 78 70 72 29 3d 3d 53 51 4c 49  [i].pExpr)==SQLI
6400: 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20  TE_SO_NUM ){.   
6410: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6420: 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c 49 54  dataType = SQLIT
6430: 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20  E_SO_NUM;.      
6440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6450: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6460: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
6470: 66 28 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70  f( pDef->dataTyp
6480: 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49  e==SQLITE_NUMERI
6490: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  C ){.        pEx
64a0: 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53  pr->dataType = S
64b0: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20  QLITE_SO_NUM;.  
64c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
64d0: 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79     pExpr->dataTy
64e0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54  pe = SQLITE_SO_T
64f0: 45 58 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EXT;.      }.   
6500: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6510: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
6520: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
6530: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
6540: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
6550: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
6560: 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41 67   allowAgg, pIsAg
6570: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
6580: 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26    if( nErr==0 &&
6590: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
65a0: 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d  {.        nErr =
65b0: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
65c0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
65d0: 70 52 69 67 68 74 2c 20 61 6c 6c 6f 77 41 67 67  pRight, allowAgg
65e0: 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20  , pIsAgg);.     
65f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72   }.      if( nEr
6600: 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  r==0 && pExpr->p
6610: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
6620: 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70  int n = pExpr->p
6630: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
6640: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
6650: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72      for(i=0; nEr
6660: 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b  r==0 && i<n; i++
6670: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
6680: 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e  r *pE2 = pExpr->
6690: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
66a0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72  r;.          nEr
66b0: 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 43 68  r = sqliteExprCh
66c0: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 32 2c  eck(pParse, pE2,
66d0: 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41 67   allowAgg, pIsAg
66e0: 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
66f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6700: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
6710: 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f  eturn nErr;.}../
6720: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 65 69 74 68  *.** Return eith
6730: 65 72 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  er SQLITE_SO_NUM
6740: 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45   or SQLITE_SO_TE
6750: 58 54 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  XT to indicate w
6760: 68 65 74 68 65 72 20 74 68 65 0a 2a 2a 20 67 69  hether the.** gi
6770: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ven expression s
6780: 68 6f 75 6c 64 20 73 6f 72 74 20 61 73 20 6e 75  hould sort as nu
6790: 6d 65 72 69 63 20 76 61 6c 75 65 73 20 6f 72 20  meric values or 
67a0: 61 73 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54  as text..**.** T
67b0: 68 65 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  he sqliteExprRes
67c0: 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20 73 71  olveIds() and sq
67d0: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 29 20  liteExprCheck() 
67e0: 72 6f 75 74 69 6e 65 73 20 6d 75 73 74 20 68 61  routines must ha
67f0: 76 65 0a 2a 2a 20 62 6f 74 68 20 62 65 65 6e 20  ve.** both been 
6800: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
6810: 70 72 65 73 73 69 6f 6e 20 62 65 66 6f 72 65 20  pression before 
6820: 69 74 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  it is passed to 
6830: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
6840: 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72 54  .int sqliteExprT
6850: 79 70 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ype(Expr *p){.  
6860: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
6870: 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b  n SQLITE_SO_NUM;
6880: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 20 73 77  .  while( p ) sw
6890: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
68a0: 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
68b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
68c0: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
68d0: 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
68e0: 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73  K_SLASH:.    cas
68f0: 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
6900: 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
6910: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
6920: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
6930: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
6940: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
6950: 55 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  UMINUS:.    case
6960: 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
6970: 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
6980: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
6990: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
69a0: 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
69b0: 54 4b 5f 52 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_RSHIFT:.    c
69c0: 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
69d0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
69e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
69f0: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
6a00: 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IN:.    case TK_
6a10: 42 45 54 57 45 45 4e 3a 0a 20 20 20 20 20 20 72  BETWEEN:.      r
6a20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
6a30: 4e 55 4d 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  NUM;..    case T
6a40: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61  K_STRING:.    ca
6a50: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
6a60: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 0a  case TK_CONCAT:.
6a70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6a80: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 0a 20 20  ITE_SO_TEXT;..  
6a90: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
6aa0: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
6ab0: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
6ac0: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
6ad0: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
6ae0: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20    case TK_EQ:.  
6af0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
6b00: 70 72 54 79 70 65 28 70 2d 3e 70 4c 65 66 74 29  prType(p->pLeft)
6b10: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20  ==SQLITE_SO_NUM 
6b20: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
6b30: 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b  n SQLITE_SO_NUM;
6b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
6b50: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
6b60: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
6b70: 63 61 73 65 20 54 4b 5f 41 53 3a 0a 20 20 20 20  case TK_AS:.    
6b80: 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a    p = p->pLeft;.
6b90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
6ba0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
6bb0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
6bc0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
6bd0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
6be0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  :.      return p
6bf0: 2d 3e 64 61 74 61 54 79 70 65 3b 0a 0a 20 20 20  ->dataType;..   
6c00: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
6c10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6c20: 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 20  ->pSelect );.   
6c30: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53     assert( p->pS
6c40: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 20 29 3b  elect->pEList );
6c50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6c60: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
6c70: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
6c80: 20 20 20 20 70 20 3d 20 70 2d 3e 70 53 65 6c 65      p = p->pSele
6c90: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ct->pEList->a[0]
6ca0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 62 72  .pExpr;.      br
6cb0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  eak;..    case T
6cc0: 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  K_CASE: {.      
6cd0: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 26 26  if( p->pRight &&
6ce0: 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28   sqliteExprType(
6cf0: 70 2d 3e 70 52 69 67 68 74 29 3d 3d 53 51 4c 49  p->pRight)==SQLI
6d00: 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20  TE_SO_NUM ){.   
6d10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6d20: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20  TE_SO_NUM;.     
6d30: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
6d40: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
6d50: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
6d60: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
6d70: 3d 20 70 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  = p->pList;.    
6d80: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
6d90: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d  List->nExpr; i+=
6da0: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2){.          if
6db0: 28 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  ( sqliteExprType
6dc0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
6dd0: 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e  pr)==SQLITE_SO_N
6de0: 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  UM ){.          
6df0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6e00: 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 20 20  SO_NUM;.        
6e10: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
6e20: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
6e30: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  rn SQLITE_SO_TEX
6e40: 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65  T;.    }..    de
6e50: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
6e60: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  ert( p->op==TK_A
6e70: 42 4f 52 54 20 29 3b 20 20 2f 2a 20 43 61 6e 27  BORT );  /* Can'
6e80: 74 20 48 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20  t Happen */.    
6e90: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
6ea0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
6eb0: 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  NUM;.}../*.** Ge
6ec0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
6ed0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
6ee0: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
6ef0: 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
6f00: 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20  ssion and leave 
6f10: 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68  the result on th
6f20: 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a  e top of stack..
6f30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78  */.void sqliteEx
6f40: 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
6f50: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
6f60: 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  r){.  Vdbe *v = 
6f70: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
6f80: 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28 20 76   int op;.  if( v
6f90: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
6fa0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74  ) return;.  swit
6fb0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
6fc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
6fd0: 53 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41  S:     op = OP_A
6fe0: 64 64 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  dd;      break;.
6ff0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
7000: 53 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 75  S:    op = OP_Su
7010: 62 74 72 61 63 74 3b 20 62 72 65 61 6b 3b 0a 20  btract; break;. 
7020: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
7030: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4d 75 6c       op = OP_Mul
7040: 74 69 70 6c 79 3b 20 62 72 65 61 6b 3b 0a 20 20  tiply; break;.  
7050: 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
7060: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44 69 76 69      op = OP_Divi
7070: 64 65 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  de;   break;.   
7080: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20   case TK_AND:   
7090: 20 20 20 6f 70 20 3d 20 4f 50 5f 41 6e 64 3b 20     op = OP_And; 
70a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
70b0: 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20  case TK_OR:     
70c0: 20 20 6f 70 20 3d 20 4f 50 5f 4f 72 3b 20 20 20    op = OP_Or;   
70d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
70e0: 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20  ase TK_LT:      
70f0: 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20   op = OP_Lt;    
7100: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
7110: 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20  se TK_LE:       
7120: 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20  op = OP_Le;     
7130: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7140: 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f  e TK_GT:       o
7150: 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20 20  p = OP_Gt;      
7160: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7170: 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f 70   TK_GE:       op
7180: 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20 20 20   = OP_Ge;       
7190: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
71a0: 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_NE:       op 
71b0: 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20 62  = OP_Ne;       b
71c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
71d0: 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_EQ:       op =
71e0: 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62 72   OP_Eq;       br
71f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7200: 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20  _ISNULL:   op = 
7210: 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65  OP_IsNull;   bre
7220: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7230: 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f  NOTNULL:  op = O
7240: 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61  P_NotNull;  brea
7250: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
7260: 4f 54 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  OT:      op = OP
7270: 5f 4e 6f 74 3b 20 20 20 20 20 20 62 72 65 61 6b  _Not;      break
7280: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  ;.    case TK_UM
7290: 49 4e 55 53 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  INUS:   op = OP_
72a0: 4e 65 67 61 74 69 76 65 3b 20 62 72 65 61 6b 3b  Negative; break;
72b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
72c0: 41 4e 44 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42  AND:   op = OP_B
72d0: 69 74 41 6e 64 3b 20 20 20 62 72 65 61 6b 3b 0a  itAnd;   break;.
72e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
72f0: 52 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69  R:    op = OP_Bi
7300: 74 4f 72 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  tOr;    break;. 
7310: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
7320: 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69 74  T:   op = OP_Bit
7330: 4e 6f 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  Not;   break;.  
7340: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
7350: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68 69 66  :   op = OP_Shif
7360: 74 4c 65 66 74 3b 20 20 62 72 65 61 6b 3b 0a 20  tLeft;  break;. 
7370: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
7380: 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68 69  T:   op = OP_Shi
7390: 66 74 52 69 67 68 74 3b 20 62 72 65 61 6b 3b 0a  ftRight; break;.
73a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
73b0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52 65        op = OP_Re
73c0: 6d 61 69 6e 64 65 72 3b 20 20 62 72 65 61 6b 3b  mainder;  break;
73d0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
73e0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  eak;.  }.  switc
73f0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
7400: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
7410: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
7420: 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 29  pParse->useAgg )
7430: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7440: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7450: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
7460: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d  ->iAgg);.      }
7470: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
7480: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
7490: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
74a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
74b0: 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  mn, pExpr->iTabl
74c0: 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
74d0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
74e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
74f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
7500: 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69 54 61  ecno, pExpr->iTa
7510: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ble, 0);.      }
7520: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7530: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
7540: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
7550: 20 69 6e 74 20 69 56 61 6c 20 3d 20 61 74 6f 69   int iVal = atoi
7560: 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29  (pExpr->token.z)
7570: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75  ;.      char zBu
7580: 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70 72  f[30];.      spr
7590: 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c 69  intf(zBuf,"%d",i
75a0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
75b0: 73 74 72 6c 65 6e 28 7a 42 75 66 29 21 3d 70 45  strlen(zBuf)!=pE
75c0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 0a 20 20  xpr->token.n .  
75d0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72            || str
75e0: 6e 63 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65  ncmp(pExpr->toke
75f0: 6e 2e 7a 2c 7a 42 75 66 2c 70 45 78 70 72 2d 3e  n.z,zBuf,pExpr->
7600: 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20  token.n)!=0 ){. 
7610: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
7620: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 63   integer value c
7630: 61 6e 6e 6f 74 20 62 65 20 72 65 70 72 65 73 65  annot be represe
7640: 6e 74 65 64 20 65 78 61 63 74 6c 79 20 69 6e 20  nted exactly in 
7650: 33 32 20 62 69 74 73 2c 0a 20 20 20 20 20 20 20  32 bits,.       
7660: 20 2a 2a 20 74 68 65 6e 20 63 6f 64 65 20 69 74   ** then code it
7670: 20 61 73 20 61 20 73 74 72 69 6e 67 20 69 6e 73   as a string ins
7680: 74 65 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tead. */.       
7690: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
76a0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
76b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
76c0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
76d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
76e0: 5f 49 6e 74 65 67 65 72 2c 20 69 56 61 6c 2c 20  _Integer, iVal, 
76f0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
7700: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
7710: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 45 78 70  geP3(v, -1, pExp
7720: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
7730: 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
7740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7750: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
7760: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
7770: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7780: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
7790: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
77a0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a  xpr->token.z );.
77b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
77c0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
77d0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
77e0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
77f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7800: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
7810: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
7820: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
7830: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7840: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
7850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
7860: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a  xpr->token.z );.
7870: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7880: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
7890: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  , pExpr->token.z
78a0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
78b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
78c0: 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20  dbeDequoteP3(v, 
78d0: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65  addr);.      bre
78e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
78f0: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
7900: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7910: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
7920: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
7930: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7940: 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
7950: 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
7960: 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
7970: 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
7980: 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
7990: 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
79a0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
79b0: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  db->file_format>
79c0: 3d 33 20 26 26 20 73 71 6c 69 74 65 45 78 70 72  =3 && sqliteExpr
79d0: 54 79 70 65 28 70 45 78 70 72 29 3d 3d 53 51 4c  Type(pExpr)==SQL
79e0: 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20  ITE_SO_TEXT ){. 
79f0: 20 20 20 20 20 20 20 6f 70 20 2b 3d 20 36 3b 20         op += 6; 
7a00: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d 65   /* Convert nume
7a10: 72 69 63 20 6f 70 63 6f 64 65 73 20 74 6f 20 74  ric opcodes to t
7a20: 65 78 74 20 6f 70 63 6f 64 65 73 20 2a 2f 0a 20  ext opcodes */. 
7a30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
7a40: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
7a50: 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
7a60: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
7a70: 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
7a80: 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
7a90: 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
7aa0: 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
7ab0: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
7ac0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
7ad0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
7ae0: 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
7af0: 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
7b00: 65 20 54 4b 5f 53 4c 41 53 48 3a 20 7b 0a 20 20  e TK_SLASH: {.  
7b10: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
7b20: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
7b30: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
7b40: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
7b50: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
7b60: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ight);.      sql
7b70: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7b80: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
7b90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7ba0: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
7bb0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
7bc0: 48 49 46 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  HIFT: {.      sq
7bd0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
7be0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
7bf0: 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ht);.      sqlit
7c00: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
7c10: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
7c20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7c30: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
7c40: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
7c50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7c60: 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
7c70: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
7c80: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
7c90: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
7ca0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
7cb0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
7cc0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ight);.      sql
7cd0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7ce0: 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c 20 30 29  OP_Concat, 2, 0)
7cf0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7d00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7d10: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
7d20: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
7d30: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
7d40: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  f( pExpr->pLeft-
7d50: 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c  >op==TK_FLOAT ||
7d60: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f   pExpr->pLeft->o
7d70: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
7d80: 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  .        Token *
7d90: 70 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66  p = &pExpr->pLef
7da0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
7db0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69    char *z = sqli
7dc0: 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 20 2b  teMalloc( p->n +
7dd0: 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 70   2 );.        sp
7de0: 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a 73 22  rintf(z, "-%.*s"
7df0: 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a 20  , p->n, p->z);. 
7e00: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
7e10: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
7e20: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
7e30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7e40: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
7e50: 65 72 2c 20 61 74 6f 69 28 7a 29 2c 20 30 29 3b  er, atoi(z), 0);
7e60: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7e70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7e80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7e90: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
7ea0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7eb0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
7ec0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 70 2d  eP3(v, -1, z, p-
7ed0: 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  >n+1);.        s
7ee0: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
7ef0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7f00: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
7f10: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
7f20: 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a  TK_NOT */.    }.
7f30: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
7f40: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
7f50: 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  NOT: {.      sql
7f60: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
7f70: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
7f80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
7f90: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
7fa0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
7fb0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7fc0: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
7fd0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
7fe0: 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  L: {.      int d
7ff0: 65 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  est;.      sqlit
8000: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8010: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b  _Integer, 1, 0);
8020: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
8030: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
8040: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8050: 20 20 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65     dest = sqlite
8060: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
8070: 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71  v) + 2;.      sq
8080: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8090: 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20   op, 1, dest);. 
80a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
80b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
80c0: 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  m, -1, 0);.     
80d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
80e0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
80f0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
8100: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8110: 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c  v, OP_AggGet, 0,
8120: 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20   pExpr->iAgg);. 
8130: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8140: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  }.    case TK_FU
8150: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
8160: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70  int i;.      Exp
8170: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
8180: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
8190: 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
81a0: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
81b0: 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46  xpr : 0;.      F
81c0: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
81d0: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
81e0: 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  eFindFunction(pP
81f0: 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8210: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
8220: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pExpr->token.n, 
8230: 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  nExpr, 0);.     
8240: 20 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30   assert( pDef!=0
8250: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
8260: 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
8270: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8280: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
8290: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
82a0: 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
82b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
82c0: 4f 70 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  Op(v, OP_Functio
82d0: 6e 2c 20 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  n, nExpr, 0);.  
82e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
82f0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63  angeP3(v, -1, (c
8300: 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 50 4f  har*)pDef, P3_PO
8310: 49 4e 54 45 52 29 3b 0a 20 20 20 20 20 20 62 72  INTER);.      br
8320: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8330: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
8340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8350: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
8360: 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f  Load, pExpr->iCo
8370: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
8380: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8390: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
83a0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
83b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
83c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
83d0: 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  er, 1, 0);.     
83e0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
83f0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
8400: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64  Left);.      add
8410: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75  r = sqliteVdbeCu
8420: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
8430: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8440: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
8450: 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 0a  l, -1, addr+4);.
8460: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8470: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
8480: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
8490: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
84a0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
84b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
84c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
84d0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b 36 29 3b  oto, 0, addr+6);
84e0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
84f0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
8500: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8510: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  ddOp(v, OP_Found
8520: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
8530: 20 61 64 64 72 2b 36 29 3b 0a 20 20 20 20 20 20   addr+6);.      
8540: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8550: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8560: 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70  , OP_SetFound, p
8570: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64  Expr->iTable, ad
8580: 64 72 2b 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dr+6);.      }. 
8590: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
85a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
85b0: 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  m, -1, 0);.     
85c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
85d0: 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
85e0: 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  N: {.      sqlit
85f0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
8600: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
8610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8620: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
8630: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
8640: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
8650: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69  arse, pExpr->pLi
8660: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
8670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8680: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c  eAddOp(v, OP_Ge,
8690: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
86a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
86b0: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
86c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
86d0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
86e0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
86f0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  .pExpr);.      s
8700: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8710: 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a  , OP_Le, 0, 0);.
8720: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8730: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64 2c  AddOp(v, OP_And,
8740: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
8750: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8760: 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20  ase TK_AS: {.   
8770: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
8780: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
8790: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62  >pLeft);.      b
87a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
87b0: 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a  case TK_CASE: {.
87c0: 20 20 20 20 20 20 69 6e 74 20 65 78 70 72 5f 65        int expr_e
87d0: 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20  nd_label;.      
87e0: 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20  int jumpInst;.  
87f0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
8800: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20      int nExpr;. 
8810: 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
8820: 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
8830: 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61  >pList);.      a
8840: 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c  ssert((pExpr->pL
8850: 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20  ist->nExpr % 2) 
8860: 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  == 0);.      ass
8870: 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
8880: 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
8890: 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 78 70      nExpr = pExp
88a0: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  r->pList->nExpr;
88b0: 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f  .      expr_end_
88c0: 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 56 64  label = sqliteVd
88d0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
88e0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
88f0: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
8900: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
8910: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8920: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pLeft);.      }.
8930: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8940: 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a  <nExpr; i=i+2){.
8950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
8960: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
8970: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
8980: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
8990: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
89a0: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
89b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
89c0: 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29  v, OP_Dup, 1, 1)
89d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70  ;.          jump
89e0: 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 56 64 62  Inst = sqliteVdb
89f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c  eAddOp(v, OP_Ne,
8a00: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
8a10: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8a20: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
8a30: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
8a40: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d  e{.          jum
8a50: 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 56 64  pInst = sqliteVd
8a60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
8a70: 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Not, 1, 0);.    
8a80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
8a90: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
8aa0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
8ab0: 74 2d 3e 61 5b 69 2b 31 5d 2e 70 45 78 70 72 29  t->a[i+1].pExpr)
8ac0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8ad0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8ae0: 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e  Goto, 0, expr_en
8af0: 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  d_label);.      
8b00: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
8b10: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
8b20: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8b30: 65 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  eVdbeChangeP2(v,
8b40: 20 6a 75 6d 70 49 6e 73 74 2c 20 61 64 64 72 29   jumpInst, addr)
8b50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8b60: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
8b70: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8b80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8b90: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
8ba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8bb0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
8bc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45  .        sqliteE
8bd0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
8be0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
8bf0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8c00: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8c10: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
8c20: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
8c30: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
8c40: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
8c50: 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  , expr_end_label
8c60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8c70: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8c80: 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
8c90: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72   if( !pParse->tr
8ca0: 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20  igStack ){.     
8cb0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
8cc0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
8cd0: 72 4d 73 67 2c 20 0a 09 09 22 52 41 49 53 45 28  rMsg, ..."RAISE(
8ce0: 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
8cf0: 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
8d00: 67 65 72 2d 70 72 6f 67 72 61 6d 22 2c 20 2d 31  ger-program", -1
8d10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
8d20: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 09 72  arse->nErr++;..r
8d30: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
8d40: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
8d50: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 52 6f  iColumn == OE_Ro
8d60: 6c 6c 62 61 63 6b 20 7c 7c 0a 09 20 20 70 45 78  llback ||..  pEx
8d70: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
8d80: 45 5f 41 62 6f 72 74 20 7c 7c 0a 09 20 20 70 45  E_Abort ||..  pE
8d90: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
8da0: 4f 45 5f 46 61 69 6c 20 29 7b 0a 09 20 20 63 68  OE_Fail ){..  ch
8db0: 61 72 20 2a 20 6d 73 67 20 3d 20 73 71 6c 69 74  ar * msg = sqlit
8dc0: 65 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e  eStrNDup(pExpr->
8dd0: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
8de0: 74 6f 6b 65 6e 2e 6e 29 3b 0a 09 20 20 73 71 6c  token.n);..  sql
8df0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8e00: 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
8e10: 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70  CONSTRAINT, pExp
8e20: 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 09 20 20  r->iColumn);..  
8e30: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 6d 73  sqliteDequote(ms
8e40: 67 29 3b 0a 09 20 20 73 71 6c 69 74 65 56 64 62  g);..  sqliteVdb
8e50: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
8e60: 20 6d 73 67 2c 20 30 29 3b 0a 09 20 20 73 71 6c   msg, 0);..  sql
8e70: 69 74 65 46 72 65 65 28 6d 73 67 29 3b 0a 20 20  iteFree(msg);.  
8e80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20      } else {..  
8e90: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
8ea0: 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e  Column == OE_Ign
8eb0: 6f 72 65 20 29 3b 0a 09 20 20 73 71 6c 69 74 65  ore );..  sqlite
8ec0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8ed0: 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
8ee0: 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f  >trigStack->igno
8ef0: 72 65 4a 75 6d 70 29 3b 0a 09 20 20 73 71 6c 69  reJump);..  sqli
8f00: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
8f10: 2c 20 2d 31 2c 20 22 28 49 47 4e 4f 52 45 20 6a  , -1, "(IGNORE j
8f20: 75 6d 70 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20  ump)", -1);.    
8f30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
8f40: 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  eak;.  }.}../*.*
8f50: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8f60: 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
8f70: 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
8f80: 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
8f90: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
8fa0: 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
8fb0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
8fc0: 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
8fd0: 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
8fe0: 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
8ff0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9000: 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
9010: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9020: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
9030: 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
9040: 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
9050: 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
9060: 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
9070: 75 6c 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65  ull flag is true
9080: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9090: 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
90a0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
90b0: 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
90c0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
90d0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
90e0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
90f0: 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28  nt op = 0;.  if(
9100: 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
9110: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77  0 ) return;.  sw
9120: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
9130: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  ){.    case TK_L
9140: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
9150: 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Lt;       break
9160: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
9170: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
9180: 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Le;       break;
9190: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
91a0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47         op = OP_G
91b0: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
91c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
91d0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65        op = OP_Ge
91e0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
91f0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20     case TK_NE:  
9200: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b       op = OP_Ne;
9210: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9220: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20    case TK_EQ:   
9230: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20      op = OP_Eq; 
9240: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9250: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
9260: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c     op = OP_IsNul
9270: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
9280: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
9290: 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c    op = OP_NotNul
92a0: 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  l;  break;.    d
92b0: 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b 0a  efault:  break;.
92c0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45    }.  switch( pE
92d0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
92e0: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
92f0: 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
9300: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
9310: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
9320: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
9330: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
9340: 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75  t, d2, !jumpIfNu
9350: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
9360: 65 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  eExprIfTrue(pPar
9370: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
9380: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
9390: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
93a0: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
93b0: 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
93c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
93d0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
93e0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
93f0: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
9400: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
9410: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
9420: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
9430: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
9440: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
9450: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
9460: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9470: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9480: 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  NOT: {.      sql
9490: 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70  iteExprIfFalse(p
94a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
94b0: 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
94c0: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
94d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
94e0: 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
94f0: 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
9500: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
9510: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
9520: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
9530: 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
9540: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
9550: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9560: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
9570: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
9580: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
9590: 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ght);.      if( 
95a0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
95b0: 5f 66 6f 72 6d 61 74 3e 3d 33 20 26 26 20 73 71  _format>=3 && sq
95c0: 6c 69 74 65 45 78 70 72 54 79 70 65 28 70 45 78  liteExprType(pEx
95d0: 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54  pr)==SQLITE_SO_T
95e0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  EXT ){.        o
95f0: 70 20 2b 3d 20 36 3b 20 20 2f 2a 20 43 6f 6e 76  p += 6;  /* Conv
9600: 65 72 74 20 6e 75 6d 65 72 69 63 20 6f 70 63 6f  ert numeric opco
9610: 64 65 73 20 74 6f 20 74 65 78 74 20 6f 70 63 6f  des to text opco
9620: 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  des */.      }. 
9630: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9640: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 6a 75 6d 70  ddOp(v, op, jump
9650: 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20  IfNull, dest);. 
9660: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9670: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
9680: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
9690: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
96a0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
96b0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
96c0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
96d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
96e0: 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a  , op, 1, dest);.
96f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9700: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
9710: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  N: {.      int a
9720: 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ddr;.      sqlit
9730: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
9740: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
9750: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
9760: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
9770: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
9780: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9790: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c   OP_NotNull, -1,
97a0: 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20   addr+3);.      
97b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
97c0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
97d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
97e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
97f0: 74 6f 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c  to, 0, jumpIfNul
9800: 6c 20 3f 20 64 65 73 74 20 3a 20 61 64 64 72 2b  l ? dest : addr+
9810: 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  4);.      if( pE
9820: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
9830: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
9840: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f  beAddOp(v, OP_Fo
9850: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
9860: 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  le, dest);.     
9870: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9880: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9890: 76 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64 2c 20  v, OP_SetFound, 
98a0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
98b0: 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  est);.      }.  
98c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
98d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
98e0: 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  WEEN: {.      in
98f0: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73 71  t addr;.      sq
9900: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
9910: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
9920: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9930: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9940: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
9950: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
9960: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
9970: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
9980: 72 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  r);.      addr =
9990: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
99a0: 28 76 2c 20 4f 50 5f 4c 74 2c 20 21 6a 75 6d 70  (v, OP_Lt, !jump
99b0: 49 66 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20 20 20  IfNull, 0);.    
99c0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
99d0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
99e0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
99f0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
9a00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9a10: 4c 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20  Le, jumpIfNull, 
9a20: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
9a30: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9a40: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
9a50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
9a60: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
9a70: 64 64 72 2c 20 73 71 6c 69 74 65 56 64 62 65 43  ddr, sqliteVdbeC
9a80: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
9a90: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9aa0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
9ab0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   1, 0);.      br
9ac0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
9ad0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
9ae0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
9af0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
9b00: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9b10: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 6a  ddOp(v, OP_If, j
9b20: 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29  umpIfNull, dest)
9b30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9b40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9b50: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
9b60: 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
9b70: 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
9b80: 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
9b90: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
9ba0: 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
9bb0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
9bc0: 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
9bd0: 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
9be0: 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
9bf0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9c00: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
9c10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9c20: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
9c30: 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
9c40: 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
9c50: 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
9c60: 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 20 6f 72  fNull is true or
9c70: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66   fall through if
9c80: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66   jumpIfNull is f
9c90: 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  alse..*/.void sq
9ca0: 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28  liteExprIfFalse(
9cb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
9cc0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
9cd0: 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
9ce0: 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
9cf0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9d00: 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
9d10: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
9d20: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
9d30: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
9d40: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
9d50: 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70   TK_LT:       op
9d60: 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20 20 20   = OP_Ge;       
9d70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9d80: 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_LE:       op 
9d90: 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62  = OP_Gt;       b
9da0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9db0: 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_GT:       op =
9dc0: 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72   OP_Le;       br
9dd0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9de0: 5f 47 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _GE:       op = 
9df0: 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Lt;       bre
9e00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9e10: 4e 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  NE:       op = O
9e20: 50 5f 45 71 3b 20 20 20 20 20 20 20 62 72 65 61  P_Eq;       brea
9e30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
9e40: 51 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  Q:       op = OP
9e50: 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Ne;       break
9e60: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
9e70: 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  NULL:   op = OP_
9e80: 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61 6b 3b  NotNull;  break;
9e90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
9ea0: 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 49  NULL:  op = OP_I
9eb0: 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a  sNull;   break;.
9ec0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 62 72      default:  br
9ed0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  eak;.  }.  switc
9ee0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
9ef0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
9f00: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
9f10: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
9f20: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
9f30: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
9f40: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
9f50: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
9f60: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
9f70: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
9f80: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
9f90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9fa0: 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
9fb0: 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
9fc0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
9fd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
9fe0: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
9ff0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
a000: 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  2, !jumpIfNull);
a010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
a020: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
a030: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
a040: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
a050: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
a060: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
a070: 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
a080: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a090: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
a0a0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
a0b0: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
a0c0: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
a0d0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
a0e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a0f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
a100: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
a110: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
a120: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
a130: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
a140: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
a150: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61   {.      if( pPa
a160: 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f  rse->db->file_fo
a170: 72 6d 61 74 3e 3d 33 20 26 26 20 73 71 6c 69 74  rmat>=3 && sqlit
a180: 65 45 78 70 72 54 79 70 65 28 70 45 78 70 72 29  eExprType(pExpr)
a190: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  ==SQLITE_SO_TEXT
a1a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 2b   ){.        op +
a1b0: 3d 20 36 3b 20 20 2f 2a 20 43 6f 6e 76 65 72 74  = 6;  /* Convert
a1c0: 20 6e 75 6d 65 72 69 63 20 6f 70 63 6f 64 65 73   numeric opcodes
a1d0: 20 74 6f 20 74 65 78 74 20 6f 70 63 6f 64 65 73   to text opcodes
a1e0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
a1f0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
a200: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
a210: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
a220: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
a230: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
a240: 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ht);.      sqlit
a250: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
a260: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
a270: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
a280: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a290: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
a2a0: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
a2b0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
a2c0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
a2d0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
a2e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
a2f0: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64  ddOp(v, op, 1, d
a300: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
a310: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a320: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
a330: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
a340: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
a350: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a360: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64  Left);.      add
a370: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75  r = sqliteVdbeCu
a380: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
a390: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a3a0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
a3b0: 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 33 29 3b 0a  l, -1, addr+3);.
a3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a3d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
a3e0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
a3f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
a400: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 75 6d   OP_Goto, 0, jum
a410: 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a  pIfNull ? dest :
a420: 20 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 20 20   addr+4);.      
a430: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
a440: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
a450: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
a460: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45   OP_NotFound, pE
a470: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
a480: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
a490: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
a4a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
a4b0: 65 74 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70  etNotFound, pExp
a4c0: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29  r->iTable, dest)
a4d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a4e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a4f0: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
a500: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
a510: 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dr;.      sqlite
a520: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
a530: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
a540: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a550: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
a560: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a570: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
a580: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
a590: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
a5a0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
a5b0: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
a5c0: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
a5d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a5e0: 4f 50 5f 47 65 2c 20 21 6a 75 6d 70 49 66 4e 75  OP_Ge, !jumpIfNu
a5f0: 6c 6c 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20  ll, addr+3);.   
a600: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a610: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
a620: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
a630: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
a640: 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b  _Goto, 0, dest);
a650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
a660: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
a670: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
a680: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  .pExpr);.      s
a690: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a6a0: 2c 20 4f 50 5f 47 74 2c 20 6a 75 6d 70 49 66 4e  , OP_Gt, jumpIfN
a6b0: 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ull, dest);.    
a6c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a6d0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
a6e0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
a6f0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
a700: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
a710: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
a720: 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  fNot, jumpIfNull
a730: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
a740: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
a750: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
a760: 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
a770: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
a780: 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54  trees.  Return T
a790: 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a  RUE (non-zero).*
a7a0: 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  * if they are id
a7b0: 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75  entical and retu
a7c0: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79  rn FALSE if they
a7d0: 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
a7e0: 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ay..*/.int sqlit
a7f0: 65 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70  eExprCompare(Exp
a800: 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29  r *pA, Expr *pB)
a810: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
a820: 20 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   pA==0 ){.    re
a830: 74 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d 65  turn pB==0;.  }e
a840: 6c 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29 7b  lse if( pB==0 ){
a850: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a860: 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
a870: 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e  =pB->op ) return
a880: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
a890: 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  eExprCompare(pA-
a8a0: 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
a8b0: 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
a8c0: 20 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72   if( !sqliteExpr
a8d0: 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67  Compare(pA->pRig
a8e0: 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20  ht, pB->pRight) 
a8f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
a900: 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pA->pList ){. 
a910: 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74     if( pB->pList
a920: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
a930: 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73      if( pA->pLis
a940: 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c  t->nExpr!=pB->pL
a950: 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  ist->nExpr ) ret
a960: 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  urn 0;.    for(i
a970: 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d  =0; i<pA->pList-
a980: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
a990: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 45      if( !sqliteE
a9a0: 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
a9b0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
a9c0: 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  , pB->pList->a[i
a9d0: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
a9e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a9f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
aa00: 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73  lse if( pB->pLis
aa10: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
aa20: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  0;.  }.  if( pA-
aa30: 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e  >pSelect || pB->
aa40: 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
aa50: 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f   0;.  if( pA->to
aa60: 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28  ken.z ){.    if(
aa70: 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20   pB->token.z==0 
aa80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
aa90: 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21  if( pB->token.n!
aaa0: 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72  =pA->token.n ) r
aab0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
aac0: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
aad0: 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d  pA->token.z, pB-
aae0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 41 2d 3e 74 6f  >token.z, pA->to
aaf0: 6b 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74 75  ken.n)!=0 ) retu
ab00: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
ab10: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 1;.}../*.** A
ab20: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
ab30: 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
ab40: 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 6e 64  aAgg[] array and
ab50: 20 72 65 74 75 72 6e 20 69 74 73 20 69 6e 64 65   return its inde
ab60: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
ab70: 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 50   appendAggInfo(P
ab80: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
ab90: 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 6e 41   if( (pParse->nA
aba0: 67 67 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  gg & 0x7)==0 ){.
abb0: 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 70 50      int amt = pP
abc0: 61 72 73 65 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a  arse->nAgg + 8;.
abd0: 20 20 20 20 41 67 67 45 78 70 72 20 2a 61 41 67      AggExpr *aAg
abe0: 67 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  g = sqliteReallo
abf0: 63 28 70 50 61 72 73 65 2d 3e 61 41 67 67 2c 20  c(pParse->aAgg, 
ac00: 61 6d 74 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  amt*sizeof(pPars
ac10: 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20  e->aAgg[0]));.  
ac20: 20 20 69 66 28 20 61 41 67 67 3d 3d 30 20 29 7b    if( aAgg==0 ){
ac30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
ac40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
ac50: 73 65 2d 3e 61 41 67 67 20 3d 20 61 41 67 67 3b  se->aAgg = aAgg;
ac60: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70  .  }.  memset(&p
ac70: 50 61 72 73 65 2d 3e 61 41 67 67 5b 70 50 61 72  Parse->aAgg[pPar
ac80: 73 65 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20 73 69  se->nAgg], 0, si
ac90: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67  zeof(pParse->aAg
aca0: 67 5b 30 5d 29 29 3b 0a 20 20 72 65 74 75 72 6e  g[0]));.  return
acb0: 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b   pParse->nAgg++;
acc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
acd0: 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
ace0: 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
acf0: 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
ad00: 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
ad10: 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
ad20: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
ad30: 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
ad40: 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
ad50: 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
ad60: 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
ad70: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
ad80: 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
ad90: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
ada0: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
adb0: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
adc0: 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
add0: 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
ade0: 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
adf0: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 29  ExprResolveIds()
ae00: 20 61 6e 64 20 73 71 6c 69 74 65 45 78 70 72 43   and sqliteExprC
ae10: 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  heck()..**.** If
ae20: 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e   errors are seen
ae30: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
ae40: 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72   message in zErr
ae50: 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  Msg and return.*
ae60: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
ae70: 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
ae80: 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65  qliteExprAnalyze
ae90: 41 67 67 72 65 67 61 74 65 73 28 50 61 72 73 65  Aggregates(Parse
aea0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
aeb0: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
aec0: 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67 67  .  AggExpr *aAgg
aed0: 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  ;.  int nErr = 0
aee0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
aef0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
af00: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
af10: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
af20: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
af30: 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e   aAgg = pParse->
af40: 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  aAgg;.      for(
af50: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
af60: 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
af70: 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e 69     if( aAgg[i].i
af80: 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
af90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 41 67  .        if( aAg
afa0: 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 54 61 62  g[i].pExpr->iTab
afb0: 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
afc0: 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 61 41  e.         && aA
afd0: 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  gg[i].pExpr->iCo
afe0: 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
aff0: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
b000: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b010: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
b020: 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e   if( i>=pParse->
b030: 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  nAgg ){.        
b040: 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66  i = appendAggInf
b050: 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  o(pParse);.     
b060: 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74     if( i<0 ) ret
b070: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70  urn 1;.        p
b080: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
b090: 73 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  sAgg = 0;.      
b0a0: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
b0b0: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
b0c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
b0d0: 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
b0e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b0f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
b100: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
b110: 20 20 20 20 20 61 41 67 67 20 3d 20 70 50 61 72       aAgg = pPar
b120: 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20  se->aAgg;.      
b130: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
b140: 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
b150: 20 20 20 20 20 20 20 69 66 28 20 21 61 41 67 67         if( !aAgg
b160: 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74  [i].isAgg ) cont
b170: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
b180: 28 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70  ( sqliteExprComp
b190: 61 72 65 28 61 41 67 67 5b 69 5d 2e 70 45 78 70  are(aAgg[i].pExp
b1a0: 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20  r, pExpr) ){.   
b1b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b1c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b1d0: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61        if( i>=pPa
b1e0: 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20  rse->nAgg ){.   
b1f0: 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41       i = appendA
b200: 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a  ggInfo(pParse);.
b210: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20          if( i<0 
b220: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
b230: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
b240: 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20  [i].isAgg = 1;. 
b250: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
b260: 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  Agg[i].pExpr = p
b270: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50  Expr;.        pP
b280: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
b290: 75 6e 63 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  unc = sqliteFind
b2a0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
b2b0: 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
b2c0: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
b2d0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
b2e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
b2f0: 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45  Expr->pList ? pE
b300: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
b310: 72 20 3a 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  r : 0, 0);.     
b320: 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e   }.      pExpr->
b330: 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20  iAgg = i;.      
b340: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b350: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b360: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
b370: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45  ft ){.        nE
b380: 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 41  rr = sqliteExprA
b390: 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
b3a0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
b3b0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pLeft);.      }.
b3c0: 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d        if( nErr==
b3d0: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
b3e0: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45  ht ){.        nE
b3f0: 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 41  rr = sqliteExprA
b400: 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
b410: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
b420: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d  pRight);.      }
b430: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d  .      if( nErr=
b440: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69  =0 && pExpr->pLi
b450: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  st ){.        in
b460: 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  t n = pExpr->pLi
b470: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
b480: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
b490: 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d    for(i=0; nErr=
b4a0: 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =0 && i<n; i++){
b4b0: 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20  .          nErr 
b4c0: 3d 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c  = sqliteExprAnal
b4d0: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
b4e0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69  arse, pExpr->pLi
b4f0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
b500: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b510: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
b520: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b530: 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nErr;.}../*.*
b540: 2a 20 4c 6f 63 61 74 65 20 61 20 75 73 65 72 20  * Locate a user 
b550: 66 75 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20 61  function given a
b560: 20 6e 61 6d 65 20 61 6e 64 20 61 20 6e 75 6d 62   name and a numb
b570: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
b580: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
b590: 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63  nter to the Func
b5a0: 44 65 66 20 73 74 72 75 63 74 75 72 65 20 74 68  Def structure th
b5b0: 61 74 20 64 65 66 69 6e 65 73 20 74 68 61 74 0a  at defines that.
b5c0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 20  ** function, or 
b5d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  return NULL if t
b5e0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
b5f0: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a   not exist..**.*
b600: 2a 20 49 66 20 74 68 65 20 63 72 65 61 74 65 46  * If the createF
b610: 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
b620: 74 72 75 65 2c 20 74 68 65 6e 20 61 20 6e 65 77  true, then a new
b630: 20 28 62 6c 61 6e 6b 29 20 46 75 6e 63 44 65 66   (blank) FuncDef
b640: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73  .** structure is
b650: 20 63 72 65 61 74 65 64 20 61 6e 64 20 6c 69 6b   created and lik
b660: 65 64 20 69 6e 74 6f 20 74 68 65 20 22 64 62 22  ed into the "db"
b670: 20 73 74 72 75 63 74 75 72 65 20 69 66 20 61 0a   structure if a.
b680: 2a 2a 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 66  ** no matching f
b690: 75 6e 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73  unction previous
b6a0: 6c 79 20 65 78 69 73 74 65 64 2e 20 20 57 68 65  ly existed.  Whe
b6b0: 6e 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20  n createFlag is 
b6c0: 74 72 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  true.** and the 
b6d0: 6e 41 72 67 20 70 61 72 61 6d 65 74 65 72 20 69  nArg parameter i
b6e0: 73 20 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  s -1, then only 
b6f0: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
b700: 61 63 63 65 70 74 73 0a 2a 2a 20 61 6e 79 20 6e  accepts.** any n
b710: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b720: 74 73 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ts will be retur
b730: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72  ned..**.** If cr
b740: 65 61 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73  eateFlag is fals
b750: 65 20 61 6e 64 20 6e 41 72 67 20 69 73 20 2d 31  e and nArg is -1
b760: 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
b770: 20 76 61 6c 69 64 0a 2a 2a 20 66 75 6e 63 74 69   valid.** functi
b780: 6f 6e 20 66 6f 75 6e 64 20 69 73 20 72 65 74 75  on found is retu
b790: 72 6e 65 64 2e 20 20 41 20 66 75 6e 63 74 69 6f  rned.  A functio
b7a0: 6e 20 69 73 20 76 61 6c 69 64 20 69 66 20 65 69  n is valid if ei
b7b0: 74 68 65 72 20 78 46 75 6e 63 0a 2a 2a 20 6f 72  ther xFunc.** or
b7c0: 20 78 53 74 65 70 20 69 73 20 6e 6f 6e 2d 7a 65   xStep is non-ze
b7d0: 72 6f 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66 20 2a  ro..*/.FuncDef *
b7e0: 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74 69  sqliteFindFuncti
b7f0: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  on(.  sqlite *db
b800: 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  ,        /* An o
b810: 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  pen database */.
b820: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
b830: 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ame, /* Name of 
b840: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 4e  the function.  N
b850: 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74  ot null-terminat
b860: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ed */.  int nNam
b870: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e,         /* Nu
b880: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
b890: 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a  rs in the name *
b8a0: 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
b8b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b8c0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
b8d0: 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20 6e 75 6d  -1 means any num
b8e0: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 72 65  ber */.  int cre
b8f0: 61 74 65 46 6c 61 67 20 20 20 20 20 2f 2a 20 43  ateFlag     /* C
b900: 72 65 61 74 65 20 6e 65 77 20 65 6e 74 72 79 20  reate new entry 
b910: 69 66 20 74 72 75 65 20 61 6e 64 20 64 6f 65 73  if true and does
b920: 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 65   not otherwise e
b930: 78 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e  xist */.){.  Fun
b940: 63 44 65 66 20 2a 70 46 69 72 73 74 2c 20 2a 70  cDef *pFirst, *p
b950: 2c 20 2a 70 4d 61 79 62 65 3b 0a 20 20 70 46 69  , *pMaybe;.  pFi
b960: 72 73 74 20 3d 20 70 20 3d 20 28 46 75 6e 63 44  rst = p = (FuncD
b970: 65 66 2a 29 73 71 6c 69 74 65 48 61 73 68 46 69  ef*)sqliteHashFi
b980: 6e 64 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a  nd(&db->aFunc, z
b990: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
b9a0: 69 66 28 20 70 20 26 26 20 21 63 72 65 61 74 65  if( p && !create
b9b0: 46 6c 61 67 20 26 26 20 6e 41 72 67 3c 30 20 29  Flag && nArg<0 )
b9c0: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26  {.    while( p &
b9d0: 26 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 26 26  & p->xFunc==0 &&
b9e0: 20 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29 7b 20   p->xStep==0 ){ 
b9f0: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a  p = p->pNext; }.
ba00: 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20      return p;.  
ba10: 7d 0a 20 20 70 4d 61 79 62 65 20 3d 20 30 3b 0a  }.  pMaybe = 0;.
ba20: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
ba30: 3e 6e 41 72 67 21 3d 6e 41 72 67 20 29 7b 0a 20  >nArg!=nArg ){. 
ba40: 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67 3c 30     if( p->nArg<0
ba50: 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67 20   && !createFlag 
ba60: 26 26 20 28 70 2d 3e 78 46 75 6e 63 20 7c 7c 20  && (p->xFunc || 
ba70: 70 2d 3e 78 53 74 65 70 29 20 29 20 70 4d 61 79  p->xStep) ) pMay
ba80: 62 65 20 3d 20 70 3b 0a 20 20 20 20 70 20 3d 20  be = p;.    p = 
ba90: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
baa0: 69 66 28 20 70 20 26 26 20 21 63 72 65 61 74 65  if( p && !create
bab0: 46 6c 61 67 20 26 26 20 70 2d 3e 78 46 75 6e 63  Flag && p->xFunc
bac0: 3d 3d 30 20 26 26 20 70 2d 3e 78 53 74 65 70 3d  ==0 && p->xStep=
bad0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
bae0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d   0;.  }.  if( p=
baf0: 3d 30 20 26 26 20 70 4d 61 79 62 65 20 29 7b 0a  =0 && pMaybe ){.
bb00: 20 20 20 20 61 73 73 65 72 74 28 20 63 72 65 61      assert( crea
bb10: 74 65 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  teFlag==0 );.   
bb20: 20 72 65 74 75 72 6e 20 70 4d 61 79 62 65 3b 0a   return pMaybe;.
bb30: 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20 26    }.  if( p==0 &
bb40: 26 20 63 72 65 61 74 65 46 6c 61 67 20 26 26 20  & createFlag && 
bb50: 28 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  (p = sqliteMallo
bb60: 63 28 73 69 7a 65 6f 66 28 2a 70 29 29 29 21 3d  c(sizeof(*p)))!=
bb70: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 72 67  0 ){.    p->nArg
bb80: 20 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70 2d 3e   = nArg;.    p->
bb90: 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a  pNext = pFirst;.
bba0: 20 20 20 20 70 2d 3e 64 61 74 61 54 79 70 65 20      p->dataType 
bbb0: 3d 20 70 46 69 72 73 74 20 3f 20 70 46 69 72 73  = pFirst ? pFirs
bbc0: 74 2d 3e 64 61 74 61 54 79 70 65 20 3a 20 53 51  t->dataType : SQ
bbd0: 4c 49 54 45 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  LITE_NUMERIC;.  
bbe0: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65    sqliteHashInse
bbf0: 72 74 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a  rt(&db->aFunc, z
bc00: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 28 76 6f  Name, nName, (vo
bc10: 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 20 20 72 65  id*)p);.  }.  re
bc20: 74 75 72 6e 20 70 3b 0a 7d 0a                    turn p;.}.