/ Hex Artifact Content
Login

Artifact 8af430cdbcb6122dd0320c8860602bd4cc778486:


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 38 39 20 32 30 30 33 2f 30 33 2f 32 30 20 30  .89 2003/03/20 0
0220: 31 3a 31 36 3a 35 39 20 64 72 68 20 45 78 70 20  1:16:59 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 61 73 73 65 72 74 28 20 70 54 6f 6b 65     assert( pToke
0470: 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20  n->dyn==0 );.   
0480: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a   pNew->token = *
0490: 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 70 4e 65 77  pToken;.    pNew
04a0: 2d 3e 73 70 61 6e 20 3d 20 2a 70 54 6f 6b 65 6e  ->span = *pToken
04b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
04c0: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  New->token.dyn =
04d0: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   0;.    pNew->to
04e0: 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 70  ken.z = 0;.    p
04f0: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30  New->token.n = 0
0500: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20  ;.    if( pLeft 
0510: 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  && pRight ){.   
0520: 20 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61     sqliteExprSpa
0530: 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e  n(pNew, &pLeft->
0540: 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73  span, &pRight->s
0550: 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pan);.    }else{
0560: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 73 70 61  .      pNew->spa
0570: 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b  n = pNew->token;
0580: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0590: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
05a0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
05b0: 73 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68  span field of th
05c0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
05d0: 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a  on to span all.*
05e0: 2a 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74  * text between t
05f0: 68 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b  he two given tok
0600: 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ens..*/.void sql
0610: 69 74 65 45 78 70 72 53 70 61 6e 28 45 78 70 72  iteExprSpan(Expr
0620: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
0630: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
0640: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 45 78  ight){.  if( pEx
0650: 70 72 20 26 26 20 70 52 69 67 68 74 20 26 26 20  pr && pRight && 
0660: 70 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65  pRight->z && pLe
0670: 66 74 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20 29  ft && pLeft->z )
0680: 7b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  {.    if( pLeft-
0690: 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67 68  >dyn==0 && pRigh
06a0: 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20  t->dyn==0 ){.   
06b0: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
06c0: 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20   = pLeft->z;.   
06d0: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e     pExpr->span.n
06e0: 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 41   = pRight->n + A
06f0: 64 64 72 28 70 52 69 67 68 74 2d 3e 7a 29 20 2d  ddr(pRight->z) -
0700: 20 41 64 64 72 28 70 4c 65 66 74 2d 3e 7a 29 3b   Addr(pLeft->z);
0710: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
0720: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20    pExpr->span.z 
0730: 3d 20 30 3b 0a 20 20 20 20 20 20 70 45 78 70 72  = 0;.      pExpr
0740: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 30 3b 0a 20 20  ->span.n = 0;.  
0750: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
0760: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dyn = 0;.    }. 
0770: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
0780: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
0790: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
07a0: 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  a function with 
07b0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75  multiple.** argu
07c0: 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ments..*/.Expr *
07d0: 73 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69  sqliteExprFuncti
07e0: 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  on(ExprList *pLi
07f0: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
0800: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  n){.  Expr *pNew
0810: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
0820: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
0830: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
0840: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
0850: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
0860: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  te(pList);.    r
0870: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
0880: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e  New->op = TK_FUN
0890: 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70  CTION;.  pNew->p
08a0: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
08b0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  pNew->token.dyn 
08c0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  = 0;.  if( pToke
08d0: 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
08e0: 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20   pToken->dyn==0 
08f0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  );.    pNew->tok
0900: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
0910: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
0920: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20  >token.z = 0;.  
0930: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20    pNew->token.n 
0940: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  = 0;.  }.  pNew-
0950: 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f  >span = pNew->to
0960: 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ken;.  return pN
0970: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  ew;.}../*.** Rec
0980: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
0990: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
09a0: 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
09b0: 74 65 45 78 70 72 44 65 6c 65 74 65 28 45 78 70  teExprDelete(Exp
09c0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
09d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
09e0: 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 26 26  ( p->span.dyn &&
09f0: 20 70 2d 3e 73 70 61 6e 2e 7a 20 29 20 73 71 6c   p->span.z ) sql
0a00: 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70  iteFree((char*)p
0a10: 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66 28  ->span.z);.  if(
0a20: 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 26 26   p->token.dyn &&
0a30: 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 20 73 71   p->token.z ) sq
0a40: 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29  liteFree((char*)
0a50: 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 69  p->token.z);.  i
0a60: 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 20 73 71  f( p->pLeft ) sq
0a70: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
0a80: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
0a90: 70 2d 3e 70 52 69 67 68 74 20 29 20 73 71 6c 69  p->pRight ) sqli
0aa0: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  teExprDelete(p->
0ab0: 70 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20 70  pRight);.  if( p
0ac0: 2d 3e 70 4c 69 73 74 20 29 20 73 71 6c 69 74 65  ->pList ) sqlite
0ad0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
0ae0: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  ->pList);.  if( 
0af0: 70 2d 3e 70 53 65 6c 65 63 74 20 29 20 73 71 6c  p->pSelect ) sql
0b00: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
0b10: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  p->pSelect);.  s
0b20: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
0b30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
0b40: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
0b50: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
0b60: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
0b70: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
0b80: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
0b90: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
0ba0: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
0bb0: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
0bc0: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
0bd0: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
0be0: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
0bf0: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
0c00: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
0c10: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
0c20: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
0c30: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
0c40: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
0c50: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
0c60: 72 6e 20 62 79 20 73 71 6c 69 74 65 45 78 70 72  rn by sqliteExpr
0c70: 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71  ListDup(),.** sq
0c80: 6c 69 74 65 49 64 4c 69 73 74 44 75 70 28 29 2c  liteIdListDup(),
0c90: 20 61 6e 64 20 73 71 6c 69 74 65 53 72 63 4c 69   and sqliteSrcLi
0ca0: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
0cb0: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
0cc0: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
0cd0: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
0ce0: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
0cf0: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
0d00: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
0d10: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
0d20: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
0d30: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
0d40: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0d50: 65 45 78 70 72 44 75 70 28 45 78 70 72 20 2a 70  eExprDup(Expr *p
0d60: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
0d70: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
0d80: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
0d90: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
0da0: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
0db0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
0dc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63  return 0;.  memc
0dd0: 70 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65  py(pNew, p, size
0de0: 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66  of(*pNew));.  if
0df0: 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20  ( p->token.z!=0 
0e00: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  ){.    pNew->tok
0e10: 65 6e 2e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72  en.z = sqliteStr
0e20: 44 75 70 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  Dup(p->token.z);
0e30: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
0e40: 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  .dyn = 1;.  }els
0e50: 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  e{.    pNew->tok
0e60: 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 70 4e  en.z = 0;.    pN
0e70: 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b  ew->token.n = 0;
0e80: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
0e90: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  .dyn = 0;.  }.  
0ea0: 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  pNew->span.z = 0
0eb0: 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 6e  ;.  pNew->span.n
0ec0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 70   = 0;.  pNew->sp
0ed0: 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 70 4e  an.dyn = 0;.  pN
0ee0: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
0ef0: 74 65 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 65  teExprDup(p->pLe
0f00: 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  ft);.  pNew->pRi
0f10: 67 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ght = sqliteExpr
0f20: 44 75 70 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  Dup(p->pRight);.
0f30: 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20    pNew->pList = 
0f40: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75  sqliteExprListDu
0f50: 70 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70  p(p->pList);.  p
0f60: 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  New->pSelect = s
0f70: 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28 70  qliteSelectDup(p
0f80: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  ->pSelect);.  re
0f90: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69  turn pNew;.}.voi
0fa0: 64 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70  d sqliteTokenCop
0fb0: 79 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f  y(Token *pTo, To
0fc0: 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  ken *pFrom){.  i
0fd0: 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71  f( pTo->dyn ) sq
0fe0: 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29  liteFree((char*)
0ff0: 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70  pTo->z);.  if( p
1000: 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70  From->z ){.    p
1010: 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e  To->n = pFrom->n
1020: 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 73  ;.    pTo->z = s
1030: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 46 72  qliteStrNDup(pFr
1040: 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29  om->z, pFrom->n)
1050: 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d  ;.    pTo->dyn =
1060: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
1070: 20 70 54 6f 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20   pTo->n = 0;.   
1080: 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20   pTo->z = 0;.   
1090: 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20   pTo->dyn = 0;. 
10a0: 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73   }.}.ExprList *s
10b0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70  qliteExprListDup
10c0: 28 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20  (ExprList *p){. 
10d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b   ExprList *pNew;
10e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
10f0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
1100: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
1110: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
1120: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
1130: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
1140: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
1150: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70   = p->nExpr;.  p
1160: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d  New->a = sqliteM
1170: 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a  alloc( p->nExpr*
1180: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
1190: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
11a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
11b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
11c0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11d0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c   Expr *pNewExpr,
11e0: 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20   *pOldExpr;.    
11f0: 70 4e 65 77 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pNew->a[i].pExpr
1200: 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71   = pNewExpr = sq
1210: 6c 69 74 65 45 78 70 72 44 75 70 28 70 4f 6c 64  liteExprDup(pOld
1220: 45 78 70 72 20 3d 20 70 2d 3e 61 5b 69 5d 2e 70  Expr = p->a[i].p
1230: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
1240: 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21  OldExpr->span.z!
1250: 3d 30 20 26 26 20 70 4e 65 77 45 78 70 72 20 29  =0 && pNewExpr )
1260: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79  {.      /* Alway
1270: 73 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  s make a copy of
1280: 20 74 68 65 20 73 70 61 6e 20 66 6f 72 20 74 6f   the span for to
1290: 70 2d 6c 65 76 65 6c 20 65 78 70 72 65 73 73 69  p-level expressi
12a0: 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ons in the.     
12b0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   ** expression l
12c0: 69 73 74 2e 20 20 54 68 65 20 6c 6f 67 69 63 20  ist.  The logic 
12d0: 69 6e 20 53 45 4c 45 43 54 20 70 72 6f 63 65 73  in SELECT proces
12e0: 73 69 6e 67 20 74 68 61 74 20 64 65 74 65 72 6d  sing that determ
12f0: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ines.      ** th
1300: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
1310: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
1320: 20 73 65 74 20 6e 65 65 64 73 20 74 68 69 73 20   set needs this 
1330: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
1340: 20 20 20 20 20 73 71 6c 69 74 65 54 6f 6b 65 6e       sqliteToken
1350: 43 6f 70 79 28 26 70 4e 65 77 45 78 70 72 2d 3e  Copy(&pNewExpr->
1360: 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d  span, &pOldExpr-
1370: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >span);.    }.  
1380: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78    assert( pNewEx
1390: 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70  pr==0 || pNewExp
13a0: 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20  r->span.z!=0 .  
13b0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c            || pOl
13c0: 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30  dExpr->span.z==0
13d0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
13e0: 63 5f 66 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  c_failed );.    
13f0: 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pNew->a[i].zName
1400: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
1410: 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  p->a[i].zName);.
1420: 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 73      pNew->a[i].s
1430: 6f 72 74 4f 72 64 65 72 20 3d 20 70 2d 3e 61 5b  ortOrder = p->a[
1440: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
1450: 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 69 73 41    pNew->a[i].isA
1460: 67 67 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73 41  gg = p->a[i].isA
1470: 67 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  gg;.    pNew->a[
1480: 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  i].done = 0;.  }
1490: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
14a0: 7d 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  }.SrcList *sqlit
14b0: 65 53 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c  eSrcListDup(SrcL
14c0: 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ist *p){.  SrcLi
14d0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
14e0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
14f0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1500: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
1510: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
1520: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
1530: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
1540: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
1550: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
1560: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
1570: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
1580: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
1590: 3e 6e 53 72 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  >nSrc = p->nSrc;
15a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
15b0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
15c0: 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d   pNew->a[i].zNam
15d0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
15e0: 28 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  (p->a[i].zName);
15f0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e  .    pNew->a[i].
1600: 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 53  zAlias = sqliteS
1610: 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 41  trDup(p->a[i].zA
1620: 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lias);.    pNew-
1630: 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  >a[i].jointype =
1640: 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70   p->a[i].jointyp
1650: 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69  e;.    pNew->a[i
1660: 5d 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ].pTab = 0;.    
1670: 70 4e 65 77 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  pNew->a[i].pSele
1680: 63 74 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  ct = sqliteSelec
1690: 74 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 70 53 65  tDup(p->a[i].pSe
16a0: 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lect);.    pNew-
16b0: 3e 61 5b 69 5d 2e 70 4f 6e 20 3d 20 73 71 6c 69  >a[i].pOn = sqli
16c0: 74 65 45 78 70 72 44 75 70 28 70 2d 3e 61 5b 69  teExprDup(p->a[i
16d0: 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77  ].pOn);.    pNew
16e0: 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 20 3d 20  ->a[i].pUsing = 
16f0: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 75 70 28  sqliteIdListDup(
1700: 70 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b  p->a[i].pUsing);
1710: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
1720: 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71  ew;.}.IdList *sq
1730: 6c 69 74 65 49 64 4c 69 73 74 44 75 70 28 49 64  liteIdListDup(Id
1740: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
1750: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
1760: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
1770: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
1780: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1790: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
17a0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
17b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
17c0: 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64  ew->nId = p->nId
17d0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
17e0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e  liteMalloc( p->n
17f0: 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  Id*sizeof(p->a[0
1800: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ]) );.  if( pNew
1810: 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ->a==0 ) return 
1820: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
1830: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
1840: 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 4e 61    pNew->a[i].zNa
1850: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
1860: 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  p(p->a[i].zName)
1870: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d  ;.    pNew->a[i]
1880: 2e 69 64 78 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69  .idx = p->a[i].i
1890: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
18a0: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
18b0: 2a 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70  *sqliteSelectDup
18c0: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53  (Select *p){.  S
18d0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69  elect *pNew;.  i
18e0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
18f0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
1900: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
1910: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
1920: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
1930: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73  0;.  pNew->isDis
1940: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
1950: 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  tinct;.  pNew->p
1960: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  EList = sqliteEx
1970: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 45 4c  prListDup(p->pEL
1980: 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ist);.  pNew->pS
1990: 72 63 20 3d 20 73 71 6c 69 74 65 53 72 63 4c 69  rc = sqliteSrcLi
19a0: 73 74 44 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a  stDup(p->pSrc);.
19b0: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
19c0: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
19d0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65  ->pWhere);.  pNe
19e0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
19f0: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
1a00: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
1a10: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
1a20: 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 2d  sqliteExprDup(p-
1a30: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65  >pHaving);.  pNe
1a40: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
1a50: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
1a60: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
1a70: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
1a80: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1a90: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44   = sqliteSelectD
1aa0: 75 70 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  up(p->pPrior);. 
1ab0: 20 70 4e 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20   pNew->nLimit = 
1ac0: 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 70 4e 65  p->nLimit;.  pNe
1ad0: 77 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e  w->nOffset = p->
1ae0: 6e 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d  nOffset;.  pNew-
1af0: 3e 7a 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  >zSelect = 0;.  
1b00: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
1b10: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
1b20: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1b30: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
1b40: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
1b50: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
1b60: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
1b70: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
1b80: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
1b90: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
1ba0: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
1bb0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
1bc0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f   Expr *pExpr, To
1bd0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
1be0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1bf0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
1c00: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
1c10: 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  ( sizeof(ExprLis
1c20: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
1c30: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
1c40: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
1c50: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72  (pExpr);.      r
1c60: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1c70: 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d   }.  if( (pList-
1c80: 3e 6e 45 78 70 72 20 26 20 37 29 3d 3d 30 20 29  >nExpr & 7)==0 )
1c90: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c  {.    int n = pL
1ca0: 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 38 3b 0a  ist->nExpr + 8;.
1cb0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
1cc0: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
1cd0: 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
1ce0: 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73  oc(pList->a, n*s
1cf0: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
1d00: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ]));.    if( a==
1d10: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1d20: 65 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  eExprDelete(pExp
1d30: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
1d40: 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20   pList;.    }.  
1d50: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
1d60: 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 20    }.  if( pExpr 
1d70: 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  || pName ){.    
1d80: 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  i = pList->nExpr
1d90: 2b 2b 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ++;.    pList->a
1da0: 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70  [i].pExpr = pExp
1db0: 72 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  r;.    pList->a[
1dc0: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  i].zName = 0;.  
1dd0: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
1de0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
1df0: 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b  tring(&pList->a[
1e00: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  i].zName, pName-
1e10: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29  >z, pName->n, 0)
1e20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  ;.      sqliteDe
1e30: 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  quote(pList->a[i
1e40: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
1e50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
1e60: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  st;.}../*.** Del
1e70: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78  ete an entire ex
1e80: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
1e90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70  /.void sqliteExp
1ea0: 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72  rListDelete(Expr
1eb0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1ec0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1ed0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1ee0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1ef0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1f00: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44  .    sqliteExprD
1f10: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
1f20: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ].pExpr);.    sq
1f30: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
1f40: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
1f50: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
1f60: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
1f70: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
1f80: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
1f90: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
1fa0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
1fb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
1fc0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
1fd0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
1fe0: 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
1ff0: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
2000: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
2010: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
2020: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
2030: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
2040: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
2050: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
2060: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
2070: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
2080: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
2090: 6e 74 20 73 71 6c 69 74 65 45 78 70 72 49 73 43  nt sqliteExprIsC
20a0: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
20b0: 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  {.  switch( p->o
20c0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
20d0: 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _ID:.    case TK
20e0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
20f0: 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 20 20  e TK_DOT:.      
2100: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
2110: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
2120: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
2130: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  R:.    case TK_F
2140: 4c 4f 41 54 3a 0a 20 20 20 20 20 20 72 65 74 75  LOAT:.      retu
2150: 72 6e 20 31 3b 0a 20 20 20 20 64 65 66 61 75 6c  rn 1;.    defaul
2160: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
2170: 2d 3e 70 4c 65 66 74 20 26 26 20 21 73 71 6c 69  ->pLeft && !sqli
2180: 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  teExprIsConstant
2190: 28 70 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  (p->pLeft) ) ret
21a0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28  urn 0;.      if(
21b0: 20 70 2d 3e 70 52 69 67 68 74 20 26 26 20 21 73   p->pRight && !s
21c0: 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74  qliteExprIsConst
21d0: 61 6e 74 28 70 2d 3e 70 52 69 67 68 74 29 20 29  ant(p->pRight) )
21e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
21f0: 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b   if( p->pList ){
2200: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
2210: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2220: 20 69 3c 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78   i<p->pList->nEx
2230: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
2240: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 45      if( !sqliteE
2250: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d  xprIsConstant(p-
2260: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
2270: 70 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  pr) ) return 0;.
2280: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2290: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
22a0: 2d 3e 70 4c 65 66 74 21 3d 30 20 7c 7c 20 70 2d  ->pLeft!=0 || p-
22b0: 3e 70 52 69 67 68 74 21 3d 30 20 7c 7c 20 28 70  >pRight!=0 || (p
22c0: 2d 3e 70 4c 69 73 74 20 26 26 20 70 2d 3e 70 4c  ->pList && p->pL
22d0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 3b 0a 20  ist->nExpr>0);. 
22e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22f0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
2300: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
2310: 73 73 69 6f 6e 20 63 6f 64 65 73 20 61 20 63 6f  ssion codes a co
2320: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 2c 20  nstant integer, 
2330: 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74  return 1 and put
2340: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
2350: 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e 20   the integer in 
2360: 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65  *pValue.  If the
2370: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
2380: 6f 74 20 61 6e 0a 2a 2a 20 69 6e 74 65 67 65 72  ot an.** integer
2390: 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
23a0: 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
23b0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
23c0: 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67  qliteExprIsInteg
23d0: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
23e0: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74  *pValue){.  swit
23f0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
2400: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
2410: 3a 20 7b 0a 20 20 20 20 20 20 2a 70 56 61 6c 75  : {.      *pValu
2420: 65 20 3d 20 61 74 6f 69 28 70 2d 3e 74 6f 6b 65  e = atoi(p->toke
2430: 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n.z);.      retu
2440: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2450: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
2460: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
2470: 61 72 20 2a 7a 20 3d 20 70 2d 3e 74 6f 6b 65 6e  ar *z = p->token
2480: 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  .z;.      int n 
2490: 3d 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  = p->token.n;.  
24a0: 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a      if( n>0 && z
24b0: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b  [0]=='-' ){ z++;
24c0: 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 77 68   n--; }.      wh
24d0: 69 6c 65 28 20 6e 3e 30 20 26 26 20 2a 7a 20 26  ile( n>0 && *z &
24e0: 26 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b  & isdigit(*z) ){
24f0: 20 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20   z++; n--; }.   
2500: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
2510: 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
2520: 20 61 74 6f 69 28 70 2d 3e 74 6f 6b 65 6e 2e 7a   atoi(p->token.z
2530: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2540: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2550: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2560: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
2570: 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  S: {.      retur
2580: 6e 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e  n sqliteExprIsIn
2590: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
25a0: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20  pValue);.    }. 
25b0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
25c0: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
25d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
25e0: 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  teExprIsInteger(
25f0: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
2600: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
2610: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
2620: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
2630: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2640: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
2650: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2660: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2670: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2680: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
2690: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
26a0: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
26b0: 20 73 71 6c 69 74 65 49 73 52 6f 77 69 64 28 63   sqliteIsRowid(c
26c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
26d0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
26e0: 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29  mp(z, "_ROWID_")
26f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
2700: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
2710: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
2720: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
2730: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
2740: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
2750: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
2760: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2770: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
2780: 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f  lks an expressio
2790: 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c  n tree and resol
27a0: 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20 74  ves references t
27b0: 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d  o.** table colum
27c0: 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68  ns.  Nodes of th
27d0: 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20  e form ID.ID or 
27e0: 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20  ID resolve into 
27f0: 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74  an.** index to t
2800: 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  he table in the 
2810: 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61  table list and a
2820: 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20   column offset. 
2830: 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70   The .** Expr.op
2840: 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f  code for such no
2850: 64 65 73 20 69 73 20 63 68 61 6e 67 65 64 20 74  des is changed t
2860: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68  o TK_COLUMN.  Th
2870: 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a  e Expr.iTable.**
2880: 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65   value is change
2890: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  d to the index o
28a0: 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  f the referenced
28b0: 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
28c0: 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22  st.** plus the "
28d0: 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68  base" value.  Th
28e0: 65 20 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c  e base value wil
28f0: 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63  l ultimately bec
2900: 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20  ome the.** VDBE 
2910: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
2920: 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
2930: 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f  is pointing into
2940: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a   the referenced.
2950: 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45  ** table.  The E
2960: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  xpr.iColumn valu
2970: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
2980: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
2990: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74   column .** of t
29a0: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
29b0: 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ble.  The Expr.i
29c0: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72  Column value for
29d0: 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20   the special.** 
29e0: 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20  ROWID column is 
29f0: 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52  -1.  Any INTEGER
2a00: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
2a10: 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73 20  umn is tried as 
2a20: 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20  an.** alias for 
2a30: 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  ROWID..**.** We 
2a40: 61 6c 73 6f 20 63 68 65 63 6b 20 66 6f 72 20 69  also check for i
2a50: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
2a60: 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 4e  IN operator.  IN
2a70: 20 63 6f 6d 65 73 20 69 6e 20 74 77 6f 0a 2a 2a   comes in two.**
2a80: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
2a90: 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e 20          expr IN 
2aa0: 28 65 78 70 72 6c 69 73 74 29 0a 2a 2a 20 61 6e  (exprlist).** an
2ab0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65  d.**           e
2ac0: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
2ad0: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ..).**.** The fi
2ae0: 72 73 74 20 66 6f 72 6d 20 69 73 20 68 61 6e 64  rst form is hand
2af0: 6c 65 64 20 62 79 20 63 72 65 61 74 69 6e 67 20  led by creating 
2b00: 61 20 73 65 74 20 68 6f 6c 64 69 6e 67 20 74 68  a set holding th
2b10: 65 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c  e list.** of all
2b20: 6f 77 65 64 20 76 61 6c 75 65 73 2e 20 20 54 68  owed values.  Th
2b30: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 61  e second form ca
2b40: 75 73 65 73 20 74 68 65 20 53 45 4c 45 43 54 20  uses the SELECT 
2b50: 74 6f 20 67 65 6e 65 72 61 74 65 20 0a 2a 2a 20  to generate .** 
2b60: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
2b70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2b80: 75 74 69 6e 65 20 61 6c 73 6f 20 6c 6f 6f 6b 73  utine also looks
2b90: 20 66 6f 72 20 73 63 61 6c 61 72 20 53 45 4c 45   for scalar SELE
2ba0: 43 54 73 20 74 68 61 74 20 61 72 65 20 70 61 72  CTs that are par
2bb0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
2bc0: 6f 6e 2e 0a 2a 2a 20 49 66 20 69 74 20 66 69 6e  on..** If it fin
2bd0: 64 73 20 61 6e 79 2c 20 69 74 20 67 65 6e 65 72  ds any, it gener
2be0: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 77 72 69  ates code to wri
2bf0: 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
2c00: 74 68 61 74 20 73 65 6c 65 63 74 0a 2a 2a 20 69  that select.** i
2c10: 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  nto a memory cel
2c20: 6c 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f 77 6e  l..**.** Unknown
2c30: 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 74 61 62 6c   columns or tabl
2c40: 65 73 20 70 72 6f 76 6f 6b 65 20 61 6e 20 65 72  es provoke an er
2c50: 72 6f 72 2e 20 20 54 68 65 20 66 75 6e 63 74 69  ror.  The functi
2c60: 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68  on returns.** th
2c70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2c80: 72 73 20 73 65 65 6e 20 61 6e 64 20 6c 65 61 76  rs seen and leav
2c90: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
2ca0: 61 67 65 20 6f 6e 20 70 50 61 72 73 65 2d 3e 7a  age on pParse->z
2cb0: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
2cc0: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
2cd0: 49 64 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Ids(.  Parse *pP
2ce0: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
2cf0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
2d00: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20  */.  int base,  
2d10: 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
2d20: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
2d30: 72 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  r first entry in
2d40: 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 53   pTabList */.  S
2d50: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2d60: 2c 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62  , /* List of tab
2d70: 6c 65 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f  les used to reso
2d80: 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  lve column names
2d90: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2da0: 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  pEList,  /* List
2db0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
2dc0: 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20  used to resolve 
2dd0: 22 41 53 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a  "AS" */.  Expr *
2de0: 70 45 78 70 72 20 20 20 20 20 20 20 20 2f 2a 20  pExpr        /* 
2df0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
2e00: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a  o be analyzed. *
2e10: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  /.){.  if( pExpr
2e20: 3d 3d 30 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  ==0 || pTabList=
2e30: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2e40: 20 61 73 73 65 72 74 28 20 62 61 73 65 2b 70 54   assert( base+pT
2e50: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3c 3d 70 50  abList->nSrc<=pP
2e60: 61 72 73 65 2d 3e 6e 54 61 62 20 29 3b 0a 20 20  arse->nTab );.  
2e70: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
2e80: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 75 62  p ){.    /* Doub
2e90: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
2ea0: 73 20 28 65 78 3a 20 22 61 62 63 22 29 20 61 72  s (ex: "abc") ar
2eb0: 65 20 75 73 65 64 20 61 73 20 69 64 65 6e 74 69  e used as identi
2ec0: 66 69 65 72 73 20 69 66 0a 20 20 20 20 2a 2a 20  fiers if.    ** 
2ed0: 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74 68 65 72  possible.  Other
2ee0: 77 69 73 65 20 74 68 65 79 20 72 65 6d 61 69 6e  wise they remain
2ef0: 20 61 73 20 73 74 72 69 6e 67 73 2e 20 20 53 69   as strings.  Si
2f00: 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20 20 20 20  ngle-quoted.    
2f10: 2a 2a 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20  ** strings (ex: 
2f20: 27 61 62 63 27 29 20 61 72 65 20 61 6c 77 61 79  'abc') are alway
2f30: 73 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  s string literal
2f40: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
2f50: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
2f60: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2f70: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27  >token.z[0]=='\'
2f80: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ' ) break;.     
2f90: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e   /* Fall thru in
2fa0: 74 6f 20 74 68 65 20 54 4b 5f 49 44 20 63 61 73  to the TK_ID cas
2fb0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 64  e if this is a d
2fc0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
2fd0: 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ing */.    }.   
2fe0: 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74   /* A lone ident
2ff0: 69 66 69 65 72 2e 20 20 54 72 79 20 61 6e 64 20  ifier.  Try and 
3000: 6d 61 74 63 68 20 69 74 20 61 73 20 66 6f 6c 6c  match it as foll
3010: 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ows:.    **.    
3020: 2a 2a 20 20 20 20 20 31 2e 20 20 54 6f 20 74 68  **     1.  To th
3030: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
3040: 6d 6e 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  mn of one of the
3050: 20 74 61 62 6c 65 73 20 69 6e 20 70 54 61 62 4c   tables in pTabL
3060: 69 73 74 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ist.    **.    *
3070: 2a 20 20 20 20 20 32 2e 20 20 54 6f 20 74 68 65  *     2.  To the
3080: 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 61   right side of a
3090: 6e 20 41 53 20 6b 65 79 77 6f 72 64 20 69 6e 20  n AS keyword in 
30a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  the column list 
30b0: 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  of.    **       
30c0: 20 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65    a SELECT state
30d0: 6d 65 6e 74 2e 20 20 28 46 6f 72 20 65 78 61 6d  ment.  (For exam
30e0: 70 6c 65 2c 20 6d 61 74 63 68 20 61 67 61 69 6e  ple, match again
30f0: 73 74 20 27 78 27 20 69 6e 0a 20 20 20 20 2a 2a  st 'x' in.    **
3100: 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
3110: 20 61 2b 62 20 41 53 20 27 78 27 20 46 52 4f 4d   a+b AS 'x' FROM
3120: 20 74 31 22 2e 29 0a 20 20 20 20 2a 2a 0a 20 20   t1".).    **.  
3130: 20 20 2a 2a 20 20 20 20 20 33 2e 20 20 4f 6e 65    **     3.  One
3140: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
3150: 6e 61 6d 65 73 20 22 52 4f 57 49 44 22 2c 20 22  names "ROWID", "
3160: 4f 49 44 22 2c 20 6f 72 20 22 5f 52 4f 57 49 44  OID", or "_ROWID
3170: 5f 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  _"..    */.    c
3180: 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20  ase TK_ID: {.   
3190: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20     int cnt = 0; 
31a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
31b0: 66 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  f matches */.   
31c0: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
31d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
31e0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 68  nter */.      ch
31f0: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 61 73 73  ar *z;.      ass
3200: 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ert( pExpr->toke
3210: 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d  n.z );.      z =
3220: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
3230: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
3240: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
3250: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
3260: 6f 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 69 66  ote(z);.      if
3270: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
3280: 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  1;.      for(i=0
3290: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
32a0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
32b0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
32c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
32d0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  TabList->a[i].pT
32e0: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ab;.        if( 
32f0: 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pTab==0 ) contin
3300: 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ue;.        asse
3310: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
3320: 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
3330: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
3340: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
3350: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
3360: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
3370: 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 29 3d 3d 30 20  j].zName, z)==0 
3380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
3390: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
33a0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
33b0: 3d 20 69 20 2b 20 62 61 73 65 3b 0a 20 20 20 20  = i + base;.    
33c0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70          if( j==p
33d0: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
33f0: 75 62 73 74 69 74 75 74 65 20 74 68 65 20 72 65  ubstitute the re
3400: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
3410: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
3420: 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20  ARY KEY */.     
3430: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
3440: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
3450: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
3460: 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51  r->dataType = SQ
3470: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20  LITE_SO_NUM;.   
3480: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
34a0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
34b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
34c0: 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20  pExpr->dataType 
34d0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
34e0: 73 6f 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49  sortOrder & SQLI
34f0: 54 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 3b 0a  TE_SO_TYPEMASK;.
3500: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3510: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
3520: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
3530: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3550: 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20       if( cnt==0 
3560: 26 26 20 70 45 4c 69 73 74 21 3d 30 20 29 7b 0a  && pEList!=0 ){.
3570: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
3580: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
3590: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
35a0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
35b0: 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c   char *zAs = pEL
35c0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
35d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
35e0: 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 53  As!=0 && sqliteS
35f0: 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 29 3d 3d  trICmp(zAs, z)==
3600: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
3610: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
3620: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
3630: 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
3640: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
3650: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
3660: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53  Expr->op = TK_AS
3670: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
3680: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
3690: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
36a0: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
36b0: 69 74 65 45 78 70 72 44 75 70 28 70 45 4c 69 73  iteExprDup(pELis
36c0: 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a  t->a[j].pExpr);.
36d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
36e0: 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 20      } .      }. 
36f0: 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20       if( cnt==0 
3700: 26 26 20 73 71 6c 69 74 65 49 73 52 6f 77 69 64  && sqliteIsRowid
3710: 28 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  (z) ){.        p
3720: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
3730: 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  -1;.        pExp
3740: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 62 61 73 65  r->iTable = base
3750: 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20  ;.        cnt = 
3760: 31 20 2b 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e  1 + (pTabList->n
3770: 53 72 63 3e 31 29 3b 0a 20 20 20 20 20 20 20 20  Src>1);.        
3780: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
3790: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70  OLUMN;.        p
37a0: 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d  Expr->dataType =
37b0: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a   SQLITE_SO_NUM;.
37c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
37d0: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
37e0: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26     if( cnt==0 &&
37f0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b   pExpr->token.z[
3800: 30 5d 21 3d 27 22 27 20 29 7b 0a 20 20 20 20 20  0]!='"' ){.     
3810: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
3820: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
3830: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 63  rMsg, "no such c
3840: 6f 6c 75 6d 6e 3a 20 22 2c 20 2d 31 2c 20 20 0a  olumn: ", -1,  .
3850: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
3860: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
3870: 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20  >token.n, 0);.  
3880: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
3890: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65  rr++;.        re
38a0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
38b0: 6c 73 65 20 69 66 28 20 63 6e 74 3e 31 20 29 7b  lse if( cnt>1 ){
38c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
38d0: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
38e0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61 6d 62  e->zErrMsg, "amb
38f0: 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61  iguous column na
3900: 6d 65 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20  me: ", -1,  .   
3910: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
3920: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
3930: 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ken.n, 0);.     
3940: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3950: 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  +;.        retur
3960: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
3970: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
3980: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
3990: 20 20 20 20 20 20 20 73 71 6c 69 74 65 41 75 74         sqliteAut
39a0: 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45  hRead(pParse, pE
39b0: 78 70 72 2c 20 70 54 61 62 4c 69 73 74 2c 20 62  xpr, pTabList, b
39c0: 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ase);.      }.  
39d0: 20 20 20 20 62 72 65 61 6b 3b 20 0a 20 20 20 20      break; .    
39e0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61  }.  .    /* A ta
39f0: 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c  ble name and col
3a00: 75 6d 6e 20 6e 61 6d 65 3a 20 20 49 44 2e 49 44  umn name:  ID.ID
3a10: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
3a20: 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  DOT: {.      int
3a30: 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20   cnt = 0;       
3a40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3a50: 6f 66 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  of matches */.  
3a60: 20 20 20 20 69 6e 74 20 63 6e 74 54 61 62 20 3d      int cntTab =
3a70: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
3a80: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
3a90: 6e 67 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  ng tables */.   
3aa0: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3ac0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
3ad0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
3ae0: 2c 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  , *pRight;    /*
3af0: 20 4c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   Left and right 
3b00: 73 75 62 62 72 61 6e 63 68 65 73 20 6f 66 20 74  subbranches of t
3b10: 68 65 20 65 78 70 72 20 2a 2f 0a 20 20 20 20 20  he expr */.     
3b20: 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c 20 2a 7a   char *zLeft, *z
3b30: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 54 65 78  Right;    /* Tex
3b40: 74 20 6f 66 20 61 6e 20 69 64 65 6e 74 69 66 69  t of an identifi
3b50: 65 72 20 2a 2f 0a 0a 20 20 20 20 20 20 70 4c 65  er */..      pLe
3b60: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
3b70: 74 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  t;.      pRight 
3b80: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
3b90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3ba0: 4c 65 66 74 20 26 26 20 70 4c 65 66 74 2d 3e 6f  Left && pLeft->o
3bb0: 70 3d 3d 54 4b 5f 49 44 20 26 26 20 70 4c 65 66  p==TK_ID && pLef
3bc0: 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20  t->token.z );.  
3bd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
3be0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70  ht && pRight->op
3bf0: 3d 3d 54 4b 5f 49 44 20 26 26 20 70 52 69 67 68  ==TK_ID && pRigh
3c00: 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20  t->token.z );.  
3c10: 20 20 20 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69      zLeft = sqli
3c20: 74 65 53 74 72 4e 44 75 70 28 70 4c 65 66 74 2d  teStrNDup(pLeft-
3c30: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d  >token.z, pLeft-
3c40: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
3c50: 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   zRight = sqlite
3c60: 53 74 72 4e 44 75 70 28 70 52 69 67 68 74 2d 3e  StrNDup(pRight->
3c70: 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d  token.z, pRight-
3c80: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
3c90: 20 69 66 28 20 7a 4c 65 66 74 3d 3d 30 20 7c 7c   if( zLeft==0 ||
3ca0: 20 7a 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   zRight==0 ){.  
3cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
3cc0: 28 7a 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  (zLeft);.       
3cd0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67   sqliteFree(zRig
3ce0: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ht);.        ret
3cf0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
3d00: 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f       sqliteDequo
3d10: 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 20 20 20  te(zLeft);.     
3d20: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
3d30: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 45  Right);.      pE
3d40: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31  xpr->iTable = -1
3d50: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
3d60: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
3d70: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
3d80: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
3d90: 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20 20 20  char *zTab;.    
3da0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
3db0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
3dc0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  .pTab;.        i
3dd0: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e  f( pTab==0 ) con
3de0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
3df0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
3e00: 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
3e10: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
3e20: 5d 2e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ].zAlias ){.    
3e30: 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61        zTab = pTa
3e40: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  bList->a[i].zAli
3e50: 61 73 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  as;.        }els
3e60: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 61  e{.          zTa
3e70: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
3e80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3e90: 20 20 20 69 66 28 20 7a 54 61 62 3d 3d 30 20 7c     if( zTab==0 |
3ea0: 7c 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  | sqliteStrICmp(
3eb0: 7a 54 61 62 2c 20 7a 4c 65 66 74 29 21 3d 30 20  zTab, zLeft)!=0 
3ec0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
3ed0: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
3ee0: 61 62 2b 2b 29 20 29 20 70 45 78 70 72 2d 3e 69  ab++) ) pExpr->i
3ef0: 54 61 62 6c 65 20 3d 20 69 20 2b 20 62 61 73 65  Table = i + base
3f00: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
3f10: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
3f20: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
3f30: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
3f40: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  mp(pTab->aCol[j]
3f50: 2e 7a 4e 61 6d 65 2c 20 7a 52 69 67 68 74 29 3d  .zName, zRight)=
3f60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3f70: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
3f80: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
3f90: 6c 65 20 3d 20 69 20 2b 20 62 61 73 65 3b 0a 20  le = i + base;. 
3fa0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
3fb0: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
3fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
3fd0: 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65  * Substitute the
3fe0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
3ff0: 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  or the INTEGER P
4000: 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20  RIMARY KEY */.  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
4020: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  r->iColumn = -1;
4030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
4040: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
4050: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
4060: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
4070: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
4080: 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20  pExpr->dataType 
4090: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
40a0: 73 6f 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49  sortOrder & SQLI
40b0: 54 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 3b 0a  TE_SO_TYPEMASK;.
40c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
40d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
40e0: 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61       /* If we ha
40f0: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72  ve not already r
4100: 65 73 6f 6c 76 65 64 20 74 68 69 73 20 2a 2e 2a  esolved this *.*
4110: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
4120: 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 20 20 20  n maybe .       
4130: 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20  * it is a new.* 
4140: 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72  or old.* trigger
4150: 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65   argument refere
4160: 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nce */.      if(
4170: 20 63 6e 74 20 3d 3d 20 30 20 26 26 20 70 50 61   cnt == 0 && pPa
4180: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 21  rse->trigStack !
4190: 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 54  = 0 ){.        T
41a0: 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72  riggerStack *pTr
41b0: 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61  iggerStack = pPa
41c0: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a  rse->trigStack;.
41d0: 20 20 20 20 20 20 20 20 69 6e 74 20 74 20 3d 20          int t = 
41e0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  0;.        if( p
41f0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
4200: 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71  wIdx != -1 && sq
4210: 6c 69 74 65 53 74 72 49 43 6d 70 28 22 6e 65 77  liteStrICmp("new
4220: 22 2c 20 7a 4c 65 66 74 29 20 3d 3d 20 30 20 29  ", zLeft) == 0 )
4230: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
4240: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
4250: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64  ggerStack->newId
4260: 78 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74  x;.          cnt
4270: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
4280: 20 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20   t = 1;.        
4290: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  }.        if( pT
42a0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
42b0: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
42c0: 69 74 65 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  iteStrICmp("old"
42d0: 2c 20 7a 4c 65 66 74 29 20 3d 3d 20 30 20 29 7b  , zLeft) == 0 ){
42e0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
42f0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67  ->iTable = pTrig
4300: 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78  gerStack->oldIdx
4310: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 54  ;.          cntT
4320: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
4330: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
4340: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 20  ..        if( t 
4350: 29 7b 20 0a 09 20 20 69 6e 74 20 6a 3b 0a 20 20  ){ ..  int j;.  
4360: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
4370: 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74  Tab = pTriggerSt
4380: 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  ack->pTab;.     
4390: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 20       for(j=0; j 
43a0: 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  < pTab->nCol; j+
43b0: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  +) {.           
43c0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
43d0: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  mp(pTab->aCol[j]
43e0: 2e 7a 4e 61 6d 65 2c 20 7a 52 69 67 68 74 29 3d  .zName, zRight)=
43f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4400: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
4410: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
4420: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  iColumn = j;.   
4430: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
4440: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 70 54 61  ->dataType = pTa
4450: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 73 6f 72 74 4f  b->aCol[j].sortO
4460: 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f  rder & SQLITE_SO
4470: 5f 54 59 50 45 4d 41 53 4b 3b 0a 20 20 20 20 20  _TYPEMASK;.     
4480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4490: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a     }..}.      }.
44a0: 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  .      if( cnt==
44b0: 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26  0 && cntTab==1 &
44c0: 26 20 73 71 6c 69 74 65 49 73 52 6f 77 69 64 28  & sqliteIsRowid(
44d0: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
44e0: 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20     cnt = 1;.    
44f0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4500: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
4510: 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65   pExpr->dataType
4520: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d   = SQLITE_SO_NUM
4530: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4540: 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 65 66 74  sqliteFree(zLeft
4550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
4560: 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  ree(zRight);.   
4570: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b     if( cnt==0 ){
4580: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
4590: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
45a0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
45b0: 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 22 2c 20  such column: ", 
45c0: 2d 31 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20  -1,  .          
45d0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pLeft->token.z, 
45e0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pLeft->token.n, 
45f0: 22 2e 22 2c 20 31 2c 20 0a 20 20 20 20 20 20 20  ".", 1, .       
4600: 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e     pRight->token
4610: 2e 7a 2c 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65  .z, pRight->toke
4620: 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  n.n, 0);.       
4630: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
4640: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4650: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4660: 66 28 20 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20  f( cnt>1 ){.    
4670: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
4680: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
4690: 72 72 4d 73 67 2c 20 22 61 6d 62 69 67 75 6f 75  rrMsg, "ambiguou
46a0: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 22  s column name: "
46b0: 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20 20 20 20  , -1,  .        
46c0: 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a    pLeft->token.z
46d0: 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e  , pLeft->token.n
46e0: 2c 20 22 2e 22 2c 20 31 2c 0a 20 20 20 20 20 20  , ".", 1,.      
46f0: 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65      pRight->toke
4700: 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e 74 6f 6b  n.z, pRight->tok
4710: 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  en.n, 0);.      
4720: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
4730: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
4740: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
4750: 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
4760: 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  te(pLeft);.     
4770: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
4780: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  0;.      sqliteE
4790: 78 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74  xprDelete(pRight
47a0: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
47b0: 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  pRight = 0;.    
47c0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
47d0: 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 73  _COLUMN;.      s
47e0: 71 6c 69 74 65 41 75 74 68 52 65 61 64 28 70 50  qliteAuthRead(pP
47f0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 54 61  arse, pExpr, pTa
4800: 62 4c 69 73 74 2c 20 62 61 73 65 29 3b 0a 20 20  bList, base);.  
4810: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4820: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ..    case TK_IN
4830: 3a 20 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a  : {.      Vdbe *
4840: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
4850: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
4860: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
4870: 72 6e 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 1;.      if( 
4880: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
4890: 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73  eIds(pParse, bas
48a0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
48b0: 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  ist, pExpr->pLef
48c0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  t) ){.        re
48d0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
48e0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
48f0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
4900: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
4910: 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
4920: 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
4930: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
4940: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
4950: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
4960: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
4970: 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 0a  nto a temporary.
4980: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
4990: 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
49a0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
49b0: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 61 73 20  orary table has 
49c0: 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 20 20  already.        
49d0: 2a 2a 20 62 65 65 6e 20 70 75 74 20 69 6e 20 69  ** been put in i
49e0: 54 61 62 6c 65 20 62 79 20 73 71 6c 69 74 65 45  Table by sqliteE
49f0: 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65  xprResolveInSele
4a00: 63 74 28 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ct()..        */
4a10: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
4a20: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
4a30: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
4a40: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4a50: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
4a60: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
4a70: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
4a80: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
4a90: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
4aa0: 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d   SRT_Set, pExpr-
4ab0: 3e 69 54 61 62 6c 65 2c 20 30 2c 30 2c 30 29 3b  >iTable, 0,0,0);
4ac0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
4ad0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
4ae0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
4af0: 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
4b00: 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
4b10: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
4b20: 20 43 72 65 61 74 65 20 61 20 73 65 74 20 74 6f   Create a set to
4b30: 20 70 75 74 20 74 68 65 20 65 78 70 72 6c 69 73   put the exprlis
4b40: 74 20 76 61 6c 75 65 73 20 69 6e 2e 20 20 54 68  t values in.  Th
4b50: 65 20 53 65 74 20 69 64 20 69 73 20 73 74 6f 72  e Set id is stor
4b60: 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ed.        ** in
4b70: 20 69 54 61 62 6c 65 2e 0a 20 20 20 20 20 20 20   iTable..       
4b80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
4b90: 69 2c 20 69 53 65 74 3b 0a 20 20 20 20 20 20 20  i, iSet;.       
4ba0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70   for(i=0; i<pExp
4bb0: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  r->pList->nExpr;
4bc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
4bd0: 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78   Expr *pE2 = pEx
4be0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pr->pList->a[i].
4bf0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
4c00: 20 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72   if( !sqliteExpr
4c10: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
4c20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
4c30: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
4c40: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
4c50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
4c60: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
4c70: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d  of IN operator m
4c80: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 22  ust be constant"
4c90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
4ca0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
4cb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
4cc0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
4cd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
4ce0: 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
4cf0: 6b 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 30  k(pParse, pE2, 0
4d00: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
4d10: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4d20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4d30: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 53 65 74    }.        iSet
4d40: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
4d50: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 2b   = pParse->nSet+
4d60: 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  +;.        for(i
4d70: 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69  =0; i<pExpr->pLi
4d80: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
4d90: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
4da0: 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c  *pE2 = pExpr->pL
4db0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
4dc0: 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63  .          switc
4dd0: 68 28 20 70 45 32 2d 3e 6f 70 20 29 7b 0a 20 20  h( pE2->op ){.  
4de0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
4df0: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20  K_FLOAT:.       
4e00: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54       case TK_INT
4e10: 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20  EGER:.          
4e20: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
4e30: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
4e40: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
4e50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4e60: 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 69 53  OP_SetInsert, iS
4e70: 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  et, 0);.        
4e80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
4e90: 32 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20  2->token.z );.  
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
4eb0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
4ec0: 2c 20 61 64 64 72 2c 20 70 45 32 2d 3e 74 6f 6b  , addr, pE2->tok
4ed0: 65 6e 2e 7a 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e  en.z, pE2->token
4ee0: 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  .n);.           
4ef0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71     sqliteVdbeDeq
4f00: 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b  uoteP3(v, addr);
4f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
4f20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
4f30: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
4f40: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4f50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45           sqliteE
4f60: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
4f70: 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pE2);.          
4f80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4f90: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 49 6e 73  dOp(v, OP_SetIns
4fa0: 65 72 74 2c 20 69 53 65 74 2c 20 30 29 3b 0a 20  ert, iSet, 0);. 
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
4fc0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
4fd0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
4fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4ff0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5000: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
5010: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
5020: 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62  /* This has to b
5030: 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43  e a scalar SELEC
5040: 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64  T.  Generate cod
5050: 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20  e to put the.   
5060: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
5070: 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20  his select in a 
5080: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
5090: 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  record the numbe
50a0: 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  r.      ** of th
50b0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  e memory cell in
50c0: 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20   iColumn..      
50d0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
50e0: 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 61 72 73 65  iColumn = pParse
50f0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
5100: 69 66 28 20 73 71 6c 69 74 65 53 65 6c 65 63 74  if( sqliteSelect
5110: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
5120: 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 4d 65 6d  pSelect, SRT_Mem
5130: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
5140: 2c 30 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20  ,0,0,0) ){.     
5150: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
5160: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
5170: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5180: 46 6f 72 20 61 6c 6c 20 65 6c 73 65 2c 20 6a 75  For all else, ju
5190: 73 74 20 72 65 63 75 72 73 69 76 65 6c 79 20 77  st recursively w
51a0: 61 6c 6b 20 74 68 65 20 74 72 65 65 20 2a 2f 0a  alk the tree */.
51b0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
51c0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
51d0: 70 4c 65 66 74 0a 20 20 20 20 20 20 26 26 20 73  pLeft.      && s
51e0: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
51f0: 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65  Ids(pParse, base
5200: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
5210: 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  st, pExpr->pLeft
5220: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
5230: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
5240: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
5250: 70 52 69 67 68 74 20 0a 20 20 20 20 20 20 26 26  pRight .      &&
5260: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
5270: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 62 61  veIds(pParse, ba
5280: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
5290: 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  List, pExpr->pRi
52a0: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ght) ){.        
52b0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
52c0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
52d0: 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  r->pList ){.    
52e0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
52f0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
5300: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
5310: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  t;.        for(i
5320: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
5330: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
5340: 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d      Expr *pArg =
5350: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
5360: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
5370: 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
5380: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 62  lveIds(pParse, b
5390: 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  ase, pTabList, p
53a0: 45 4c 69 73 74 2c 20 70 41 72 67 29 20 29 7b 0a  EList, pArg) ){.
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
53c0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 1;.          
53d0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
53e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
53f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
5400: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 6e 6f  ** pExpr is a no
5410: 64 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  de that defines 
5420: 61 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f  a function of so
5430: 6d 65 20 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67  me kind.  It mig
5440: 68 74 0a 2a 2a 20 62 65 20 61 20 73 79 6e 74 61  ht.** be a synta
5450: 63 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69  ctic function li
5460: 6b 65 20 22 63 6f 75 6e 74 28 78 29 22 20 6f 72  ke "count(x)" or
5470: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 66   it might be a f
5480: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  unction.** that 
5490: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70  implements an op
54a0: 65 72 61 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20  erator, like "a 
54b0: 4c 49 4b 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a  LIKE b".  .**.**
54c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
54d0: 6b 65 73 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e  kes *pzName poin
54e0: 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66  t to the name of
54f0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e   the function an
5500: 64 20 0a 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f  d .** *pnName ho
5510: 6c 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ld the number of
5520: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
5530: 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
5540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5550: 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65   getFunctionName
5560: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f  (Expr *pExpr, co
5570: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d  nst char **pzNam
5580: 65 2c 20 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b  e, int *pnName){
5590: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
55a0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
55b0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
55c0: 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20        *pzName = 
55d0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
55e0: 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20        *pnName = 
55f0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a  pExpr->token.n;.
5600: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5610: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
5620: 49 4b 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a  IKE: {.      *pz
5630: 4e 61 6d 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20  Name = "like";. 
5640: 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34       *pnName = 4
5650: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5660: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
5670: 5f 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a  _GLOB: {.      *
5680: 70 7a 4e 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b  pzName = "glob";
5690: 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d  .      *pnName =
56a0: 20 34 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   4;.      break;
56b0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
56c0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  lt: {.      *pzN
56d0: 61 6d 65 20 3d 20 22 63 61 6e 27 74 20 68 61 70  ame = "can't hap
56e0: 70 65 6e 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e  pen";.      *pnN
56f0: 61 6d 65 20 3d 20 31 32 3b 0a 20 20 20 20 20 20  ame = 12;.      
5700: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
5710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20  .}../*.** Error 
5720: 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69  check the functi
5730: 6f 6e 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73  ons in an expres
5740: 73 69 6f 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65  sion.  Make sure
5750: 20 61 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   all.** function
5760: 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67   names are recog
5770: 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75  nized and all fu
5780: 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 74 68 65  nctions have the
5790: 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62   correct.** numb
57a0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
57b0: 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72    Leave an error
57c0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
57d0: 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69  se->zErrMsg.** i
57e0: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d  f anything is am
57f0: 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  iss.  Return the
5800: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
5810: 73 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41  s..**.** if pIsA
5820: 67 67 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61  gg is not null a
5830: 6e 64 20 74 68 69 73 20 65 78 70 72 65 73 73 69  nd this expressi
5840: 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  on is an aggrega
5850: 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28  te function.** (
5860: 6c 69 6b 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72  like count(*) or
5870: 20 6d 61 78 28 76 61 6c 75 65 29 29 20 74 68 65   max(value)) the
5880: 6e 20 77 72 69 74 65 20 61 20 31 20 69 6e 74 6f  n write a 1 into
5890: 20 2a 70 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74   *pIsAgg..*/.int
58a0: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
58b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
58c0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
58d0: 20 61 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20 2a   allowAgg, int *
58e0: 70 49 73 41 67 67 29 7b 0a 20 20 69 6e 74 20 6e  pIsAgg){.  int n
58f0: 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Err = 0;.  if( p
5900: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
5910: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   0;.  switch( pE
5920: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
5930: 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20  ase TK_GLOB:.   
5940: 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20   case TK_LIKE:. 
5950: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
5960: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
5970: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73   n = pExpr->pLis
5980: 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t ? pExpr->pList
5990: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a  ->nExpr : 0;  /*
59a0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
59b0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
59c0: 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d  t no_such_func =
59d0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75   0;       /* Tru
59e0: 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e  e if no such fun
59f0: 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a  ction exists */.
5a00: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 74 79 70        int is_typ
5a10: 65 5f 6f 66 20 3d 20 30 3b 20 20 20 20 20 20 20  e_of = 0;       
5a20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
5a30: 74 68 65 20 73 70 65 63 69 61 6c 20 54 79 70 65  the special Type
5a40: 4f 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  Of() function */
5a50: 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67  .      int wrong
5a60: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20  _num_args = 0;  
5a70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72     /* True if wr
5a80: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
5a90: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
5aa0: 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b   int is_agg = 0;
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ac0: 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67  True if is an ag
5ad0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
5ae0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
5af0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20  .      int nId; 
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5b20: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75  characters in fu
5b30: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
5b40: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5b50: 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  *zId;           
5b60: 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
5b70: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   name. */.      
5b80: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 0a  FuncDef *pDef;..
5b90: 20 20 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f        getFunctio
5ba0: 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49  nName(pExpr, &zI
5bb0: 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20  d, &nId);.      
5bc0: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 46 69 6e  pDef = sqliteFin
5bd0: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
5be0: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
5bf0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
5c00: 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pDef==0 ){.    
5c10: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
5c20: 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  eFindFunction(pP
5c30: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
5c40: 49 64 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  Id, -1, 0);.    
5c50: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
5c60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
5c70: 20 6e 3d 3d 31 20 26 26 20 6e 49 64 3d 3d 36 20   n==1 && nId==6 
5c80: 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  && sqliteStrNICm
5c90: 70 28 7a 49 64 2c 20 22 74 79 70 65 6f 66 22 2c  p(zId, "typeof",
5ca0: 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   6)==0 ){.      
5cb0: 20 20 20 20 20 20 69 73 5f 74 79 70 65 5f 6f 66        is_type_of
5cc0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
5cd0: 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20  }else {.        
5ce0: 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63      no_such_func
5cf0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
5d00: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
5d10: 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67  .          wrong
5d20: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20  _num_args = 1;. 
5d30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5d40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
5d50: 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75  _agg = pDef->xFu
5d60: 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20  nc==0;.      }. 
5d70: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
5d80: 26 26 20 21 61 6c 6c 6f 77 41 67 67 20 29 7b 0a  && !allowAgg ){.
5d90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
5da0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
5db0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6d 69 73 75  ->zErrMsg, "misu
5dc0: 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  se of aggregate 
5dd0: 66 75 6e 63 74 69 6f 6e 20 22 2c 20 2d 31 2c 0a  function ", -1,.
5de0: 20 20 20 20 20 20 20 20 20 20 20 7a 49 64 2c 20             zId, 
5df0: 6e 49 64 2c 20 22 28 29 22 2c 20 32 2c 20 30 29  nId, "()", 2, 0)
5e00: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
5e10: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
5e20: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
5e30: 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20    is_agg = 0;.  
5e40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f      }else if( no
5e50: 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20  _such_func ){.  
5e60: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
5e70: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
5e80: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
5e90: 68 20 66 75 6e 63 74 69 6f 6e 3a 20 22 2c 20 2d  h function: ", -
5ea0: 31 2c 20 7a 49 64 2c 6e 49 64 2c 30 29 3b 0a 20  1, zId,nId,0);. 
5eb0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
5ec0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e  Err++;.        n
5ed0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  Err++;.      }el
5ee0: 73 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d  se if( wrong_num
5ef0: 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20  _args ){.       
5f00: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
5f10: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
5f20: 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sg, .           
5f30: 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  "wrong number of
5f40: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
5f50: 6e 63 74 69 6f 6e 20 22 2c 20 2d 31 2c 20 7a 49  nction ", -1, zI
5f60: 64 2c 20 6e 49 64 2c 20 22 28 29 22 2c 20 32 2c  d, nId, "()", 2,
5f70: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
5f80: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
5f90: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
5fa0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
5fb0: 73 5f 61 67 67 20 29 20 70 45 78 70 72 2d 3e 6f  s_agg ) pExpr->o
5fc0: 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  p = TK_AGG_FUNCT
5fd0: 49 4f 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ION;.      if( i
5fe0: 73 5f 61 67 67 20 26 26 20 70 49 73 41 67 67 20  s_agg && pIsAgg 
5ff0: 29 20 2a 70 49 73 41 67 67 20 3d 20 31 3b 0a 20  ) *pIsAgg = 1;. 
6000: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45       for(i=0; nE
6010: 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b  rr==0 && i<n; i+
6020: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72  +){.        nErr
6030: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 43 68 65   = sqliteExprChe
6040: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ck(pParse, pExpr
6050: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
6060: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 20 61 6c 6c 6f 77 41 67 67 20 26 26 20      allowAgg && 
6090: 21 69 73 5f 61 67 67 2c 20 70 49 73 41 67 67 29  !is_agg, pIsAgg)
60a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
60b0: 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20  if( pDef==0 ){. 
60c0: 20 20 20 20 20 20 20 69 66 28 20 69 73 5f 74 79         if( is_ty
60d0: 70 65 5f 6f 66 20 29 7b 0a 20 20 20 20 20 20 20  pe_of ){.       
60e0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
60f0: 4b 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 20 20  K_STRING;.      
6100: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
6110: 70 72 54 79 70 65 28 70 45 78 70 72 2d 3e 70 4c  prType(pExpr->pL
6120: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
6130: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20  ==SQLITE_SO_NUM 
6140: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
6150: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Expr->token.z = 
6160: 22 6e 75 6d 65 72 69 63 22 3b 0a 20 20 20 20 20  "numeric";.     
6170: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
6180: 6b 65 6e 2e 6e 20 3d 20 37 3b 0a 20 20 20 20 20  ken.n = 7;.     
6190: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
61a0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
61b0: 6f 6b 65 6e 2e 7a 20 3d 20 22 74 65 78 74 22 3b  oken.z = "text";
61c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
61d0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 34 3b  pr->token.n = 4;
61e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
61f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6200: 73 65 20 69 66 28 20 70 44 65 66 2d 3e 64 61 74  se if( pDef->dat
6210: 61 54 79 70 65 3e 3d 30 20 29 7b 0a 20 20 20 20  aType>=0 ){.    
6220: 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 64 61      if( pDef->da
6230: 74 61 54 79 70 65 3c 6e 20 29 7b 0a 20 20 20 20  taType<n ){.    
6240: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74        pExpr->dat
6250: 61 54 79 70 65 20 3d 20 0a 20 20 20 20 20 20 20  aType = .       
6260: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
6270: 54 79 70 65 28 70 45 78 70 72 2d 3e 70 4c 69 73  Type(pExpr->pLis
6280: 74 2d 3e 61 5b 70 44 65 66 2d 3e 64 61 74 61 54  t->a[pDef->dataT
6290: 79 70 65 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  ype].pExpr);.   
62a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
62b0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74        pExpr->dat
62c0: 61 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53  aType = SQLITE_S
62d0: 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 20 20 7d  O_NUM;.        }
62e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
62f0: 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65 3d   pDef->dataType=
6300: 3d 53 51 4c 49 54 45 5f 41 52 47 53 20 29 7b 0a  =SQLITE_ARGS ){.
6310: 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 64 61          pDef->da
6320: 74 61 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  taType = SQLITE_
6330: 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 20  SO_TEXT;.       
6340: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
6350: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
6360: 66 28 20 73 71 6c 69 74 65 45 78 70 72 54 79 70  f( sqliteExprTyp
6370: 65 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  e(pExpr->pList->
6380: 61 5b 69 5d 2e 70 45 78 70 72 29 3d 3d 53 51 4c  a[i].pExpr)==SQL
6390: 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20  ITE_SO_NUM ){.  
63a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
63b0: 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c 49  >dataType = SQLI
63c0: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20  TE_SO_NUM;.     
63d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
63e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
63f0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
6400: 69 66 28 20 70 44 65 66 2d 3e 64 61 74 61 54 79  if( pDef->dataTy
6410: 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4d 45 52  pe==SQLITE_NUMER
6420: 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  IC ){.        pE
6430: 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20  xpr->dataType = 
6440: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20  SQLITE_SO_NUM;. 
6450: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6460: 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54      pExpr->dataT
6470: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  ype = SQLITE_SO_
6480: 54 45 58 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TEXT;.      }.  
6490: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
64a0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
64b0: 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pr->pLeft ){.   
64c0: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
64d0: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
64e0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
64f0: 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41  , allowAgg, pIsA
6500: 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gg);.      }.   
6510: 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26     if( nErr==0 &
6520: 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  & pExpr->pRight 
6530: 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20  ){.        nErr 
6540: 3d 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  = sqliteExprChec
6550: 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  k(pParse, pExpr-
6560: 3e 70 52 69 67 68 74 2c 20 61 6c 6c 6f 77 41 67  >pRight, allowAg
6570: 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20  g, pIsAgg);.    
6580: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45    }.      if( nE
6590: 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  rr==0 && pExpr->
65a0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
65b0: 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e   int n = pExpr->
65c0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
65d0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
65e0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45       for(i=0; nE
65f0: 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b  rr==0 && i<n; i+
6600: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
6610: 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d  pr *pE2 = pExpr-
6620: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
6630: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 45  pr;.          nE
6640: 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 43  rr = sqliteExprC
6650: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 32  heck(pParse, pE2
6660: 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41  , allowAgg, pIsA
6670: 67 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  gg);.        }. 
6680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6690: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
66a0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a  return nErr;.}..
66b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 65 69 74  /*.** Return eit
66c0: 68 65 72 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  her SQLITE_SO_NU
66d0: 4d 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 54  M or SQLITE_SO_T
66e0: 45 58 54 20 74 6f 20 69 6e 64 69 63 61 74 65 20  EXT to indicate 
66f0: 77 68 65 74 68 65 72 20 74 68 65 0a 2a 2a 20 67  whether the.** g
6700: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
6710: 73 68 6f 75 6c 64 20 73 6f 72 74 20 61 73 20 6e  should sort as n
6720: 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 6f 72  umeric values or
6730: 20 61 73 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20   as text..**.** 
6740: 54 68 65 20 73 71 6c 69 74 65 45 78 70 72 52 65  The sqliteExprRe
6750: 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20 73  solveIds() and s
6760: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 29  qliteExprCheck()
6770: 20 72 6f 75 74 69 6e 65 73 20 6d 75 73 74 20 68   routines must h
6780: 61 76 65 0a 2a 2a 20 62 6f 74 68 20 62 65 65 6e  ave.** both been
6790: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
67a0: 78 70 72 65 73 73 69 6f 6e 20 62 65 66 6f 72 65  xpression before
67b0: 20 69 74 20 69 73 20 70 61 73 73 65 64 20 74 6f   it is passed to
67c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
67d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72  /.int sqliteExpr
67e0: 54 79 70 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Type(Expr *p){. 
67f0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
6800: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  rn SQLITE_SO_NUM
6810: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 20 73  ;.  while( p ) s
6820: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
6830: 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
6840: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
6850: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
6860: 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20  _STAR:.    case 
6870: 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
6880: 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
6890: 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
68a0: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
68b0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
68c0: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
68d0: 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
68e0: 5f 55 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  _UMINUS:.    cas
68f0: 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20  e TK_UPLUS:.    
6900: 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
6910: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
6920: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  R:.    case TK_B
6930: 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
6940: 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
6950: 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 0a 20  ase TK_RSHIFT:. 
6960: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
6970: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
6980: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
6990: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
69a0: 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65   TK_IN:.    case
69b0: 20 54 4b 5f 42 45 54 57 45 45 4e 3a 0a 20 20 20   TK_BETWEEN:.   
69c0: 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20   case TK_GLOB:. 
69d0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a     case TK_LIKE:
69e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
69f0: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 0a 20 20  LITE_SO_NUM;..  
6a00: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
6a10: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  :.    case TK_NU
6a20: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
6a30: 43 4f 4e 43 41 54 3a 0a 20 20 20 20 20 20 72 65  CONCAT:.      re
6a40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54  turn SQLITE_SO_T
6a50: 45 58 54 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  EXT;..    case T
6a60: 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
6a70: 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
6a80: 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
6a90: 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
6aa0: 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
6ab0: 4b 5f 45 51 3a 0a 20 20 20 20 20 20 69 66 28 20  K_EQ:.      if( 
6ac0: 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 70  sqliteExprType(p
6ad0: 2d 3e 70 4c 65 66 74 29 3d 3d 53 51 4c 49 54 45  ->pLeft)==SQLITE
6ae0: 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20  _SO_NUM ){.     
6af0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6b00: 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 7d  _SO_NUM;.      }
6b10: 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  .      p = p->pR
6b20: 69 67 68 74 3b 0a 20 20 20 20 20 20 62 72 65 61  ight;.      brea
6b30: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  k;..    case TK_
6b40: 41 53 3a 0a 20 20 20 20 20 20 70 20 3d 20 70 2d  AS:.      p = p-
6b50: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 62 72  >pLeft;.      br
6b60: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  eak;..    case T
6b70: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
6b80: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
6b90: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
6ba0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
6bb0: 72 65 74 75 72 6e 20 70 2d 3e 64 61 74 61 54 79  return p->dataTy
6bc0: 70 65 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  pe;..    case TK
6bd0: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 20 20 61  _SELECT:.      a
6be0: 73 73 65 72 74 28 20 70 2d 3e 70 53 65 6c 65 63  ssert( p->pSelec
6bf0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
6c00: 74 28 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  t( p->pSelect->p
6c10: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61  EList );.      a
6c20: 73 73 65 72 74 28 20 70 2d 3e 70 53 65 6c 65 63  ssert( p->pSelec
6c30: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
6c40: 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 20 3d 20  >0 );.      p = 
6c50: 70 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  p->pSelect->pELi
6c60: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
6c70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
6c80: 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20    case TK_CASE: 
6c90: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
6ca0: 52 69 67 68 74 20 26 26 20 73 71 6c 69 74 65 45  Right && sqliteE
6cb0: 78 70 72 54 79 70 65 28 70 2d 3e 70 52 69 67 68  xprType(p->pRigh
6cc0: 74 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  t)==SQLITE_SO_NU
6cd0: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  M ){.        ret
6ce0: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  urn SQLITE_SO_NU
6cf0: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
6d00: 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b   if( p->pList ){
6d10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
6d20: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
6d30: 20 2a 70 4c 69 73 74 20 3d 20 70 2d 3e 70 4c 69   *pList = p->pLi
6d40: 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  st;.        for(
6d50: 69 3d 31 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=1; i<pList->nE
6d60: 78 70 72 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  xpr; i+=2){.    
6d70: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6d80: 45 78 70 72 54 79 70 65 28 70 4c 69 73 74 2d 3e  ExprType(pList->
6d90: 61 5b 69 5d 2e 70 45 78 70 72 29 3d 3d 53 51 4c  a[i].pExpr)==SQL
6da0: 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20  ITE_SO_NUM ){.  
6db0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6dc0: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a   SQLITE_SO_NUM;.
6dd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6de0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6df0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6e00: 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d  E_SO_TEXT;.    }
6e10: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
6e20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
6e30: 6f 70 3d 3d 54 4b 5f 41 42 4f 52 54 20 29 3b 20  op==TK_ABORT ); 
6e40: 20 2f 2a 20 43 61 6e 27 74 20 48 61 70 70 65 6e   /* Can't Happen
6e50: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
6e60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6e70: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 7d 0a 0a  LITE_SO_NUM;.}..
6e80: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
6e90: 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
6ea0: 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
6eb0: 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
6ec0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
6ed0: 64 20 6c 65 61 76 65 20 74 68 65 20 72 65 73 75  d leave the resu
6ee0: 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  lt on the top of
6ef0: 20 73 74 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20   stack..*/.void 
6f00: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 50  sqliteExprCode(P
6f10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
6f20: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64  pr *pExpr){.  Vd
6f30: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
6f40: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 3b  pVdbe;.  int op;
6f50: 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70  .  if( v==0 || p
6f60: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
6f70: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
6f80: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
6f90: 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 20 6f  e TK_PLUS:     o
6fa0: 70 20 3d 20 4f 50 5f 41 64 64 3b 20 20 20 20 20  p = OP_Add;     
6fb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6fc0: 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 20 6f 70   TK_MINUS:    op
6fd0: 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74 3b 20   = OP_Subtract; 
6fe0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6ff0: 54 4b 5f 53 54 41 52 3a 20 20 20 20 20 6f 70 20  TK_STAR:     op 
7000: 3d 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3b 20 62  = OP_Multiply; b
7010: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
7020: 4b 5f 53 4c 41 53 48 3a 20 20 20 20 6f 70 20 3d  K_SLASH:    op =
7030: 20 4f 50 5f 44 69 76 69 64 65 3b 20 20 20 62 72   OP_Divide;   br
7040: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7050: 5f 41 4e 44 3a 20 20 20 20 20 20 6f 70 20 3d 20  _AND:      op = 
7060: 4f 50 5f 41 6e 64 3b 20 20 20 20 20 20 62 72 65  OP_And;      bre
7070: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7080: 4f 52 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  OR:       op = O
7090: 50 5f 4f 72 3b 20 20 20 20 20 20 20 62 72 65 61  P_Or;       brea
70a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
70b0: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
70c0: 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Lt;       break
70d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
70e0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
70f0: 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Le;       break;
7100: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
7110: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47         op = OP_G
7120: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
7130: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
7140: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65        op = OP_Ge
7150: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
7160: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20     case TK_NE:  
7170: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b       op = OP_Ne;
7180: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7190: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20    case TK_EQ:   
71a0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20      op = OP_Eq; 
71b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
71c0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
71d0: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c     op = OP_IsNul
71e0: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
71f0: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
7200: 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c    op = OP_NotNul
7210: 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  l;  break;.    c
7220: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20  ase TK_NOT:     
7230: 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 3b 20 20 20   op = OP_Not;   
7240: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
7250: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 20  se TK_UMINUS:   
7260: 6f 70 20 3d 20 4f 50 5f 4e 65 67 61 74 69 76 65  op = OP_Negative
7270: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7280: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 20 6f  e TK_BITAND:   o
7290: 70 20 3d 20 4f 50 5f 42 69 74 41 6e 64 3b 20 20  p = OP_BitAnd;  
72a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
72b0: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 20 6f 70   TK_BITOR:    op
72c0: 20 3d 20 4f 50 5f 42 69 74 4f 72 3b 20 20 20 20   = OP_BitOr;    
72d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
72e0: 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 20 6f 70 20  TK_BITNOT:   op 
72f0: 3d 20 4f 50 5f 42 69 74 4e 6f 74 3b 20 20 20 62  = OP_BitNot;   b
7300: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
7310: 4b 5f 4c 53 48 49 46 54 3a 20 20 20 6f 70 20 3d  K_LSHIFT:   op =
7320: 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3b 20 20   OP_ShiftLeft;  
7330: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7340: 54 4b 5f 52 53 48 49 46 54 3a 20 20 20 6f 70 20  TK_RSHIFT:   op 
7350: 3d 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3b  = OP_ShiftRight;
7360: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7370: 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 20 6f 70   TK_REM:      op
7380: 20 3d 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3b   = OP_Remainder;
7390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
73a0: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
73b0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
73c0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
73d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
73e0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
73f0: 75 73 65 41 67 67 20 29 7b 0a 20 20 20 20 20 20  useAgg ){.      
7400: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7410: 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20  p(v, OP_AggGet, 
7420: 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b  0, pExpr->iAgg);
7430: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7440: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
7450: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
7460: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7470: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70   OP_Column, pExp
7480: 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
7490: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
74a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
74b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
74c0: 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 70 45  (v, OP_Recno, pE
74d0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
74e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
74f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7500: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
7510: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61   {.      int iVa
7520: 6c 20 3d 20 61 74 6f 69 28 70 45 78 70 72 2d 3e  l = atoi(pExpr->
7530: 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20  token.z);.      
7540: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
7550: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75       sprintf(zBu
7560: 66 2c 22 25 64 22 2c 69 56 61 6c 29 3b 0a 20 20  f,"%d",iVal);.  
7570: 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a      if( strlen(z
7580: 42 75 66 29 21 3d 70 45 78 70 72 2d 3e 74 6f 6b  Buf)!=pExpr->tok
7590: 65 6e 2e 6e 20 0a 20 20 20 20 20 20 20 20 20 20  en.n .          
75a0: 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 70 45 78    || strncmp(pEx
75b0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 7a 42 75 66  pr->token.z,zBuf
75c0: 2c 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29  ,pExpr->token.n)
75d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
75e0: 2a 20 49 66 20 74 68 65 20 69 6e 74 65 67 65 72  * If the integer
75f0: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
7600: 20 72 65 70 72 65 73 65 6e 74 65 64 20 65 78 61   represented exa
7610: 63 74 6c 79 20 69 6e 20 33 32 20 62 69 74 73 2c  ctly in 32 bits,
7620: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
7630: 20 63 6f 64 65 20 69 74 20 61 73 20 61 20 73 74   code it as a st
7640: 72 69 6e 67 20 69 6e 73 74 65 61 64 2e 20 2a 2f  ring instead. */
7650: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
7660: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
7670: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
7680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7690: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
76a0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
76b0: 2c 20 69 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20  , iVal, 0);.    
76c0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
76d0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
76e0: 2d 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  -1, pExpr->token
76f0: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
7700: 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .n);.      break
7710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7720: 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
7730: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7740: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
7750: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73   0, 0);.      as
7760: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
7770: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 73 71  en.z );.      sq
7780: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
7790: 28 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e 74  (v, -1, pExpr->t
77a0: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
77b0: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62  oken.n);.      b
77c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
77d0: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
77e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
77f0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
7800: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
7810: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73   0, 0);.      as
7820: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
7830: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 73 71  en.z );.      sq
7840: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
7850: 28 76 2c 20 61 64 64 72 2c 20 70 45 78 70 72 2d  (v, addr, pExpr-
7860: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
7870: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
7880: 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f   sqliteVdbeDequo
7890: 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20  teP3(v, addr);. 
78a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
78b0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
78c0: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
78d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
78e0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
78f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7900: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
7910: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
7920: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
7930: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
7940: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
7950: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
7960: 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EQ: {.      if( 
7970: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
7980: 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 73 71  _format>=4 && sq
7990: 6c 69 74 65 45 78 70 72 54 79 70 65 28 70 45 78  liteExprType(pEx
79a0: 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54  pr)==SQLITE_SO_T
79b0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  EXT ){.        o
79c0: 70 20 2b 3d 20 36 3b 20 20 2f 2a 20 43 6f 6e 76  p += 6;  /* Conv
79d0: 65 72 74 20 6e 75 6d 65 72 69 63 20 6f 70 63 6f  ert numeric opco
79e0: 64 65 73 20 74 6f 20 74 65 78 74 20 6f 70 63 6f  des to text opco
79f0: 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  des */.      }. 
7a00: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
7a10: 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65  ough into the ne
7a20: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
7a30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
7a40: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
7a50: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
7a60: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
7a70: 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
7a80: 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
7a90: 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
7aa0: 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
7ab0: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
7ac0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
7ad0: 53 48 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SH: {.      sqli
7ae0: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
7af0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
7b00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
7b10: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
7b20: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
7b30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7b40: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
7b50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7b60: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
7b70: 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
7b80: 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 7b 0a  se TK_RSHIFT: {.
7b90: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
7ba0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
7bb0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
7bc0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
7bd0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
7be0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
7bf0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7c00: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
7c10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7c20: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
7c30: 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AT: {.      sqli
7c40: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
7c50: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
7c60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
7c70: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
7c80: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
7c90: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7ca0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  ddOp(v, OP_Conca
7cb0: 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 2, 0);.      
7cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7cd0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
7ce0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
7cf0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
7d00: 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  ft;.      if( pL
7d10: 65 66 74 20 26 26 20 70 4c 65 66 74 2d 3e 6f 70  eft && pLeft->op
7d20: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
7d30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
7d40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
7d50: 74 65 67 65 72 2c 20 61 74 6f 69 28 70 4c 65 66  teger, atoi(pLef
7d60: 74 2d 3e 74 6f 6b 65 6e 2e 7a 29 2c 20 30 29 3b  t->token.z), 0);
7d70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
7d80: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
7d90: 31 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e  1, pLeft->token.
7da0: 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e  z, pLeft->token.
7db0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n);.      }else 
7dc0: 69 66 28 20 70 4c 65 66 74 20 26 26 20 70 4c 65  if( pLeft && pLe
7dd0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
7de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7df0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7e00: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
7e10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
7e20: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
7e30: 31 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e  1, pLeft->token.
7e40: 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e  z, pLeft->token.
7e50: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
7e60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45  .        sqliteE
7e70: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
7e80: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
7e90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7ea0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7eb0: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
7ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
7ed0: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
7ee0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
7ef0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
7f00: 41 54 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65  AT || pExpr->pLe
7f10: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
7f20: 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f  ER ){.        To
7f30: 6b 65 6e 20 2a 70 20 3d 20 26 70 45 78 70 72 2d  ken *p = &pExpr-
7f40: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
7f50: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
7f60: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
7f70: 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20  ->n + 2 );.     
7f80: 20 20 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d     sprintf(z, "-
7f90: 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e  %.*s", p->n, p->
7fa0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
7fb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
7fc0: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
7fd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7fe0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7ff0: 49 6e 74 65 67 65 72 2c 20 61 74 6f 69 28 7a 29  Integer, atoi(z)
8000: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
8010: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
8020: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8030: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
8040: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
8050: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8060: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
8070: 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20  z, p->n+1);.    
8080: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
8090: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
80a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
80b0: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
80c0: 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20  into TK_NOT */. 
80d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
80e0: 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
80f0: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
8100: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
8110: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8120: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
8130: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8140: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
8150: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8160: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
8170: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
8180: 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
8190: 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  int dest;.      
81a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
81b0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
81c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
81d0: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
81e0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
81f0: 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20 73  ;.      dest = s
8200: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
8210: 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20  Addr(v) + 2;.   
8220: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8230: 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73  Op(v, op, 1, des
8240: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
8250: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8260: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a  AddImm, -1, 0);.
8270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8280: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
8290: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
82a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
82b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65  ddOp(v, OP_AggGe
82c0: 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67  t, 0, pExpr->iAg
82d0: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
82e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
82f0: 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61 73  TK_GLOB:.    cas
8300: 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63  e TK_LIKE:.    c
8310: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
8320: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a   {.      int i;.
8330: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
8340: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
8350: 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  List;.      int 
8360: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20  nExpr = pList ? 
8370: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
8380: 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  ;.      FuncDef 
8390: 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74  *pDef;.      int
83a0: 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73   nId;.      cons
83b0: 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20  t char *zId;.   
83c0: 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61     getFunctionNa
83d0: 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64 2c 20  me(pExpr, &zId, 
83e0: 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65  &nId);.      pDe
83f0: 66 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 46 75  f = sqliteFindFu
8400: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
8410: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78  b, zId, nId, nEx
8420: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  pr, 0);.      as
8430: 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29 3b  sert( pDef!=0 );
8440: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
8450: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  i<nExpr; i++){. 
8460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
8470: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
8480: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
8490: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
84a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
84b0: 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
84c0: 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  nExpr, 0);.     
84d0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
84e0: 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
84f0: 2a 29 70 44 65 66 2c 20 50 33 5f 50 4f 49 4e 54  *)pDef, P3_POINT
8500: 45 52 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ER);.      break
8510: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8520: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
8530: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8540: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
8550: 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  d, pExpr->iColum
8560: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  n, 0);.      bre
8570: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8580: 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
8590: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
85a0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
85b0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
85c0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
85d0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
85e0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
85f0: 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  t);.      addr =
8600: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
8610: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
8620: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8630: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
8640: 2d 31 2c 20 61 64 64 72 2b 34 29 3b 0a 20 20 20  -1, addr+4);.   
8650: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8660: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
8670: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8680: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8690: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
86a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
86b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
86c0: 2c 20 30 2c 20 61 64 64 72 2b 36 29 3b 0a 20 20  , 0, addr+6);.  
86d0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
86e0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
86f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8700: 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  p(v, OP_Found, p
8710: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64  Expr->iTable, ad
8720: 64 72 2b 36 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dr+6);.      }el
8730: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8740: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8750: 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_SetFound, pExp
8760: 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b  r->iTable, addr+
8770: 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  6);.      }.    
8780: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8790: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
87a0: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  -1, 0);.      br
87b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
87c0: 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
87d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
87e0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
87f0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
8800: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8810: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
8820: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
8830: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
8840: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
8850: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
8860: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8870: 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c  dOp(v, OP_Ge, 0,
8880: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8890: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
88a0: 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
88b0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
88c0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
88d0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
88e0: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
88f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8900: 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  P_Le, 0, 0);.   
8910: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8920: 4f 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c  Op(v, OP_And, 0,
8930: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
8940: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8950: 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20   TK_AS: {.      
8960: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
8970: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
8980: 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eft);.      brea
8990: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
89a0: 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20  e TK_CASE: {.   
89b0: 20 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f     int expr_end_
89c0: 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74  label;.      int
89d0: 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20   jumpInst;.     
89e0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
89f0: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20   int nExpr;.    
8a00: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20    int i;..      
8a10: 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c  assert(pExpr->pL
8a20: 69 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ist);.      asse
8a30: 72 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt((pExpr->pList
8a40: 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20  ->nExpr % 2) == 
8a50: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
8a60: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e  (pExpr->pList->n
8a70: 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
8a80: 20 6e 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e   nExpr = pExpr->
8a90: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
8aa0: 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62      expr_end_lab
8ab0: 65 6c 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  el = sqliteVdbeM
8ac0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
8ad0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
8ae0: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eft ){.        s
8af0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
8b00: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
8b10: 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ft);.      }.   
8b20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
8b30: 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  xpr; i=i+2){.   
8b40: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
8b50: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
8b60: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
8b70: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
8b80: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
8b90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
8ba0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8bb0: 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20  OP_Dup, 1, 1);. 
8bc0: 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73           jumpIns
8bd0: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  t = sqliteVdbeAd
8be0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 31 2c  dOp(v, OP_Ne, 1,
8bf0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
8c00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8c10: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
8c20: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
8c30: 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e            jumpIn
8c40: 73 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  st = sqliteVdbeA
8c50: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  ddOp(v, OP_IfNot
8c60: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
8c70: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
8c80: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
8c90: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
8ca0: 61 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  a[i+1].pExpr);. 
8cb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
8cc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
8cd0: 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c  o, 0, expr_end_l
8ce0: 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 61  abel);.        a
8cf0: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
8d00: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
8d10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8d20: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75  beChangeP2(v, ju
8d30: 6d 70 49 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20  mpInst, addr);. 
8d40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8d50: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
8d60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
8d70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
8d80: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
8d90: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
8da0: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
8db0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
8dc0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
8dd0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
8de0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8df0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8e00: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
8e10: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
8e20: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
8e30: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
8e40: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a  xpr_end_label);.
8e50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8e60: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
8e70: 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  AISE: {.      if
8e80: 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53  ( !pParse->trigS
8e90: 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  tack ){.        
8ea0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
8eb0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
8ec0: 67 2c 20 0a 09 09 22 52 41 49 53 45 28 29 20 6d  g, ..."RAISE() m
8ed0: 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
8ee0: 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
8ef0: 2d 70 72 6f 67 72 61 6d 22 2c 20 2d 31 2c 20 30  -program", -1, 0
8f00: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
8f10: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 09 72 65 74 75  e->nErr++;..retu
8f20: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
8f30: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
8f40: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 52 6f 6c 6c 62  lumn == OE_Rollb
8f50: 61 63 6b 20 7c 7c 0a 09 20 20 70 45 78 70 72 2d  ack ||..  pExpr-
8f60: 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41  >iColumn == OE_A
8f70: 62 6f 72 74 20 7c 7c 0a 09 20 20 70 45 78 70 72  bort ||..  pExpr
8f80: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
8f90: 46 61 69 6c 20 29 7b 0a 09 20 20 63 68 61 72 20  Fail ){..  char 
8fa0: 2a 20 6d 73 67 20 3d 20 73 71 6c 69 74 65 53 74  * msg = sqliteSt
8fb0: 72 4e 44 75 70 28 70 45 78 70 72 2d 3e 74 6f 6b  rNDup(pExpr->tok
8fc0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
8fd0: 65 6e 2e 6e 29 3b 0a 09 20 20 73 71 6c 69 74 65  en.n);..  sqlite
8fe0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8ff0: 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  Halt, SQLITE_CON
9000: 53 54 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e  STRAINT, pExpr->
9010: 69 43 6f 6c 75 6d 6e 29 3b 0a 09 20 20 73 71 6c  iColumn);..  sql
9020: 69 74 65 44 65 71 75 6f 74 65 28 6d 73 67 29 3b  iteDequote(msg);
9030: 0a 09 20 20 73 71 6c 69 74 65 56 64 62 65 43 68  ..  sqliteVdbeCh
9040: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 6d 73  angeP3(v, -1, ms
9050: 67 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65  g, 0);..  sqlite
9060: 46 72 65 65 28 6d 73 67 29 3b 0a 20 20 20 20 20  Free(msg);.     
9070: 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 61 73 73   } else {..  ass
9080: 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
9090: 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65  umn == OE_Ignore
90a0: 20 29 3b 0a 09 20 20 73 71 6c 69 74 65 56 64 62   );..  sqliteVdb
90b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
90c0: 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72  o, 0, pParse->tr
90d0: 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a  igStack->ignoreJ
90e0: 75 6d 70 29 3b 0a 09 20 20 73 71 6c 69 74 65 56  ump);..  sqliteV
90f0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
9100: 31 2c 20 22 28 49 47 4e 4f 52 45 20 6a 75 6d 70  1, "(IGNORE jump
9110: 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  )", 0);.      }.
9120: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
9130: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
9140: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
9150: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
9160: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
9170: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
9180: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
9190: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
91a0: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
91b0: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
91c0: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
91d0: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
91e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
91f0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
9200: 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
9210: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
9220: 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
9230: 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
9240: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
9250: 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
9260: 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  flag is true..*/
9270: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
9280: 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
9290: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
92a0: 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
92b0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
92c0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
92d0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
92e0: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d  p = 0;.  if( v==
92f0: 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
9300: 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68  return;.  switch
9310: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
9320: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
9330: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b       op = OP_Lt;
9340: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9350: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
9360: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20      op = OP_Le; 
9370: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9380: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
9390: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20     op = OP_Gt;  
93a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
93b0: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
93c0: 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20    op = OP_Ge;   
93d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
93e0: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
93f0: 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20   op = OP_Ne;    
9400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9410: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20  se TK_EQ:       
9420: 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20  op = OP_Eq;     
9430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9440: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f  e TK_ISNULL:   o
9450: 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20  p = OP_IsNull;  
9460: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9470: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70   TK_NOTNULL:  op
9480: 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20   = OP_NotNull;  
9490: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
94a0: 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  lt:  break;.  }.
94b0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
94c0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
94d0: 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
94e0: 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 56  int d2 = sqliteV
94f0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
9500: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
9510: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
9520: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
9530: 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  2, !jumpIfNull);
9540: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
9550: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
9560: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
9570: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
9580: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
9590: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
95a0: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
95b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
95c0: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
95d0: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72    sqliteExprIfTr
95e0: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
95f0: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
9600: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
9610: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72    sqliteExprIfTr
9620: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
9630: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
9640: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
9650: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9660: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
9670: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
9680: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
9690: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
96a0: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
96b0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
96c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
96d0: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
96e0: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
96f0: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
9700: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
9710: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
9720: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73  TK_EQ: {.      s
9730: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
9740: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
9750: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
9760: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
9770: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
9780: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
9790: 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  se->db->file_for
97a0: 6d 61 74 3e 3d 34 20 26 26 20 73 71 6c 69 74 65  mat>=4 && sqlite
97b0: 45 78 70 72 54 79 70 65 28 70 45 78 70 72 29 3d  ExprType(pExpr)=
97c0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20  =SQLITE_SO_TEXT 
97d0: 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 2b 3d  ){.        op +=
97e0: 20 36 3b 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20   6;  /* Convert 
97f0: 6e 75 6d 65 72 69 63 20 6f 70 63 6f 64 65 73 20  numeric opcodes 
9800: 74 6f 20 74 65 78 74 20 6f 70 63 6f 64 65 73 20  to text opcodes 
9810: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
9820: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9830: 28 76 2c 20 6f 70 2c 20 6a 75 6d 70 49 66 4e 75  (v, op, jumpIfNu
9840: 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ll, dest);.     
9850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9860: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
9870: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
9880: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
9890: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
98a0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
98b0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
98c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
98d0: 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
98e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
98f0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
9900: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
9910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
9920: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
9930: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
9940: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
9950: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
9960: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
9970: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9980: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
9990: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
99a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
99b0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
99c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
99d0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
99e0: 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20  0, jumpIfNull ? 
99f0: 64 65 73 74 20 3a 20 61 64 64 72 2b 34 29 3b 0a  dest : addr+4);.
9a00: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
9a10: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
9a20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9a30: 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  dOp(v, OP_Found,
9a40: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
9a50: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
9a60: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
9a70: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9a80: 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_SetFound, pExp
9a90: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29  r->iTable, dest)
9aa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9ab0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9ac0: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
9ad0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
9ae0: 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dr;.      sqlite
9af0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
9b00: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
9b10: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9b20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
9b30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
9b40: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
9b50: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
9b60: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
9b70: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
9b80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9b90: 4f 50 5f 4c 74 2c 20 21 6a 75 6d 70 49 66 4e 75  OP_Lt, !jumpIfNu
9ba0: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ll, 0);.      sq
9bb0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
9bc0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
9bd0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  t->a[1].pExpr);.
9be0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9bf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 65 2c 20  AddOp(v, OP_Le, 
9c00: 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74  jumpIfNull, dest
9c10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
9c20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9c30: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
9c40: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
9c50: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
9c60: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
9c70: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
9c80: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
9c90: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
9ca0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
9cb0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
9cc0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  lt: {.      sqli
9cd0: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
9ce0: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
9cf0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9d00: 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49  (v, OP_If, jumpI
9d10: 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20  fNull, dest);.  
9d20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9d30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
9d40: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
9d50: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
9d60: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
9d70: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
9d80: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
9d90: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
9da0: 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
9db0: 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
9dc0: 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
9dd0: 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
9de0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
9df0: 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
9e00: 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
9e10: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
9e20: 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
9e30: 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
9e40: 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
9e50: 6c 20 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c  l is true or fal
9e60: 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
9e70: 70 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65  pIfNull is false
9e80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9e90: 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
9ea0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
9eb0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
9ec0: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
9ed0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
9ee0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
9ef0: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66  int op = 0;.  if
9f00: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
9f10: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
9f20: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
9f30: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
9f40: 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LT:       op = O
9f50: 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ge;       brea
9f60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
9f70: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
9f80: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
9f90: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
9fa0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
9fb0: 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Le;       break;
9fc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
9fd0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c         op = OP_L
9fe0: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
9ff0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
a000: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
a010: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
a020: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
a030: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b       op = OP_Ne;
a040: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a050: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
a060: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  :   op = OP_NotN
a070: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
a080: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
a090: 3a 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c  :  op = OP_IsNul
a0a0: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
a0b0: 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b  default:  break;
a0c0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
a0d0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
a0e0: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
a0f0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
a100: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
a110: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
a120: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
a130: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
a140: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
a150: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
a160: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
a170: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a180: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a190: 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
a1a0: 20 64 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65   d2 = sqliteVdbe
a1b0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
a1c0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
a1d0: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
a1e0: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21  pr->pLeft, d2, !
a1f0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
a200: 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 46     sqliteExprIfF
a210: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
a220: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
a230: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
a240: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
a250: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
a260: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
a270: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a280: 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
a290: 73 71 6c 69 74 65 45 78 70 72 49 66 54 72 75 65  sqliteExprIfTrue
a2a0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
a2b0: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
a2c0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
a2d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a2e0: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
a2f0: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
a300: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
a310: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
a320: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
a330: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
a340: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
a350: 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  >db->file_format
a360: 3e 3d 34 20 26 26 20 73 71 6c 69 74 65 45 78 70  >=4 && sqliteExp
a370: 72 54 79 70 65 28 70 45 78 70 72 29 3d 3d 53 51  rType(pExpr)==SQ
a380: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a  LITE_SO_TEXT ){.
a390: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
a3a0: 72 74 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61  rt numeric compa
a3b0: 72 69 73 6f 6e 20 6f 70 63 6f 64 65 73 20 69 6e  rison opcodes in
a3c0: 74 6f 20 74 65 78 74 20 63 6f 6d 70 61 72 69 73  to text comparis
a3d0: 6f 6e 20 6f 70 63 6f 64 65 73 2e 0a 20 20 20 20  on opcodes..    
a3e0: 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 65 70      ** This step
a3f0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
a400: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 74 65  fact that the te
a410: 78 74 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6f  xt comparision o
a420: 70 63 6f 64 65 73 20 61 72 65 0a 20 20 20 20 20  pcodes are.     
a430: 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 36 20 67     ** always 6 g
a440: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69  reater than thei
a450: 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
a460: 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61 72 69 73  numeric comparis
a470: 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 70  on.        ** op
a480: 63 6f 64 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  codes..        *
a490: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
a4a0: 28 20 4f 50 5f 45 71 2b 36 20 3d 3d 20 4f 50 5f  ( OP_Eq+6 == OP_
a4b0: 53 74 72 45 71 20 29 3b 0a 20 20 20 20 20 20 20  StrEq );.       
a4c0: 20 6f 70 20 2b 3d 20 36 3b 0a 20 20 20 20 20 20   op += 6;.      
a4d0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  }.      sqliteEx
a4e0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
a4f0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
a500: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
a510: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
a520: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
a530: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a540: 28 76 2c 20 6f 70 2c 20 6a 75 6d 70 49 66 4e 75  (v, op, jumpIfNu
a550: 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ll, dest);.     
a560: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a570: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
a580: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
a590: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
a5a0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
a5b0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
a5c0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
a5d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
a5e0: 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
a5f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a600: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
a610: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
a620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
a630: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
a640: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
a650: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
a660: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
a670: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
a680: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a690: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
a6a0: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
a6b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a6c0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
a6d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a6e0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
a6f0: 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20  0, jumpIfNull ? 
a700: 64 65 73 74 20 3a 20 61 64 64 72 2b 34 29 3b 0a  dest : addr+4);.
a710: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
a720: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
a730: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a740: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
a750: 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
a760: 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  e, dest);.      
a770: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
a780: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a790: 2c 20 4f 50 5f 53 65 74 4e 6f 74 46 6f 75 6e 64  , OP_SetNotFound
a7a0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
a7b0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a   dest);.      }.
a7c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
a7e0: 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
a7f0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
a800: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
a810: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
a820: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
a830: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a840: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
a850: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
a860: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
a870: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
a880: 78 70 72 29 3b 0a 20 20 20 20 20 20 61 64 64 72  xpr);.      addr
a890: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72   = sqliteVdbeCur
a8a0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
a8b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a8c0: 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 21 6a 75  Op(v, OP_Ge, !ju
a8d0: 6d 70 49 66 4e 75 6c 6c 2c 20 61 64 64 72 2b 33  mpIfNull, addr+3
a8e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
a8f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
a900: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
a910: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a920: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
a930: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
a940: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
a950: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
a960: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
a970: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
a980: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 74 2c 20 6a  ddOp(v, OP_Gt, j
a990: 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29  umpIfNull, dest)
a9a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a9b0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
a9c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
a9d0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
a9e0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
a9f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
aa00: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70  , OP_IfNot, jump
aa10: 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20  IfNull, dest);. 
aa20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa30: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
aa40: 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
aa50: 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
aa60: 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
aa70: 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a  turn TRUE (non-z
aa80: 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20  ero).** if they 
aa90: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
aaa0: 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69  d return FALSE i
aab0: 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
aac0: 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74   any way..*/.int
aad0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61   sqliteExprCompa
aae0: 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
aaf0: 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b  r *pB){.  int i;
ab00: 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a  .  if( pA==0 ){.
ab10: 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 30      return pB==0
ab20: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
ab30: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
ab40: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
ab50: 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20  A->op!=pB->op ) 
ab60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
ab70: 21 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61  !sqliteExprCompa
ab80: 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
ab90: 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
aba0: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
abb0: 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  teExprCompare(pA
abc0: 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
abd0: 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30  ight) ) return 0
abe0: 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73  ;.  if( pA->pLis
abf0: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  t ){.    if( pB-
ac00: 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  >pList==0 ) retu
ac10: 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41  rn 0;.    if( pA
ac20: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
ac30: 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pB->pList->nExpr
ac40: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
ac50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
ac60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
ac70: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73  +){.      if( !s
ac80: 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65  qliteExprCompare
ac90: 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  (pA->pList->a[i]
aca0: 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73  .pExpr, pB->pLis
acb0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
acc0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
acd0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
ace0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  }.  }else if( pB
acf0: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72  ->pList ){.    r
ad00: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
ad10: 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c  f( pA->pSelect |
ad20: 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20  | pB->pSelect ) 
ad30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
ad40: 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e  pA->iTable!=pB->
ad50: 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43  iTable || pA->iC
ad60: 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75  olumn!=pB->iColu
ad70: 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  mn ) return 0;. 
ad80: 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a   if( pA->token.z
ad90: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e   ){.    if( pB->
ada0: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74  token.z==0 ) ret
adb0: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
adc0: 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e  B->token.n!=pA->
add0: 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e  token.n ) return
ade0: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
adf0: 74 65 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74  teStrNICmp(pA->t
ae00: 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65  oken.z, pB->toke
ae10: 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e  n.z, pB->token.n
ae20: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )!=0 ) return 0;
ae30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
ae40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
ae50: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
ae60: 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
ae70: 5d 20 61 72 72 61 79 20 61 6e 64 20 72 65 74 75  ] array and retu
ae80: 72 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2f  rn its index..*/
ae90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 65  .static int appe
aea0: 6e 64 41 67 67 49 6e 66 6f 28 50 61 72 73 65 20  ndAggInfo(Parse 
aeb0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
aec0: 28 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 26 20  (pParse->nAgg & 
aed0: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  0x7)==0 ){.    i
aee0: 6e 74 20 61 6d 74 20 3d 20 70 50 61 72 73 65 2d  nt amt = pParse-
aef0: 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20 20 41  >nAgg + 8;.    A
af00: 67 67 45 78 70 72 20 2a 61 41 67 67 20 3d 20 73  ggExpr *aAgg = s
af10: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61  qliteRealloc(pPa
af20: 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73  rse->aAgg, amt*s
af30: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41  izeof(pParse->aA
af40: 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  gg[0]));.    if(
af50: 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20   aAgg==0 ){.    
af60: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
af70: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61   }.    pParse->a
af80: 41 67 67 20 3d 20 61 41 67 67 3b 0a 20 20 7d 0a  Agg = aAgg;.  }.
af90: 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65    memset(&pParse
afa0: 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d 3e 6e  ->aAgg[pParse->n
afb0: 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Agg], 0, sizeof(
afc0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29  pParse->aAgg[0])
afd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  );.  return pPar
afe0: 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f  se->nAgg++;.}../
aff0: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
b000: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
b010: 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
b020: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
b030: 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
b040: 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
b050: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
b060: 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
b070: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b  [] array..** Mak
b080: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  e additional ent
b090: 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72  ries to the pPar
b0a0: 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
b0b0: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
b0c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b0d0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
b0e0: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
b0f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
b100: 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
b110: 64 20 62 79 20 73 71 6c 69 74 65 45 78 70 72 52  d by sqliteExprR
b120: 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20  esolveIds() and 
b130: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
b140: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f  )..**.** If erro
b150: 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61  rs are seen, lea
b160: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
b170: 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61  age in zErrMsg a
b180: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  nd return.** the
b190: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
b1a0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
b1b0: 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
b1c0: 67 61 74 65 73 28 50 61 72 73 65 20 2a 70 50 61  gates(Parse *pPa
b1d0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
b1e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41 67  ){.  int i;.  Ag
b1f0: 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20 20 69  gExpr *aAgg;.  i
b200: 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20  nt nErr = 0;..  
b210: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
b220: 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63  eturn 0;.  switc
b230: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
b240: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
b250: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67 67  MN: {.      aAgg
b260: 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b   = pParse->aAgg;
b270: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b280: 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
b290: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
b2a0: 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ( aAgg[i].isAgg 
b2b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
b2c0: 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e      if( aAgg[i].
b2d0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
b2e0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20  Expr->iTable.   
b2f0: 20 20 20 20 20 20 26 26 20 61 41 67 67 5b 69 5d        && aAgg[i]
b300: 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  .pExpr->iColumn=
b310: 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
b320: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
b330: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
b340: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b350: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  i>=pParse->nAgg 
b360: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 61  ){.        i = a
b370: 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61  ppendAggInfo(pPa
b380: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
b390: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31  ( i<0 ) return 1
b3a0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
b3b0: 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ->aAgg[i].isAgg 
b3c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
b3d0: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
b3e0: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
b3f0: 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d    }.      pExpr-
b400: 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
b410: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b420: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
b430: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
b440: 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  aAgg = pParse->a
b450: 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Agg;.      for(i
b460: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
b470: 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
b480: 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d 2e 69    if( !aAgg[i].i
b490: 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
b4a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
b4b0: 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 61  iteExprCompare(a
b4c0: 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  Agg[i].pExpr, pE
b4d0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
b4e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b4f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
b500: 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e   if( i>=pParse->
b510: 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  nAgg ){.        
b520: 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66  i = appendAggInf
b530: 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  o(pParse);.     
b540: 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74     if( i<0 ) ret
b550: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70  urn 1;.        p
b560: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
b570: 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
b580: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
b590: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
b5a0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
b5b0: 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20 3d  >aAgg[i].pFunc =
b5c0: 20 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74   sqliteFindFunct
b5d0: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
b5f0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
b600: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20  pr->token.n,.   
b610: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
b620: 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  >pList ? pExpr->
b630: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
b640: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
b650: 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
b660: 3d 20 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = i;.      break
b670: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
b680: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ult: {.      if(
b690: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
b6a0: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
b6b0: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
b6c0: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
b6d0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
b6e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b6f0: 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20   if( nErr==0 && 
b700: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
b710: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
b720: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
b730: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
b740: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
b750: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
b760: 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26    if( nErr==0 &&
b770: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
b780: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
b790: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
b7a0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Expr;.        in
b7b0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
b7c0: 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26  (i=0; nErr==0 &&
b7d0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
b7e0: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
b7f0: 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  iteExprAnalyzeAg
b800: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
b810: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
b820: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
b830: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b840: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
b860: 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rr;.}../*.** Loc
b870: 61 74 65 20 61 20 75 73 65 72 20 66 75 6e 63 74  ate a user funct
b880: 69 6f 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d 65  ion given a name
b890: 20 61 6e 64 20 61 20 6e 75 6d 62 65 72 20 6f 66   and a number of
b8a0: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 52   arguments..** R
b8b0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
b8c0: 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 73  to the FuncDef s
b8d0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
b8e0: 66 69 6e 65 73 20 74 68 61 74 0a 2a 2a 20 66 75  fines that.** fu
b8f0: 6e 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75 72  nction, or retur
b900: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 75  n NULL if the fu
b910: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
b920: 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  exist..**.** If 
b930: 74 68 65 20 63 72 65 61 74 65 46 6c 61 67 20 61  the createFlag a
b940: 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
b950: 20 74 68 65 6e 20 61 20 6e 65 77 20 28 62 6c 61   then a new (bla
b960: 6e 6b 29 20 46 75 6e 63 44 65 66 0a 2a 2a 20 73  nk) FuncDef.** s
b970: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
b980: 74 65 64 20 61 6e 64 20 6c 69 6b 65 64 20 69 6e  ted and liked in
b990: 74 6f 20 74 68 65 20 22 64 62 22 20 73 74 72 75  to the "db" stru
b9a0: 63 74 75 72 65 20 69 66 20 61 0a 2a 2a 20 6e 6f  cture if a.** no
b9b0: 20 6d 61 74 63 68 69 6e 67 20 66 75 6e 63 74 69   matching functi
b9c0: 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78  on previously ex
b9d0: 69 73 74 65 64 2e 20 20 57 68 65 6e 20 63 72 65  isted.  When cre
b9e0: 61 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 0a  ateFlag is true.
b9f0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 41 72 67 20  ** and the nArg 
ba00: 70 61 72 61 6d 65 74 65 72 20 69 73 20 2d 31 2c  parameter is -1,
ba10: 20 74 68 65 6e 20 6f 6e 6c 79 20 61 20 66 75 6e   then only a fun
ba20: 63 74 69 6f 6e 20 74 68 61 74 20 61 63 63 65 70  ction that accep
ba30: 74 73 0a 2a 2a 20 61 6e 79 20 6e 75 6d 62 65 72  ts.** any number
ba40: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77 69   of arguments wi
ba50: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a  ll be returned..
ba60: 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74 65 46  **.** If createF
ba70: 6c 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64  lag is false and
ba80: 20 6e 41 72 67 20 69 73 20 2d 31 2c 20 74 68 65   nArg is -1, the
ba90: 6e 20 74 68 65 20 66 69 72 73 74 20 76 61 6c 69  n the first vali
baa0: 64 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 6f  d.** function fo
bab0: 75 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e  und is returned.
bac0: 20 20 41 20 66 75 6e 63 74 69 6f 6e 20 69 73 20    A function is 
bad0: 76 61 6c 69 64 20 69 66 20 65 69 74 68 65 72 20  valid if either 
bae0: 78 46 75 6e 63 0a 2a 2a 20 6f 72 20 78 53 74 65  xFunc.** or xSte
baf0: 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  p is non-zero..*
bb00: 2f 0a 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74  /.FuncDef *sqlit
bb10: 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a 20  eFindFunction(. 
bb20: 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20   sqlite *db,    
bb30: 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64      /* An open d
bb40: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
bb50: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
bb60: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
bb70: 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e 75  unction.  Not nu
bb80: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a 2f  ll-terminated */
bb90: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20 20  .  int nName,   
bba0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bbb0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
bbc0: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69   the name */.  i
bbd0: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
bbe0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
bbf0: 72 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d 65  rguments.  -1 me
bc00: 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72 20 2a  ans any number *
bc10: 2f 0a 20 20 69 6e 74 20 63 72 65 61 74 65 46 6c  /.  int createFl
bc20: 61 67 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ag     /* Create
bc30: 20 6e 65 77 20 65 6e 74 72 79 20 69 66 20 74 72   new entry if tr
bc40: 75 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ue and does not 
bc50: 6f 74 68 65 72 77 69 73 65 20 65 78 69 73 74 20  otherwise exist 
bc60: 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  */.){.  FuncDef 
bc70: 2a 70 46 69 72 73 74 2c 20 2a 70 2c 20 2a 70 4d  *pFirst, *p, *pM
bc80: 61 79 62 65 3b 0a 20 20 70 46 69 72 73 74 20 3d  aybe;.  pFirst =
bc90: 20 70 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73   p = (FuncDef*)s
bca0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
bcb0: 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c  b->aFunc, zName,
bcc0: 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70   nName);.  if( p
bcd0: 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67 20   && !createFlag 
bce0: 26 26 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20  && nArg<0 ){.   
bcf0: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
bd00: 78 46 75 6e 63 3d 3d 30 20 26 26 20 70 2d 3e 78  xFunc==0 && p->x
bd10: 53 74 65 70 3d 3d 30 20 29 7b 20 70 20 3d 20 70  Step==0 ){ p = p
bd20: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 72  ->pNext; }.    r
bd30: 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70  eturn p;.  }.  p
bd40: 4d 61 79 62 65 20 3d 20 30 3b 0a 20 20 77 68 69  Maybe = 0;.  whi
bd50: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 41 72 67  le( p && p->nArg
bd60: 21 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66  !=nArg ){.    if
bd70: 28 20 70 2d 3e 6e 41 72 67 3c 30 20 26 26 20 21  ( p->nArg<0 && !
bd80: 63 72 65 61 74 65 46 6c 61 67 20 26 26 20 28 70  createFlag && (p
bd90: 2d 3e 78 46 75 6e 63 20 7c 7c 20 70 2d 3e 78 53  ->xFunc || p->xS
bda0: 74 65 70 29 20 29 20 70 4d 61 79 62 65 20 3d 20  tep) ) pMaybe = 
bdb0: 70 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  p;.    p = p->pN
bdc0: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
bdd0: 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67 20   && !createFlag 
bde0: 26 26 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 26  && p->xFunc==0 &
bdf0: 26 20 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29 7b  & p->xStep==0 ){
be00: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
be10: 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20 26 26   }.  if( p==0 &&
be20: 20 70 4d 61 79 62 65 20 29 7b 0a 20 20 20 20 61   pMaybe ){.    a
be30: 73 73 65 72 74 28 20 63 72 65 61 74 65 46 6c 61  ssert( createFla
be40: 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  g==0 );.    retu
be50: 72 6e 20 70 4d 61 79 62 65 3b 0a 20 20 7d 0a 20  rn pMaybe;.  }. 
be60: 20 69 66 28 20 70 3d 3d 30 20 26 26 20 63 72 65   if( p==0 && cre
be70: 61 74 65 46 6c 61 67 20 26 26 20 28 70 20 3d 20  ateFlag && (p = 
be80: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
be90: 65 6f 66 28 2a 70 29 29 29 21 3d 30 20 29 7b 0a  eof(*p)))!=0 ){.
bea0: 20 20 20 20 70 2d 3e 6e 41 72 67 20 3d 20 6e 41      p->nArg = nA
beb0: 72 67 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  rg;.    p->pNext
bec0: 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 70   = pFirst;.    p
bed0: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 70 46 69  ->dataType = pFi
bee0: 72 73 74 20 3f 20 70 46 69 72 73 74 2d 3e 64 61  rst ? pFirst->da
bef0: 74 61 54 79 70 65 20 3a 20 53 51 4c 49 54 45 5f  taType : SQLITE_
bf00: 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 73 71 6c  NUMERIC;.    sql
bf10: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
bf20: 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c  b->aFunc, zName,
bf30: 20 6e 4e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 70   nName, (void*)p
bf40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
bf50: 70 3b 0a 7d 0a                                   p;.}.