/ Hex Artifact Content
Login

Artifact 0c10a35c15756e90940d946cdec1e5c7d860ddc9:


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 39 39 20 32 30 30 33 2f 30 39 2f 30 36 20 30  .99 2003/09/06 0
0220: 31 3a 31 30 3a 34 37 20 64 72 68 20 45 78 70 20  1:10:47 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 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
1160: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e  = p->nExpr;.  pN
1170: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61  ew->a = sqliteMa
1180: 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a 73  lloc( p->nExpr*s
1190: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
11a0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
11b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
11c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
11d0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
11e0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20  Expr *pNewExpr, 
11f0: 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70  *pOldExpr;.    p
1200: 4e 65 77 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  New->a[i].pExpr 
1210: 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c  = pNewExpr = sql
1220: 69 74 65 45 78 70 72 44 75 70 28 70 4f 6c 64 45  iteExprDup(pOldE
1230: 78 70 72 20 3d 20 70 2d 3e 61 5b 69 5d 2e 70 45  xpr = p->a[i].pE
1240: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  xpr);.    if( pO
1250: 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d  ldExpr->span.z!=
1260: 30 20 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b  0 && pNewExpr ){
1270: 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  .      /* Always
1280: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
1290: 74 68 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70  the span for top
12a0: 2d 6c 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f  -level expressio
12b0: 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
12c0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
12d0: 73 74 2e 20 20 54 68 65 20 6c 6f 67 69 63 20 69  st.  The logic i
12e0: 6e 20 53 45 4c 45 43 54 20 70 72 6f 63 65 73 73  n SELECT process
12f0: 69 6e 67 20 74 68 61 74 20 64 65 74 65 72 6d 69  ing that determi
1300: 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  nes.      ** the
1310: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
1320: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
1330: 73 65 74 20 6e 65 65 64 73 20 74 68 69 73 20 69  set needs this i
1340: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
1350: 20 20 20 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43      sqliteTokenC
1360: 6f 70 79 28 26 70 4e 65 77 45 78 70 72 2d 3e 73  opy(&pNewExpr->s
1370: 70 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e  pan, &pOldExpr->
1380: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  span);.    }.   
1390: 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70   assert( pNewExp
13a0: 72 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70 72  r==0 || pNewExpr
13b0: 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20  ->span.z!=0 .   
13c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64           || pOld
13d0: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20  Expr->span.z==0 
13e0: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
13f0: 5f 66 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  _failed );.    p
1400: 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  New->a[i].zName 
1410: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
1420: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
1430: 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 73 6f     pNew->a[i].so
1440: 72 74 4f 72 64 65 72 20 3d 20 70 2d 3e 61 5b 69  rtOrder = p->a[i
1450: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
1460: 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 69 73 41 67   pNew->a[i].isAg
1470: 67 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73 41 67  g = p->a[i].isAg
1480: 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69  g;.    pNew->a[i
1490: 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ].done = 0;.  }.
14a0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
14b0: 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
14c0: 53 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69  SrcListDup(SrcLi
14d0: 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  st *p){.  SrcLis
14e0: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
14f0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
1500: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1510: 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20  rn 0;.  nByte = 
1520: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d  sizeof(*p) + (p-
1530: 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66  >nSrc>0 ? sizeof
1540: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
1550: 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20  nSrc-1) : 0);.  
1560: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
1570: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
1580: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
1590: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
15a0: 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  nSrc = pNew->nAl
15b0: 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20  loc = p->nSrc;. 
15c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
15d0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  Src; i++){.    p
15e0: 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62  New->a[i].zDatab
15f0: 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ase = sqliteStrD
1600: 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61  up(p->a[i].zData
1610: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  base);.    pNew-
1620: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
1630: 6c 69 74 65 53 74 72 44 75 70 28 70 2d 3e 61 5b  liteStrDup(p->a[
1640: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  i].zName);.    p
1650: 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  New->a[i].zAlias
1660: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
1670: 70 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  p->a[i].zAlias);
1680: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e  .    pNew->a[i].
1690: 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b  jointype = p->a[
16a0: 69 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  i].jointype;.   
16b0: 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 69 43 75 72   pNew->a[i].iCur
16c0: 73 6f 72 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69 43  sor = p->a[i].iC
16d0: 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 2d  ursor;.    pNew-
16e0: 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a  >a[i].pTab = 0;.
16f0: 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 70      pNew->a[i].p
1700: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53  Select = sqliteS
1710: 65 6c 65 63 74 44 75 70 28 70 2d 3e 61 5b 69 5d  electDup(p->a[i]
1720: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70  .pSelect);.    p
1730: 4e 65 77 2d 3e 61 5b 69 5d 2e 70 4f 6e 20 3d 20  New->a[i].pOn = 
1740: 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 2d  sqliteExprDup(p-
1750: 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20  >a[i].pOn);.    
1760: 70 4e 65 77 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e  pNew->a[i].pUsin
1770: 67 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74  g = sqliteIdList
1780: 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 70 55 73 69  Dup(p->a[i].pUsi
1790: 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ng);.  }.  retur
17a0: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
17b0: 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 44 75   *sqliteIdListDu
17c0: 70 28 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20  p(IdList *p){.  
17d0: 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  IdList *pNew;.  
17e0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
17f0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1800: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
1810: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
1820: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
1830: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1840: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e    pNew->nId = pN
1850: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
1860: 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  nId;.  pNew->a =
1870: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
1880: 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e  ->nId*sizeof(p->
1890: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
18a0: 4e 65 77 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75  New->a==0 ) retu
18b0: 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 0;.  for(i=0;
18c0: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
18d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e  .    pNew->a[i].
18e0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
18f0: 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  rDup(p->a[i].zNa
1900: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  me);.    pNew->a
1910: 5b 69 5d 2e 69 64 78 20 3d 20 70 2d 3e 61 5b 69  [i].idx = p->a[i
1920: 5d 2e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ].idx;.  }.  ret
1930: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
1940: 63 74 20 2a 73 71 6c 69 74 65 53 65 6c 65 63 74  ct *sqliteSelect
1950: 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Dup(Select *p){.
1960: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
1970: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1980: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
1990: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
19a0: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
19b0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
19c0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73  rn 0;.  pNew->is
19d0: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
19e0: 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77  Distinct;.  pNew
19f0: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
1a00: 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  eExprListDup(p->
1a10: 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d  pEList);.  pNew-
1a20: 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 53 72  >pSrc = sqliteSr
1a30: 63 4c 69 73 74 44 75 70 28 70 2d 3e 70 53 72 63  cListDup(p->pSrc
1a40: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  );.  pNew->pWher
1a50: 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  e = sqliteExprDu
1a60: 70 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  p(p->pWhere);.  
1a70: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
1a80: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
1a90: 75 70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  up(p->pGroupBy);
1aa0: 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
1ab0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70   = sqliteExprDup
1ac0: 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  (p->pHaving);.  
1ad0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
1ae0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
1af0: 75 70 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  up(p->pOrderBy);
1b00: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
1b10: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
1b20: 69 6f 72 20 3d 20 73 71 6c 69 74 65 53 65 6c 65  ior = sqliteSele
1b30: 63 74 44 75 70 28 70 2d 3e 70 50 72 69 6f 72 29  ctDup(p->pPrior)
1b40: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d 69 74  ;.  pNew->nLimit
1b50: 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20   = p->nLimit;.  
1b60: 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20 3d 20  pNew->nOffset = 
1b70: 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 70 4e  p->nOffset;.  pN
1b80: 65 77 2d 3e 7a 53 65 6c 65 63 74 20 3d 20 30 3b  ew->zSelect = 0;
1b90: 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20  .  pNew->iLimit 
1ba0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f  = -1;.  pNew->iO
1bb0: 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 72 65  ffset = -1;.  re
1bc0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f  turn pNew;.}.../
1bd0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
1be0: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
1bf0: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
1c00: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
1c10: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
1c20: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
1c30: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
1c40: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45  ssion list..*/.E
1c50: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 45  xprList *sqliteE
1c60: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45 78  xprListAppend(Ex
1c70: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 45  prList *pList, E
1c80: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
1c90: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
1ca0: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
1cc0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1cd0: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
1ce0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1cf0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
1d00: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
1d10: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
1d20: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1d30: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
1d40: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
1d50: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69  ist->nAlloc<=pLi
1d60: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
1d70: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1d80: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c  _item *a;.    pL
1d90: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c  ist->nAlloc = pL
1da0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
1db0: 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  4;.    a = sqlit
1dc0: 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
1dd0: 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  a, pList->nAlloc
1de0: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
1df0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
1e00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1e10: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 45  iteExprDelete(pE
1e20: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
1e30: 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a  rn pList;.    }.
1e40: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
1e50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
1e60: 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20  r || pName ){.  
1e70: 20 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78    i = pList->nEx
1e80: 70 72 2b 2b 3b 0a 20 20 20 20 70 4c 69 73 74 2d  pr++;.    pList-
1e90: 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45  >a[i].pExpr = pE
1ea0: 78 70 72 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  xpr;.    pList->
1eb0: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[i].zName = 0;.
1ec0: 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b      if( pName ){
1ed0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
1ee0: 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e  NString(&pList->
1ef0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[i].zName, pNam
1f00: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
1f10: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1f20: 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61  Dequote(pList->a
1f30: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
1f40: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1f50: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  List;.}../*.** D
1f60: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
1f70: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
1f80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45  .*/.void sqliteE
1f90: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78  xprListDelete(Ex
1fa0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
1fb0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1fc0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1fd0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1fe0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1ff0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  ){.    sqliteExp
2000: 72 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61  rDelete(pList->a
2010: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2020: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
2030: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
2040: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
2050: 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
2060: 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
2070: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
2080: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
2090: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
20a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
20b0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64   constant.** and
20c0: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
20d0: 73 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  s variables..**.
20e0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
20f0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
2100: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
2110: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
2120: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
2130: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
2140: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
2150: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
2160: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
2170: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
2180: 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72 49  .int sqliteExprI
2190: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
21a0: 70 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  p){.  switch( p-
21b0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
21c0: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
21d0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
21e0: 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20  ase TK_DOT:.    
21f0: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
2200: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
2210: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  ;.    case TK_NU
2220: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
2230: 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65  STRING:.    case
2240: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
2250: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
2260: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
2270: 41 42 4c 45 3a 0a 20 20 20 20 20 20 72 65 74 75  ABLE:.      retu
2280: 72 6e 20 31 3b 0a 20 20 20 20 64 65 66 61 75 6c  rn 1;.    defaul
2290: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
22a0: 2d 3e 70 4c 65 66 74 20 26 26 20 21 73 71 6c 69  ->pLeft && !sqli
22b0: 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  teExprIsConstant
22c0: 28 70 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  (p->pLeft) ) ret
22d0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28  urn 0;.      if(
22e0: 20 70 2d 3e 70 52 69 67 68 74 20 26 26 20 21 73   p->pRight && !s
22f0: 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74  qliteExprIsConst
2300: 61 6e 74 28 70 2d 3e 70 52 69 67 68 74 29 20 29  ant(p->pRight) )
2310: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
2320: 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b   if( p->pList ){
2330: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
2340: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2350: 20 69 3c 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78   i<p->pList->nEx
2360: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
2370: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 45      if( !sqliteE
2380: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d  xprIsConstant(p-
2390: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
23a0: 70 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  pr) ) return 0;.
23b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23c0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
23d0: 2d 3e 70 4c 65 66 74 21 3d 30 20 7c 7c 20 70 2d  ->pLeft!=0 || p-
23e0: 3e 70 52 69 67 68 74 21 3d 30 20 7c 7c 20 28 70  >pRight!=0 || (p
23f0: 2d 3e 70 4c 69 73 74 20 26 26 20 70 2d 3e 70 4c  ->pList && p->pL
2400: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 3b 0a 20  ist->nExpr>0);. 
2410: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2420: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
2430: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
2440: 73 73 69 6f 6e 20 63 6f 64 65 73 20 61 20 63 6f  ssion codes a co
2450: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 2c 20  nstant integer, 
2460: 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74  return 1 and put
2470: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
2480: 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e 20   the integer in 
2490: 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65  *pValue.  If the
24a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
24b0: 6f 74 20 61 6e 0a 2a 2a 20 69 6e 74 65 67 65 72  ot an.** integer
24c0: 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
24d0: 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
24e0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
24f0: 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65 67  qliteExprIsInteg
2500: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
2510: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74  *pValue){.  swit
2520: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
2530: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
2540: 3a 20 7b 0a 20 20 20 20 20 20 2a 70 56 61 6c 75  : {.      *pValu
2550: 65 20 3d 20 61 74 6f 69 28 70 2d 3e 74 6f 6b 65  e = atoi(p->toke
2560: 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n.z);.      retu
2570: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2580: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
2590: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
25a0: 61 72 20 2a 7a 20 3d 20 70 2d 3e 74 6f 6b 65 6e  ar *z = p->token
25b0: 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  .z;.      int n 
25c0: 3d 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  = p->token.n;.  
25d0: 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a      if( n>0 && z
25e0: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b  [0]=='-' ){ z++;
25f0: 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 77 68   n--; }.      wh
2600: 69 6c 65 28 20 6e 3e 30 20 26 26 20 2a 7a 20 26  ile( n>0 && *z &
2610: 26 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b  & isdigit(*z) ){
2620: 20 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20   z++; n--; }.   
2630: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
2640: 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
2650: 20 61 74 6f 69 28 70 2d 3e 74 6f 6b 65 6e 2e 7a   atoi(p->token.z
2660: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2670: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2690: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
26a0: 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  S: {.      retur
26b0: 6e 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e  n sqliteExprIsIn
26c0: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
26d0: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20  pValue);.    }. 
26e0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
26f0: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
2700: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
2710: 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  teExprIsInteger(
2720: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
2730: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
2740: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
2750: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
2760: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2770: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
2780: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2790: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
27a0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
27b0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
27c0: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
27d0: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
27e0: 20 73 71 6c 69 74 65 49 73 52 6f 77 69 64 28 63   sqliteIsRowid(c
27f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
2800: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
2810: 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29  mp(z, "_ROWID_")
2820: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
2830: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
2840: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
2850: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
2860: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
2870: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
2880: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
2890: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
28a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
28b0: 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f  lks an expressio
28c0: 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c  n tree and resol
28d0: 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20 74  ves references t
28e0: 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d  o.** table colum
28f0: 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68  ns.  Nodes of th
2900: 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20  e form ID.ID or 
2910: 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20  ID resolve into 
2920: 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74  an.** index to t
2930: 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  he table in the 
2940: 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61  table list and a
2950: 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20   column offset. 
2960: 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70   The .** Expr.op
2970: 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f  code for such no
2980: 64 65 73 20 69 73 20 63 68 61 6e 67 65 64 20 74  des is changed t
2990: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68  o TK_COLUMN.  Th
29a0: 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a  e Expr.iTable.**
29b0: 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65   value is change
29c0: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  d to the index o
29d0: 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  f the referenced
29e0: 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
29f0: 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22  st.** plus the "
2a00: 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68  base" value.  Th
2a10: 65 20 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c  e base value wil
2a20: 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63  l ultimately bec
2a30: 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20  ome the.** VDBE 
2a40: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
2a50: 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
2a60: 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f  is pointing into
2a70: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a   the referenced.
2a80: 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45  ** table.  The E
2a90: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  xpr.iColumn valu
2aa0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
2ab0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
2ac0: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74   column .** of t
2ad0: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
2ae0: 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ble.  The Expr.i
2af0: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72  Column value for
2b00: 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20   the special.** 
2b10: 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20  ROWID column is 
2b20: 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52  -1.  Any INTEGER
2b30: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
2b40: 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73 20  umn is tried as 
2b50: 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20  an.** alias for 
2b60: 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  ROWID..**.** We 
2b70: 61 6c 73 6f 20 63 68 65 63 6b 20 66 6f 72 20 69  also check for i
2b80: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
2b90: 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 4e  IN operator.  IN
2ba0: 20 63 6f 6d 65 73 20 69 6e 20 74 77 6f 0a 2a 2a   comes in two.**
2bb0: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
2bc0: 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e 20          expr IN 
2bd0: 28 65 78 70 72 6c 69 73 74 29 0a 2a 2a 20 61 6e  (exprlist).** an
2be0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65  d.**           e
2bf0: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
2c00: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ..).**.** The fi
2c10: 72 73 74 20 66 6f 72 6d 20 69 73 20 68 61 6e 64  rst form is hand
2c20: 6c 65 64 20 62 79 20 63 72 65 61 74 69 6e 67 20  led by creating 
2c30: 61 20 73 65 74 20 68 6f 6c 64 69 6e 67 20 74 68  a set holding th
2c40: 65 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c  e list.** of all
2c50: 6f 77 65 64 20 76 61 6c 75 65 73 2e 20 20 54 68  owed values.  Th
2c60: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 61  e second form ca
2c70: 75 73 65 73 20 74 68 65 20 53 45 4c 45 43 54 20  uses the SELECT 
2c80: 74 6f 20 67 65 6e 65 72 61 74 65 20 0a 2a 2a 20  to generate .** 
2c90: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
2ca0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2cb0: 75 74 69 6e 65 20 61 6c 73 6f 20 6c 6f 6f 6b 73  utine also looks
2cc0: 20 66 6f 72 20 73 63 61 6c 61 72 20 53 45 4c 45   for scalar SELE
2cd0: 43 54 73 20 74 68 61 74 20 61 72 65 20 70 61 72  CTs that are par
2ce0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
2cf0: 6f 6e 2e 0a 2a 2a 20 49 66 20 69 74 20 66 69 6e  on..** If it fin
2d00: 64 73 20 61 6e 79 2c 20 69 74 20 67 65 6e 65 72  ds any, it gener
2d10: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 77 72 69  ates code to wri
2d20: 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
2d30: 74 68 61 74 20 73 65 6c 65 63 74 0a 2a 2a 20 69  that select.** i
2d40: 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  nto a memory cel
2d50: 6c 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f 77 6e  l..**.** Unknown
2d60: 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 74 61 62 6c   columns or tabl
2d70: 65 73 20 70 72 6f 76 6f 6b 65 20 61 6e 20 65 72  es provoke an er
2d80: 72 6f 72 2e 20 20 54 68 65 20 66 75 6e 63 74 69  ror.  The functi
2d90: 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68  on returns.** th
2da0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2db0: 72 73 20 73 65 65 6e 20 61 6e 64 20 6c 65 61 76  rs seen and leav
2dc0: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
2dd0: 61 67 65 20 6f 6e 20 70 50 61 72 73 65 2d 3e 7a  age on pParse->z
2de0: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
2df0: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
2e00: 49 64 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Ids(.  Parse *pP
2e10: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
2e20: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
2e30: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
2e40: 61 62 4c 69 73 74 2c 20 2f 2a 20 4c 69 73 74 20  abList, /* List 
2e50: 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64 20 74  of tables used t
2e60: 6f 20 72 65 73 6f 6c 76 65 20 63 6f 6c 75 6d 6e  o resolve column
2e70: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 45 78 70 72   names */.  Expr
2e80: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 2f  List *pEList,  /
2e90: 2a 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73  * List of expres
2ea0: 73 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 72 65  sions used to re
2eb0: 73 6f 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20 20  solve "AS" */.  
2ec0: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
2ed0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
2ee0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79  sion to be analy
2ef0: 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  zed. */.){.  int
2f00: 20 69 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72   i;..  if( pExpr
2f10: 3d 3d 30 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  ==0 || pTabList=
2f20: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2f30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
2f40: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
2f50: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
2f60: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
2f70: 72 73 6f 72 3e 3d 30 20 26 26 20 70 54 61 62 4c  rsor>=0 && pTabL
2f80: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
2f90: 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 29  r<pParse->nTab )
2fa0: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
2fb0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
2fc0: 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65   /* Double-quote
2fd0: 64 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20 22  d strings (ex: "
2fe0: 61 62 63 22 29 20 61 72 65 20 75 73 65 64 20 61  abc") are used a
2ff0: 73 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 66  s identifiers if
3000: 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65  .    ** possible
3010: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
3020: 79 20 72 65 6d 61 69 6e 20 61 73 20 73 74 72 69  y remain as stri
3030: 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f  ngs.  Single-quo
3040: 74 65 64 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e  ted.    ** strin
3050: 67 73 20 28 65 78 3a 20 27 61 62 63 27 29 20 61  gs (ex: 'abc') a
3060: 72 65 20 61 6c 77 61 79 73 20 73 74 72 69 6e 67  re always string
3070: 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a   literals..    *
3080: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  /.    case TK_ST
3090: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66  RING: {.      if
30a0: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  ( pExpr->token.z
30b0: 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65 61  [0]=='\'' ) brea
30c0: 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  k;.      /* Fall
30d0: 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
30e0: 4b 5f 49 44 20 63 61 73 65 20 69 66 20 74 68 69  K_ID case if thi
30f0: 73 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  s is a double-qu
3100: 6f 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20  oted string */. 
3110: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f     }.    /* A lo
3120: 6e 65 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ne identifier.  
3130: 54 72 79 20 61 6e 64 20 6d 61 74 63 68 20 69 74  Try and match it
3140: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
3150: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 31   **.    **     1
3160: 2e 20 20 54 6f 20 74 68 65 20 6e 61 6d 65 20 6f  .  To the name o
3170: 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 6e  f a column of on
3180: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
3190: 69 6e 20 70 54 61 62 4c 69 73 74 0a 20 20 20 20  in pTabList.    
31a0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 32 2e  **.    **     2.
31b0: 20 20 54 6f 20 74 68 65 20 72 69 67 68 74 20 73    To the right s
31c0: 69 64 65 20 6f 66 20 61 6e 20 41 53 20 6b 65 79  ide of an AS key
31d0: 77 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  word in the colu
31e0: 6d 6e 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 2a  mn list of.    *
31f0: 2a 20 20 20 20 20 20 20 20 20 61 20 53 45 4c 45  *         a SELE
3200: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 28  CT statement.  (
3210: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 6d 61 74  For example, mat
3220: 63 68 20 61 67 61 69 6e 73 74 20 27 78 27 20 69  ch against 'x' i
3230: 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
3240: 20 22 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20   "SELECT a+b AS 
3250: 27 78 27 20 46 52 4f 4d 20 74 31 22 2e 29 0a 20  'x' FROM t1".). 
3260: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
3270: 20 33 2e 20 20 4f 6e 65 20 6f 66 20 74 68 65 20   3.  One of the 
3280: 73 70 65 63 69 61 6c 20 6e 61 6d 65 73 20 22 52  special names "R
3290: 4f 57 49 44 22 2c 20 22 4f 49 44 22 2c 20 6f 72  OWID", "OID", or
32a0: 20 22 5f 52 4f 57 49 44 5f 22 2e 0a 20 20 20 20   "_ROWID_"..    
32b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
32c0: 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  D: {.      int c
32d0: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  nt = 0;      /* 
32e0: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 65  Number of matche
32f0: 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  s */.      char 
3300: 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  *z;.      int iD
3310: 62 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 20 20 61  b = -1;..      a
3320: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f  ssert( pExpr->to
3330: 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 7a  ken.z );.      z
3340: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
3350: 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  (pExpr->token.z,
3360: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
3370: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  ;.      sqliteDe
3380: 71 75 6f 74 65 28 7a 29 3b 0a 20 20 20 20 20 20  quote(z);.      
3390: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
33a0: 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  n 1;.      for(i
33b0: 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
33c0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
33d0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
33e0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
33f0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
3400: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66  pTab;.        if
3410: 28 20 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pTab==0 ) cont
3420: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 44  inue;.        iD
3430: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
3440: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
3450: 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20  Tab->nCol>0 );. 
3460: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
3470: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
3480: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
3490: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
34a0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
34b0: 61 6d 65 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20  ame, z)==0 ){.  
34c0: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
34d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
34e0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 61  pr->iTable = pTa
34f0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
3500: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sor;.           
3510: 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54   pExpr->iDb = pT
3520: 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20  ab->iDb;.       
3530: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62       if( j==pTab
3540: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
3550: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73           /* Subs
3560: 74 69 74 75 74 65 20 74 68 65 20 72 65 63 6f 72  titute the recor
3570: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
3580: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
3590: 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20   KEY */.        
35a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
35b0: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
35c0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
35d0: 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c 49 54  dataType = SQLIT
35e0: 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20  E_SO_NUM;.      
35f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3600: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
3610: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  ->iColumn = j;. 
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
3630: 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 70  pr->dataType = p
3640: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 73 6f 72  Tab->aCol[j].sor
3650: 74 4f 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f  tOrder & SQLITE_
3660: 53 4f 5f 54 59 50 45 4d 41 53 4b 3b 0a 20 20 20  SO_TYPEMASK;.   
3670: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3680: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
3690: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
36a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
36c0: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
36d0: 70 45 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20  pEList!=0 ){.   
36e0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
36f0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3700: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  EList->nExpr; j+
3710: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68  +){.          ch
3720: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
3730: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
3740: 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21          if( zAs!
3750: 3d 30 20 26 26 20 73 71 6c 69 74 65 53 74 72 49  =0 && sqliteStrI
3760: 43 6d 70 28 7a 41 73 2c 20 7a 29 3d 3d 30 20 29  Cmp(zAs, z)==0 )
3770: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  {.            cn
3780: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
3790: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
37a0: 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
37b0: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
37d0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20  r->op = TK_AS;. 
37e0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
37f0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  ->iColumn = j;. 
3800: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
3810: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
3820: 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  ExprDup(pEList->
3830: 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
3840: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3850: 20 7d 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   } .      }.    
3860: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
3870: 69 44 62 3e 3d 30 20 26 26 20 73 71 6c 69 74 65  iDb>=0 && sqlite
3880: 49 73 52 6f 77 69 64 28 7a 29 20 29 7b 0a 20 20  IsRowid(z) ){.  
3890: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
38a0: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
38b0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
38c0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
38d0: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
38e0: 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20     pExpr->iDb = 
38f0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 63 6e 74  iDb;.        cnt
3900: 20 3d 20 31 20 2b 20 28 70 54 61 62 4c 69 73 74   = 1 + (pTabList
3910: 2d 3e 6e 53 72 63 3e 31 29 3b 0a 20 20 20 20 20  ->nSrc>1);.     
3920: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
3930: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
3940: 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70    pExpr->dataTyp
3950: 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  e = SQLITE_SO_NU
3960: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
3970: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
3980: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30        if( cnt==0
3990: 20 26 26 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e   && pExpr->token
39a0: 2e 7a 5b 30 5d 21 3d 27 22 27 20 29 7b 0a 20 20  .z[0]!='"' ){.  
39b0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
39c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
39d0: 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 54   such column: %T
39e0: 22 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ", &pExpr->token
39f0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
3a00: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
3a10: 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a 20 20   if( cnt>1 ){.  
3a20: 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
3a30: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6d  rMsg(pParse, "am
3a40: 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e  biguous column n
3a50: 61 6d 65 3a 20 25 54 22 2c 20 26 70 45 78 70 72  ame: %T", &pExpr
3a60: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
3a70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3a80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
3a90: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
3aa0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  MN ){.        sq
3ab0: 6c 69 74 65 41 75 74 68 52 65 61 64 28 70 50 61  liteAuthRead(pPa
3ac0: 72 73 65 2c 20 70 45 78 70 72 2c 20 70 54 61 62  rse, pExpr, pTab
3ad0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
3ae0: 20 20 20 20 20 62 72 65 61 6b 3b 20 0a 20 20 20       break; .   
3af0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74   }.  .    /* A t
3b00: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f  able name and co
3b10: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49  lumn name:     I
3b20: 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61  D.ID.    ** Or a
3b30: 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65   database, table
3b40: 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44   and column:  ID
3b50: 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20  .ID.ID.    */.  
3b60: 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b    case TK_DOT: {
3b70: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
3b80: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
3b90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
3ba0: 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ches */.      in
3bb0: 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20  t cntTab = 0;   
3bc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3bd0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62   of matching tab
3be0: 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  les */.      int
3bf0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
3c00: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
3c10: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
3c20: 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69  xpr *pLeft, *pRi
3c30: 67 68 74 3b 20 20 20 20 2f 2a 20 4c 65 66 74 20  ght;    /* Left 
3c40: 61 6e 64 20 72 69 67 68 74 20 73 75 62 62 72 61  and right subbra
3c50: 6e 63 68 65 73 20 6f 66 20 74 68 65 20 65 78 70  nches of the exp
3c60: 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  r */.      char 
3c70: 2a 7a 4c 65 66 74 2c 20 2a 7a 52 69 67 68 74 3b  *zLeft, *zRight;
3c80: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 61      /* Text of a
3c90: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a  n identifier */.
3ca0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 44 62 3b        char *zDb;
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3cc0: 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61  * Name of databa
3cd0: 73 65 20 68 6f 6c 64 69 6e 67 20 74 61 62 6c 65  se holding table
3ce0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3cf0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
3d00: 62 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74  b;..      pRight
3d10: 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
3d20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  ;.      if( pRig
3d30: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  ht->op==TK_ID ){
3d40: 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d  .        pLeft =
3d50: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
3d60: 20 20 20 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a         zDb = 0;.
3d70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3d80: 20 20 20 20 20 45 78 70 72 20 2a 70 44 62 20 3d       Expr *pDb =
3d90: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
3da0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
3db0: 44 62 20 26 26 20 70 44 62 2d 3e 6f 70 3d 3d 54  Db && pDb->op==T
3dc0: 4b 5f 49 44 20 26 26 20 70 44 62 2d 3e 74 6f 6b  K_ID && pDb->tok
3dd0: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 20 20  en.z );.        
3de0: 7a 44 62 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  zDb = sqliteStrN
3df0: 44 75 70 28 70 44 62 2d 3e 74 6f 6b 65 6e 2e 7a  Dup(pDb->token.z
3e00: 2c 20 70 44 62 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  , pDb->token.n);
3e10: 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d  .        pLeft =
3e20: 20 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 3b 0a   pRight->pLeft;.
3e30: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
3e40: 20 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 3b   pRight->pRight;
3e50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
3e60: 73 73 65 72 74 28 20 70 4c 65 66 74 20 26 26 20  ssert( pLeft && 
3e70: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
3e80: 20 26 26 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e   && pLeft->token
3e90: 2e 7a 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  .z );.      asse
3ea0: 72 74 28 20 70 52 69 67 68 74 20 26 26 20 70 52  rt( pRight && pR
3eb0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  ight->op==TK_ID 
3ec0: 26 26 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  && pRight->token
3ed0: 2e 7a 20 29 3b 0a 20 20 20 20 20 20 7a 4c 65 66  .z );.      zLef
3ee0: 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  t = sqliteStrNDu
3ef0: 70 28 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a  p(pLeft->token.z
3f00: 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e  , pLeft->token.n
3f10: 29 3b 0a 20 20 20 20 20 20 7a 52 69 67 68 74 20  );.      zRight 
3f20: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
3f30: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c  pRight->token.z,
3f40: 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e   pRight->token.n
3f50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 65  );.      if( zLe
3f60: 66 74 3d 3d 30 20 7c 7c 20 7a 52 69 67 68 74 3d  ft==0 || zRight=
3f70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
3f80: 6c 69 74 65 46 72 65 65 28 7a 4c 65 66 74 29 3b  liteFree(zLeft);
3f90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
3fa0: 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  ree(zRight);.   
3fb0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
3fc0: 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 72 65  zDb);.        re
3fd0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
3fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
3ff0: 6f 74 65 28 7a 44 62 29 3b 0a 20 20 20 20 20 20  ote(zDb);.      
4000: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c  sqliteDequote(zL
4010: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
4020: 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67 68 74  teDequote(zRight
4030: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
4040: 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 20  iTable = -1;.   
4050: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
4060: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
4070: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
4080: 6a 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  j;.        char 
4090: 2a 7a 54 61 62 3b 0a 20 20 20 20 20 20 20 20 54  *zTab;.        T
40a0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
40b0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
40c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
40d0: 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ab==0 ) continue
40e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
40f0: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29  ( pTab->nCol>0 )
4100: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
4110: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
4120: 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ias ){.         
4130: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
4140: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20  ->a[i].zAlias;. 
4150: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
4160: 69 74 65 53 74 72 49 43 6d 70 28 7a 54 61 62 2c  iteStrICmp(zTab,
4170: 20 7a 4c 65 66 74 29 21 3d 30 20 29 20 63 6f 6e   zLeft)!=0 ) con
4180: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
4190: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
41a0: 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTab = pTab->zNa
41b0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  me;.          if
41c0: 28 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 73 71 6c  ( zTab==0 || sql
41d0: 69 74 65 53 74 72 49 43 6d 70 28 7a 54 61 62 2c  iteStrICmp(zTab,
41e0: 20 7a 4c 65 66 74 29 21 3d 30 20 29 20 63 6f 6e   zLeft)!=0 ) con
41f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
4200: 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73   if( zDb!=0 && s
4210: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 64 62 2d  qliteStrICmp(db-
4220: 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e  >aDb[pTab->iDb].
4230: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
4240: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
4250: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
4260: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
4270: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e        if( 0==(cn
4280: 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20  tTab++) ){.     
4290: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
42a0: 6c 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  le = pTabList->a
42b0: 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20  [i].iCursor;.   
42c0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
42d0: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
42e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
42f0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
4300: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
4310: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
4320: 74 65 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  teStrICmp(pTab->
4330: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[j].zName, z
4340: 52 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20 20  Right)==0 ){.   
4350: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
4360: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
4370: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 61 62  r->iTable = pTab
4380: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
4390: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  or;.            
43a0: 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61  pExpr->iDb = pTa
43b0: 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20  b->iDb;.        
43c0: 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
43d0: 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f 6c  e the rowid (col
43e0: 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65 20  umn -1) for the 
43f0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4400: 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  KEY */.         
4410: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
4420: 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  n = j==pTab->iPK
4430: 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20  ey ? -1 : j;.   
4440: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
4450: 64 61 74 61 54 79 70 65 20 3d 20 70 54 61 62 2d  dataType = pTab-
4460: 3e 61 43 6f 6c 5b 6a 5d 2e 73 6f 72 74 4f 72 64  >aCol[j].sortOrd
4470: 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54  er & SQLITE_SO_T
4480: 59 50 45 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20  YPEMASK;.       
4490: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
44a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
44b0: 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20   If we have not 
44c0: 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64  already resolved
44d0: 20 74 68 69 73 20 2a 2e 2a 20 65 78 70 72 65 73   this *.* expres
44e0: 73 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 79 62 65  sion, then maybe
44f0: 20 0a 20 20 20 20 20 20 20 2a 20 69 74 20 69 73   .       * it is
4500: 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e   a new.* or old.
4510: 2a 20 74 72 69 67 67 65 72 20 61 72 67 75 6d 65  * trigger argume
4520: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  nt reference */.
4530: 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 3d 3d        if( cnt ==
4540: 20 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72   0 && pParse->tr
4550: 69 67 53 74 61 63 6b 20 21 3d 20 30 20 29 7b 0a  igStack != 0 ){.
4560: 20 20 20 20 20 20 20 20 54 72 69 67 67 65 72 53          TriggerS
4570: 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74  tack *pTriggerSt
4580: 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72  ack = pParse->tr
4590: 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 20  igStack;.       
45a0: 20 69 6e 74 20 74 20 3d 20 30 3b 0a 20 20 20 20   int t = 0;.    
45b0: 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72      if( pTrigger
45c0: 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d  Stack->newIdx !=
45d0: 20 2d 31 20 26 26 20 73 71 6c 69 74 65 53 74 72   -1 && sqliteStr
45e0: 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 4c 65 66  ICmp("new", zLef
45f0: 74 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20  t) == 0 ){.     
4600: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
4610: 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  le = pTriggerSta
4620: 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20  ck->newIdx;.    
4630: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
4640: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
4650: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  b );.          p
4660: 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 72 69  Expr->iDb = pTri
4670: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 2d  ggerStack->pTab-
4680: 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20  >iDb;.          
4690: 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  cntTab++;.      
46a0: 20 20 20 20 74 20 3d 20 31 3b 0a 20 20 20 20 20      t = 1;.     
46b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
46c0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
46d0: 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26 26 20  oldIdx != -1 && 
46e0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 22 6f  sqliteStrICmp("o
46f0: 6c 64 22 2c 20 7a 4c 65 66 74 29 20 3d 3d 20 30  ld", zLeft) == 0
4700: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
4710: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54  xpr->iTable = pT
4720: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
4730: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61  Idx;.          a
4740: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53  ssert( pTriggerS
4750: 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20  tack->pTab );.  
4760: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
4770: 44 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  Db = pTriggerSta
4780: 63 6b 2d 3e 70 54 61 62 2d 3e 69 44 62 3b 0a 20  ck->pTab->iDb;. 
4790: 20 20 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b           cntTab+
47a0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 74 20 3d  +;.          t =
47b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   1;.        }.. 
47c0: 20 20 20 20 20 20 20 69 66 28 20 74 20 29 7b 20         if( t ){ 
47d0: 0a 09 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20  ..  int j;.     
47e0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
47f0: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
4800: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
4810: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20 70    for(j=0; j < p
4820: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 20  Tab->nCol; j++) 
4830: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
4840: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
4850: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
4860: 61 6d 65 2c 20 7a 52 69 67 68 74 29 3d 3d 30 20  ame, zRight)==0 
4870: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
4880: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
4890: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
48a0: 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e  lumn = j==pTab->
48b0: 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a  iPKey ? -1 : j;.
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
48d0: 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20  xpr->dataType = 
48e0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 73 6f  pTab->aCol[j].so
48f0: 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49 54 45  rtOrder & SQLITE
4900: 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 3b 0a 20 20  _SO_TYPEMASK;.  
4910: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4920: 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 20        }..}.     
4930: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 63 6e   }..      if( cn
4940: 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d  t==0 && cntTab==
4950: 31 20 26 26 20 73 71 6c 69 74 65 49 73 52 6f 77  1 && sqliteIsRow
4960: 69 64 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  id(zRight) ){.  
4970: 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20        cnt = 1;. 
4980: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
4990: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
49a0: 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54      pExpr->dataT
49b0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  ype = SQLITE_SO_
49c0: 4e 55 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NUM;.      }.   
49d0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44     sqliteFree(zD
49e0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
49f0: 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 20  Free(zLeft);.   
4a00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52     sqliteFree(zR
4a10: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ight);.      if(
4a20: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   cnt==0 ){.     
4a30: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
4a40: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
4a50: 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 54 2e 25 54  ch column: %T.%T
4a60: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
4a70: 20 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c    &pLeft->token,
4a80: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29   &pRight->token)
4a90: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
4aa0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
4ab0: 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a 20 20 20  if( cnt>1 ){.   
4ac0: 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72       sqliteError
4ad0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6d 62  Msg(pParse, "amb
4ae0: 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61  iguous column na
4af0: 6d 65 3a 20 25 54 2e 25 54 22 2c 0a 20 20 20 20  me: %T.%T",.    
4b00: 20 20 20 20 20 20 26 70 4c 65 66 74 2d 3e 74 6f        &pLeft->to
4b10: 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f  ken, &pRight->to
4b20: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ken);.        re
4b30: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
4b40: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
4b50: 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 4c  Delete(pExpr->pL
4b60: 65 66 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  eft);.      pExp
4b70: 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r->pLeft = 0;.  
4b80: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
4b90: 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67  lete(pExpr->pRig
4ba0: 68 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ht);.      pExpr
4bb0: 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  ->pRight = 0;.  
4bc0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
4bd0: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
4be0: 20 73 71 6c 69 74 65 41 75 74 68 52 65 61 64 28   sqliteAuthRead(
4bf0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70  pParse, pExpr, p
4c00: 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  TabList);.      
4c10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4c20: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
4c30: 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
4c40: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
4c50: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
4c60: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   v==0 ) return 1
4c70: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
4c80: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
4c90: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
4ca0: 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72  t, pEList, pExpr
4cb0: 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  ->pLeft) ){.    
4cc0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4cd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4ce0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
4cf0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
4d00: 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
4d10: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
4d20: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
4d30: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
4d40: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
4d50: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
4d60: 6c 65 63 74 20 69 6e 74 6f 20 61 20 74 65 6d 70  lect into a temp
4d70: 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  orary.        **
4d80: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 75 72   table.  The cur
4d90: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
4da0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
4db0: 65 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  e has already.  
4dc0: 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 70 75        ** been pu
4dd0: 74 20 69 6e 20 69 54 61 62 6c 65 20 62 79 20 73  t in iTable by s
4de0: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
4df0: 49 6e 53 65 6c 65 63 74 28 29 2e 0a 20 20 20 20  InSelect()..    
4e00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
4e10: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
4e20: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
4e30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
4e40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
4e50: 6e 54 65 6d 70 2c 20 70 45 78 70 72 2d 3e 69 54  nTemp, pExpr->iT
4e60: 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  able, 1);.      
4e70: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70    sqliteSelect(p
4e80: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53  Parse, pExpr->pS
4e90: 65 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20  elect, SRT_Set, 
4ea0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
4eb0: 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ,0,0);.      }el
4ec0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  se if( pExpr->pL
4ed0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
4ee0: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
4ef0: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
4f00: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
4f10: 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20      ** Create a 
4f20: 73 65 74 20 74 6f 20 70 75 74 20 74 68 65 20 65  set to put the e
4f30: 78 70 72 6c 69 73 74 20 76 61 6c 75 65 73 20 69  xprlist values i
4f40: 6e 2e 20 20 54 68 65 20 53 65 74 20 69 64 20 69  n.  The Set id i
4f50: 73 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20  s stored.       
4f60: 20 2a 2a 20 69 6e 20 69 54 61 62 6c 65 2e 0a 20   ** in iTable.. 
4f70: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
4f80: 20 20 69 6e 74 20 69 2c 20 69 53 65 74 3b 0a 20    int i, iSet;. 
4f90: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
4fa0: 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  i<pExpr->pList->
4fb0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
4fc0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
4fd0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
4fe0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
4ff0: 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
5000: 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  teExprIsConstant
5010: 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20  (pE2) ){.       
5020: 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72       sqliteError
5030: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
5040: 20 20 20 20 20 20 20 20 20 20 22 72 69 67 68 74            "right
5050: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e  -hand side of IN
5060: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62   operator must b
5070: 65 20 63 6f 6e 73 74 61 6e 74 22 29 3b 0a 20 20  e constant");.  
5080: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5090: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
50a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
50b0: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
50c0: 61 72 73 65 2c 20 70 45 32 2c 20 30 2c 20 30 29  arse, pE2, 0, 0)
50d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
50e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
50f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
5100: 20 20 20 20 20 20 20 20 69 53 65 74 20 3d 20 70          iSet = p
5110: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
5120: 50 61 72 73 65 2d 3e 6e 53 65 74 2b 2b 3b 0a 20  Parse->nSet++;. 
5130: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
5140: 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  i<pExpr->pList->
5150: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
5160: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
5170: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
5180: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
5190: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70         switch( p
51a0: 45 32 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20  E2->op ){.      
51b0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c        case TK_FL
51c0: 4f 41 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OAT:.           
51d0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
51e0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  :.            ca
51f0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
5210: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56  t addr = sqliteV
5220: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
5230: 65 74 49 6e 73 65 72 74 2c 20 69 53 65 74 2c 20  etInsert, iSet, 
5240: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
5250: 20 20 61 73 73 65 72 74 28 20 70 45 32 2d 3e 74    assert( pE2->t
5260: 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20  oken.z );.      
5270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
5280: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
5290: 64 72 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e 7a  dr, pE2->token.z
52a0: 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  , pE2->token.n);
52b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
52c0: 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74 65  qliteVdbeDequote
52d0: 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  P3(v, addr);.   
52e0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
52f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
5300: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
5310: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ult: {.         
5320: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
5330: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32 29  ode(pParse, pE2)
5340: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
5350: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5360: 76 2c 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c  v, OP_SetInsert,
5370: 20 69 53 65 74 2c 20 30 29 3b 0a 20 20 20 20 20   iSet, 0);.     
5380: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5390: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
53a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
53b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
53c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
53d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
53e0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
53f0: 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
5400: 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
5410: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
5420: 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
5430: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
5440: 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
5450: 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
5460: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
5470: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
5480: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
5490: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
54a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
54b0: 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  umn = pParse->nM
54c0: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  em++;.      if( 
54d0: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
54e0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c  rse, pExpr->pSel
54f0: 65 63 74 2c 20 53 52 54 5f 4d 65 6d 2c 20 70 45  ect, SRT_Mem, pE
5500: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 30 2c 30  xpr->iColumn,0,0
5510: 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ,0) ){.        r
5520: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
5530: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5540: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
5550: 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20 72  all else, just r
5560: 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20  ecursively walk 
5570: 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 20 20  the tree */.    
5580: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
5590: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
55a0: 74 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  t.      && sqlit
55b0: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
55c0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
55d0: 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d  , pEList, pExpr-
55e0: 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20  >pLeft) ){.     
55f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
5600: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5610: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 0a 20 20  Expr->pRight .  
5620: 20 20 20 20 26 26 20 73 71 6c 69 74 65 45 78 70      && sqliteExp
5630: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
5640: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
5650: 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  List, pExpr->pRi
5660: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ght) ){.        
5670: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
5680: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
5690: 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  r->pList ){.    
56a0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
56b0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
56c0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
56d0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  t;.        for(i
56e0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
56f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
5700: 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d      Expr *pArg =
5710: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
5720: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
5730: 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f  ( sqliteExprReso
5740: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
5750: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
5760: 20 70 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20   pArg) ){.      
5770: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
5780: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5790: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
57a0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
57b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78   0;.}../*.** pEx
57c0: 70 72 20 69 73 20 61 20 6e 6f 64 65 20 74 68 61  pr is a node tha
57d0: 74 20 64 65 66 69 6e 65 73 20 61 20 66 75 6e 63  t defines a func
57e0: 74 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  tion of some kin
57f0: 64 2e 20 20 49 74 20 6d 69 67 68 74 0a 2a 2a 20  d.  It might.** 
5800: 62 65 20 61 20 73 79 6e 74 61 63 74 69 63 20 66  be a syntactic f
5810: 75 6e 63 74 69 6f 6e 20 6c 69 6b 65 20 22 63 6f  unction like "co
5820: 75 6e 74 28 78 29 22 20 6f 72 20 69 74 20 6d 69  unt(x)" or it mi
5830: 67 68 74 20 62 65 20 61 20 66 75 6e 63 74 69 6f  ght be a functio
5840: 6e 0a 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65 6d  n.** that implem
5850: 65 6e 74 73 20 61 6e 20 6f 70 65 72 61 74 6f 72  ents an operator
5860: 2c 20 6c 69 6b 65 20 22 61 20 4c 49 4b 45 20 62  , like "a LIKE b
5870: 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ".  .**.** This 
5880: 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 2a 70  routine makes *p
5890: 7a 4e 61 6d 65 20 70 6f 69 6e 74 20 74 6f 20 74  zName point to t
58a0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
58b0: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 0a 2a 2a 20  unction and .** 
58c0: 2a 70 6e 4e 61 6d 65 20 68 6f 6c 64 20 74 68 65  *pnName hold the
58d0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
58e0: 63 74 65 72 73 20 69 6e 20 74 68 65 20 66 75 6e  cters in the fun
58f0: 63 74 69 6f 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  ction name..*/.s
5900: 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 46 75  tatic void getFu
5910: 6e 63 74 69 6f 6e 4e 61 6d 65 28 45 78 70 72 20  nctionName(Expr 
5920: 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63 68  *pExpr, const ch
5930: 61 72 20 2a 2a 70 7a 4e 61 6d 65 2c 20 69 6e 74  ar **pzName, int
5940: 20 2a 70 6e 4e 61 6d 65 29 7b 0a 20 20 73 77 69   *pnName){.  swi
5950: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
5960: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  {.    case TK_FU
5970: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
5980: 2a 70 7a 4e 61 6d 65 20 3d 20 70 45 78 70 72 2d  *pzName = pExpr-
5990: 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  >token.z;.      
59a0: 2a 70 6e 4e 61 6d 65 20 3d 20 70 45 78 70 72 2d  *pnName = pExpr-
59b0: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  >token.n;.      
59c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
59d0: 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 20 7b   case TK_LIKE: {
59e0: 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d  .      *pzName =
59f0: 20 22 6c 69 6b 65 22 3b 0a 20 20 20 20 20 20 2a   "like";.      *
5a00: 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20 20 20 20  pnName = 4;.    
5a10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5a20: 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a     case TK_GLOB:
5a30: 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65   {.      *pzName
5a40: 20 3d 20 22 67 6c 6f 62 22 3b 0a 20 20 20 20 20   = "glob";.     
5a50: 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20 20   *pnName = 4;.  
5a60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5a70: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
5a80: 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20        *pzName = 
5a90: 22 63 61 6e 27 74 20 68 61 70 70 65 6e 22 3b 0a  "can't happen";.
5aa0: 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20        *pnName = 
5ab0: 31 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  12;.      break;
5ac0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
5ad0: 0a 2a 2a 20 45 72 72 6f 72 20 63 68 65 63 6b 20  .** Error check 
5ae0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  the functions in
5af0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20   an expression. 
5b00: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 0a 2a   Make sure all.*
5b10: 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  * function names
5b20: 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20   are recognized 
5b30: 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  and all function
5b40: 73 20 68 61 76 65 20 74 68 65 20 63 6f 72 72 65  s have the corre
5b50: 63 74 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  ct.** number of 
5b60: 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76  arguments.  Leav
5b70: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
5b80: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
5b90: 72 72 4d 73 67 0a 2a 2a 20 69 66 20 61 6e 79 74  rrMsg.** if anyt
5ba0: 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20  hing is amiss.  
5bb0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5bc0: 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
5bd0: 2a 2a 20 69 66 20 70 49 73 41 67 67 20 69 73 20  ** if pIsAgg is 
5be0: 6e 6f 74 20 6e 75 6c 6c 20 61 6e 64 20 74 68 69  not null and thi
5bf0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
5c00: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
5c10: 63 74 69 6f 6e 0a 2a 2a 20 28 6c 69 6b 65 20 63  ction.** (like c
5c20: 6f 75 6e 74 28 2a 29 20 6f 72 20 6d 61 78 28 76  ount(*) or max(v
5c30: 61 6c 75 65 29 29 20 74 68 65 6e 20 77 72 69 74  alue)) then writ
5c40: 65 20 61 20 31 20 69 6e 74 6f 20 2a 70 49 73 41  e a 1 into *pIsA
5c50: 67 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  gg..*/.int sqlit
5c60: 65 45 78 70 72 43 68 65 63 6b 28 50 61 72 73 65  eExprCheck(Parse
5c70: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
5c80: 70 45 78 70 72 2c 20 69 6e 74 20 61 6c 6c 6f 77  pExpr, int allow
5c90: 41 67 67 2c 20 69 6e 74 20 2a 70 49 73 41 67 67  Agg, int *pIsAgg
5ca0: 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  ){.  int nErr = 
5cb0: 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  0;.  if( pExpr==
5cc0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
5cd0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
5ce0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
5cf0: 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20  _GLOB:.    case 
5d00: 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63 61 73  TK_LIKE:.    cas
5d10: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
5d20: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  .      int n = p
5d30: 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45  Expr->pList ? pE
5d40: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
5d50: 72 20 3a 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  r : 0;  /* Numbe
5d60: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
5d70: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73  /.      int no_s
5d80: 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20  uch_func = 0;   
5d90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
5da0: 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 20  o such function 
5db0: 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20  exists */.      
5dc0: 69 6e 74 20 69 73 5f 74 79 70 65 5f 6f 66 20 3d  int is_type_of =
5dd0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
5de0: 72 75 65 20 69 66 20 69 73 20 74 68 65 20 73 70  rue if is the sp
5df0: 65 63 69 61 6c 20 54 79 70 65 4f 66 28 29 20 66  ecial TypeOf() f
5e00: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
5e10: 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   int wrong_num_a
5e20: 72 67 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  rgs = 0;     /* 
5e30: 54 72 75 65 20 69 66 20 77 72 6f 6e 67 20 6e 75  True if wrong nu
5e40: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
5e50: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
5e60: 73 5f 61 67 67 20 3d 20 30 3b 20 20 20 20 20 20  s_agg = 0;      
5e70: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
5e80: 66 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  f is an aggregat
5e90: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
5ea0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
5eb0: 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20   int nId;       
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ed0: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
5ee0: 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e  ters in function
5ef0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63   name */.      c
5f00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
5f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5f20: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e  e function name.
5f30: 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
5f40: 66 20 2a 70 44 65 66 3b 0a 0a 20 20 20 20 20 20  f *pDef;..      
5f50: 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28  getFunctionName(
5f60: 70 45 78 70 72 2c 20 26 7a 49 64 2c 20 26 6e 49  pExpr, &zId, &nI
5f70: 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  d);.      pDef =
5f80: 20 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74   sqliteFindFunct
5f90: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
5fa0: 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 30 29 3b  zId, nId, n, 0);
5fb0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
5fc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =0 ){.        pD
5fd0: 65 66 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 46  ef = sqliteFindF
5fe0: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
5ff0: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31  db, zId, nId, -1
6000: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
6010: 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
6020: 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 31 20         if( n==1 
6030: 26 26 20 6e 49 64 3d 3d 36 20 26 26 20 73 71 6c  && nId==6 && sql
6040: 69 74 65 53 74 72 4e 49 43 6d 70 28 7a 49 64 2c  iteStrNICmp(zId,
6050: 20 22 74 79 70 65 6f 66 22 2c 20 36 29 3d 3d 30   "typeof", 6)==0
6060: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6070: 69 73 5f 74 79 70 65 5f 6f 66 20 3d 20 31 3b 0a  is_type_of = 1;.
6080: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
6090: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f  {.            no
60a0: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a  _such_func = 1;.
60b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
60c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
60d0: 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61       wrong_num_a
60e0: 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  rgs = 1;.       
60f0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
6100: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
6110: 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b   pDef->xFunc==0;
6120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6130: 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 61 6c  f( is_agg && !al
6140: 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20  lowAgg ){.      
6150: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
6160: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
6170: 4d 73 67 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  Msg, "misuse of 
6180: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
6190: 6f 6e 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20  on ", -1,.      
61a0: 20 20 20 20 20 7a 49 64 2c 20 6e 49 64 2c 20 22       zId, nId, "
61b0: 28 29 22 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  ()", 2, 0);.    
61c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
61d0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72  ++;.        nErr
61e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61  ++;.        is_a
61f0: 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  gg = 0;.      }e
6200: 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f  lse if( no_such_
6210: 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  func ){.        
6220: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
6230: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
6240: 67 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63  g, "no such func
6250: 74 69 6f 6e 3a 20 22 2c 20 2d 31 2c 20 7a 49 64  tion: ", -1, zId
6260: 2c 6e 49 64 2c 30 29 3b 0a 20 20 20 20 20 20 20  ,nId,0);.       
6270: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6280: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  .        nErr++;
6290: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
62a0: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
62b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
62c0: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
62d0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20  rse->zErrMsg, . 
62e0: 20 20 20 20 20 20 20 20 20 20 22 77 72 6f 6e 67            "wrong
62f0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
6300: 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e  ents to function
6310: 20 22 2c 20 2d 31 2c 20 7a 49 64 2c 20 6e 49 64   ", -1, zId, nId
6320: 2c 20 22 28 29 22 2c 20 32 2c 20 30 29 3b 0a 20  , "()", 2, 0);. 
6330: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
6340: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e  Err++;.        n
6350: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Err++;.      }. 
6360: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
6370: 29 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b  ) pExpr->op = TK
6380: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20  _AGG_FUNCTION;. 
6390: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
63a0: 26 26 20 70 49 73 41 67 67 20 29 20 2a 70 49 73  && pIsAgg ) *pIs
63b0: 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  Agg = 1;.      f
63c0: 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20  or(i=0; nErr==0 
63d0: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
63e0: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
63f0: 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61  iteExprCheck(pPa
6400: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
6410: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 0a 20  t->a[i].pExpr,. 
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6c                al
6440: 6c 6f 77 41 67 67 20 26 26 20 21 69 73 5f 61 67  lowAgg && !is_ag
6450: 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20  g, pIsAgg);.    
6460: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
6470: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
6480: 20 69 66 28 20 69 73 5f 74 79 70 65 5f 6f 66 20   if( is_type_of 
6490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ){.          pEx
64a0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54 52 49  pr->op = TK_STRI
64b0: 4e 47 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  NG;.          if
64c0: 28 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  ( sqliteExprType
64d0: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61  (pExpr->pList->a
64e0: 5b 30 5d 2e 70 45 78 70 72 29 3d 3d 53 51 4c 49  [0].pExpr)==SQLI
64f0: 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20  TE_SO_NUM ){.   
6500: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6510: 74 6f 6b 65 6e 2e 7a 20 3d 20 22 6e 75 6d 65 72  token.z = "numer
6520: 69 63 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ic";.           
6530: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20   pExpr->token.n 
6540: 3d 20 37 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 7;.          }
6550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6560: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
6570: 20 3d 20 22 74 65 78 74 22 3b 0a 20 20 20 20 20   = "text";.     
6580: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
6590: 6b 65 6e 2e 6e 20 3d 20 34 3b 0a 20 20 20 20 20  ken.n = 4;.     
65a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
65b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
65c0: 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65 3e   pDef->dataType>
65d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
65e0: 28 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65  ( pDef->dataType
65f0: 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <n ){.          
6600: 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20  pExpr->dataType 
6610: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
6620: 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 70  sqliteExprType(p
6630: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 70  Expr->pList->a[p
6640: 44 65 66 2d 3e 64 61 74 61 54 79 70 65 5d 2e 70  Def->dataType].p
6650: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
6660: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6670: 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20  pExpr->dataType 
6680: 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b  = SQLITE_SO_NUM;
6690: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
66a0: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 66 2d   }else if( pDef-
66b0: 3e 64 61 74 61 54 79 70 65 3d 3d 53 51 4c 49 54  >dataType==SQLIT
66c0: 45 5f 41 52 47 53 20 29 7b 0a 20 20 20 20 20 20  E_ARGS ){.      
66d0: 20 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65    pDef->dataType
66e0: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58   = SQLITE_SO_TEX
66f0: 54 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  T;.        for(i
6700: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
6710: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
6720: 69 74 65 45 78 70 72 54 79 70 65 28 70 45 78 70  iteExprType(pExp
6730: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
6740: 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  Expr)==SQLITE_SO
6750: 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  _NUM ){.        
6760: 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54      pExpr->dataT
6770: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  ype = SQLITE_SO_
6780: 4e 55 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NUM;.           
6790: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
67a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
67b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44      }else if( pD
67c0: 65 66 2d 3e 64 61 74 61 54 79 70 65 3d 3d 53 51  ef->dataType==SQ
67d0: 4c 49 54 45 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  LITE_NUMERIC ){.
67e0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64          pExpr->d
67f0: 61 74 61 54 79 70 65 20 3d 20 53 51 4c 49 54 45  ataType = SQLITE
6800: 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 7d  _SO_NUM;.      }
6810: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 45  else{.        pE
6820: 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20  xpr->dataType = 
6830: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
6840: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6850: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
6860: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
6870: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  eft ){.        n
6880: 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  Err = sqliteExpr
6890: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
68a0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 6c 6c 6f  xpr->pLeft, allo
68b0: 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20  wAgg, pIsAgg);. 
68c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
68d0: 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70   nErr==0 && pExp
68e0: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
68f0: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
6900: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
6910: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
6920: 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73  t, allowAgg, pIs
6930: 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Agg);.      }.  
6940: 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20      if( nErr==0 
6950: 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20  && pExpr->pList 
6960: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
6970: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
6980: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
6990: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
69a0: 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20  or(i=0; nErr==0 
69b0: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
69c0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
69d0: 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  2 = pExpr->pList
69e0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
69f0: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
6a00: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
6a10: 50 61 72 73 65 2c 20 70 45 32 2c 20 61 6c 6c 6f  Parse, pE2, allo
6a20: 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20  wAgg, pIsAgg);. 
6a30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6a40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6a50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6a60: 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nErr;.}../*.** 
6a70: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
6a80: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 6f 72 20 53  LITE_SO_NUM or S
6a90: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 74 6f  QLITE_SO_TEXT to
6aa0: 20 69 6e 64 69 63 61 74 65 20 77 68 65 74 68 65   indicate whethe
6ab0: 72 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 65  r the.** given e
6ac0: 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64  xpression should
6ad0: 20 73 6f 72 74 20 61 73 20 6e 75 6d 65 72 69 63   sort as numeric
6ae0: 20 76 61 6c 75 65 73 20 6f 72 20 61 73 20 74 65   values or as te
6af0: 78 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  xt..**.** The sq
6b00: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
6b10: 64 73 28 29 20 61 6e 64 20 73 71 6c 69 74 65 45  ds() and sqliteE
6b20: 78 70 72 43 68 65 63 6b 28 29 20 72 6f 75 74 69  xprCheck() routi
6b30: 6e 65 73 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a  nes must have.**
6b40: 20 62 6f 74 68 20 62 65 65 6e 20 63 61 6c 6c 65   both been calle
6b50: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
6b60: 69 6f 6e 20 62 65 66 6f 72 65 20 69 74 20 69 73  ion before it is
6b70: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
6b80: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
6b90: 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 45  sqliteExprType(E
6ba0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
6bb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
6bc0: 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 77 68  ITE_SO_NUM;.  wh
6bd0: 69 6c 65 28 20 70 20 29 20 73 77 69 74 63 68 28  ile( p ) switch(
6be0: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
6bf0: 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
6c00: 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
6c10: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
6c20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
6c30: 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
6c40: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
6c50: 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
6c60: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
6c70: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a 20 20  e TK_NOTNULL:.  
6c80: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a 20    case TK_NOT:. 
6c90: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
6ca0: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  S:.    case TK_U
6cb0: 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
6cc0: 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
6cd0: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
6ce0: 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
6cf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
6d00: 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
6d10: 5f 52 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73  _RSHIFT:.    cas
6d20: 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
6d30: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
6d40: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
6d50: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  :.    case TK_IN
6d60: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  :.    case TK_BE
6d70: 54 57 45 45 4e 3a 0a 20 20 20 20 63 61 73 65 20  TWEEN:.    case 
6d80: 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61 73  TK_GLOB:.    cas
6d90: 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 20  e TK_LIKE:.     
6da0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53   return SQLITE_S
6db0: 4f 5f 4e 55 4d 3b 0a 0a 20 20 20 20 63 61 73 65  O_NUM;..    case
6dc0: 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20   TK_STRING:.    
6dd0: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20  case TK_NULL:.  
6de0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
6df0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  :.    case TK_VA
6e00: 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 72 65  RIABLE:.      re
6e10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54  turn SQLITE_SO_T
6e20: 45 58 54 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  EXT;..    case T
6e30: 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
6e40: 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
6e50: 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
6e60: 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
6e70: 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
6e80: 4b 5f 45 51 3a 0a 20 20 20 20 20 20 69 66 28 20  K_EQ:.      if( 
6e90: 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 70  sqliteExprType(p
6ea0: 2d 3e 70 4c 65 66 74 29 3d 3d 53 51 4c 49 54 45  ->pLeft)==SQLITE
6eb0: 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20  _SO_NUM ){.     
6ec0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6ed0: 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 7d  _SO_NUM;.      }
6ee0: 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  .      p = p->pR
6ef0: 69 67 68 74 3b 0a 20 20 20 20 20 20 62 72 65 61  ight;.      brea
6f00: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  k;..    case TK_
6f10: 41 53 3a 0a 20 20 20 20 20 20 70 20 3d 20 70 2d  AS:.      p = p-
6f20: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 62 72  >pLeft;.      br
6f30: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  eak;..    case T
6f40: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
6f50: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
6f60: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
6f70: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
6f80: 72 65 74 75 72 6e 20 70 2d 3e 64 61 74 61 54 79  return p->dataTy
6f90: 70 65 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  pe;..    case TK
6fa0: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 20 20 61  _SELECT:.      a
6fb0: 73 73 65 72 74 28 20 70 2d 3e 70 53 65 6c 65 63  ssert( p->pSelec
6fc0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
6fd0: 74 28 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  t( p->pSelect->p
6fe0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61  EList );.      a
6ff0: 73 73 65 72 74 28 20 70 2d 3e 70 53 65 6c 65 63  ssert( p->pSelec
7000: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
7010: 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 20 3d 20  >0 );.      p = 
7020: 70 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  p->pSelect->pELi
7030: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
7040: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
7050: 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20    case TK_CASE: 
7060: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
7070: 52 69 67 68 74 20 26 26 20 73 71 6c 69 74 65 45  Right && sqliteE
7080: 78 70 72 54 79 70 65 28 70 2d 3e 70 52 69 67 68  xprType(p->pRigh
7090: 74 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  t)==SQLITE_SO_NU
70a0: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  M ){.        ret
70b0: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  urn SQLITE_SO_NU
70c0: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
70d0: 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b   if( p->pList ){
70e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
70f0: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
7100: 20 2a 70 4c 69 73 74 20 3d 20 70 2d 3e 70 4c 69   *pList = p->pLi
7110: 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  st;.        for(
7120: 69 3d 31 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=1; i<pList->nE
7130: 78 70 72 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  xpr; i+=2){.    
7140: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7150: 45 78 70 72 54 79 70 65 28 70 4c 69 73 74 2d 3e  ExprType(pList->
7160: 61 5b 69 5d 2e 70 45 78 70 72 29 3d 3d 53 51 4c  a[i].pExpr)==SQL
7170: 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20  ITE_SO_NUM ){.  
7180: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7190: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a   SQLITE_SO_NUM;.
71a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
71b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
71c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
71d0: 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d  E_SO_TEXT;.    }
71e0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
71f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
7200: 6f 70 3d 3d 54 4b 5f 41 42 4f 52 54 20 29 3b 20  op==TK_ABORT ); 
7210: 20 2f 2a 20 43 61 6e 27 74 20 48 61 70 70 65 6e   /* Can't Happen
7220: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
7230: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
7240: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 7d 0a 0a  LITE_SO_NUM;.}..
7250: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
7260: 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
7270: 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
7280: 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
7290: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
72a0: 64 20 6c 65 61 76 65 20 74 68 65 20 72 65 73 75  d leave the resu
72b0: 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  lt on the top of
72c0: 20 73 74 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20   stack..*/.void 
72d0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 50  sqliteExprCode(P
72e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
72f0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64  pr *pExpr){.  Vd
7300: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
7310: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 3b  pVdbe;.  int op;
7320: 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70  .  if( v==0 || p
7330: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
7340: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
7350: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
7360: 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 20 6f  e TK_PLUS:     o
7370: 70 20 3d 20 4f 50 5f 41 64 64 3b 20 20 20 20 20  p = OP_Add;     
7380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7390: 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 20 6f 70   TK_MINUS:    op
73a0: 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74 3b 20   = OP_Subtract; 
73b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
73c0: 54 4b 5f 53 54 41 52 3a 20 20 20 20 20 6f 70 20  TK_STAR:     op 
73d0: 3d 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3b 20 62  = OP_Multiply; b
73e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
73f0: 4b 5f 53 4c 41 53 48 3a 20 20 20 20 6f 70 20 3d  K_SLASH:    op =
7400: 20 4f 50 5f 44 69 76 69 64 65 3b 20 20 20 62 72   OP_Divide;   br
7410: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7420: 5f 41 4e 44 3a 20 20 20 20 20 20 6f 70 20 3d 20  _AND:      op = 
7430: 4f 50 5f 41 6e 64 3b 20 20 20 20 20 20 62 72 65  OP_And;      bre
7440: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7450: 4f 52 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  OR:       op = O
7460: 50 5f 4f 72 3b 20 20 20 20 20 20 20 62 72 65 61  P_Or;       brea
7470: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
7480: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
7490: 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Lt;       break
74a0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
74b0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
74c0: 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Le;       break;
74d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
74e0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47         op = OP_G
74f0: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
7500: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
7510: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65        op = OP_Ge
7520: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
7530: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20     case TK_NE:  
7540: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b       op = OP_Ne;
7550: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7560: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20    case TK_EQ:   
7570: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20      op = OP_Eq; 
7580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7590: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
75a0: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c     op = OP_IsNul
75b0: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
75c0: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
75d0: 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c    op = OP_NotNul
75e0: 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  l;  break;.    c
75f0: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20  ase TK_NOT:     
7600: 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 3b 20 20 20   op = OP_Not;   
7610: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
7620: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 20  se TK_UMINUS:   
7630: 6f 70 20 3d 20 4f 50 5f 4e 65 67 61 74 69 76 65  op = OP_Negative
7640: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7650: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 20 6f  e TK_BITAND:   o
7660: 70 20 3d 20 4f 50 5f 42 69 74 41 6e 64 3b 20 20  p = OP_BitAnd;  
7670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7680: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 20 6f 70   TK_BITOR:    op
7690: 20 3d 20 4f 50 5f 42 69 74 4f 72 3b 20 20 20 20   = OP_BitOr;    
76a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
76b0: 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 20 6f 70 20  TK_BITNOT:   op 
76c0: 3d 20 4f 50 5f 42 69 74 4e 6f 74 3b 20 20 20 62  = OP_BitNot;   b
76d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
76e0: 4b 5f 4c 53 48 49 46 54 3a 20 20 20 6f 70 20 3d  K_LSHIFT:   op =
76f0: 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3b 20 20   OP_ShiftLeft;  
7700: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7710: 54 4b 5f 52 53 48 49 46 54 3a 20 20 20 6f 70 20  TK_RSHIFT:   op 
7720: 3d 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3b  = OP_ShiftRight;
7730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7740: 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 20 6f 70   TK_REM:      op
7750: 20 3d 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3b   = OP_Remainder;
7760: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
7770: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
7780: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
7790: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
77a0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
77b0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
77c0: 75 73 65 41 67 67 20 29 7b 0a 20 20 20 20 20 20  useAgg ){.      
77d0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
77e0: 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20  p(v, OP_AggGet, 
77f0: 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b  0, pExpr->iAgg);
7800: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7810: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
7820: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
7830: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7840: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70   OP_Column, pExp
7850: 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
7860: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
7870: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7880: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7890: 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 70 45  (v, OP_Recno, pE
78a0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
78b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
78c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
78d0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
78e0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61   {.      int iVa
78f0: 6c 20 3d 20 61 74 6f 69 28 70 45 78 70 72 2d 3e  l = atoi(pExpr->
7900: 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20  token.z);.      
7910: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
7920: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75       sprintf(zBu
7930: 66 2c 22 25 64 22 2c 69 56 61 6c 29 3b 0a 20 20  f,"%d",iVal);.  
7940: 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a      if( strlen(z
7950: 42 75 66 29 21 3d 70 45 78 70 72 2d 3e 74 6f 6b  Buf)!=pExpr->tok
7960: 65 6e 2e 6e 20 0a 20 20 20 20 20 20 20 20 20 20  en.n .          
7970: 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 70 45 78    || strncmp(pEx
7980: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 7a 42 75 66  pr->token.z,zBuf
7990: 2c 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29  ,pExpr->token.n)
79a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
79b0: 2a 20 49 66 20 74 68 65 20 69 6e 74 65 67 65 72  * If the integer
79c0: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
79d0: 20 72 65 70 72 65 73 65 6e 74 65 64 20 65 78 61   represented exa
79e0: 63 74 6c 79 20 69 6e 20 33 32 20 62 69 74 73 2c  ctly in 32 bits,
79f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
7a00: 20 63 6f 64 65 20 69 74 20 61 73 20 61 20 73 74   code it as a st
7a10: 72 69 6e 67 20 69 6e 73 74 65 61 64 2e 20 2a 2f  ring instead. */
7a20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
7a30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
7a40: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
7a50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7a60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7a70: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
7a80: 2c 20 69 56 61 6c 2c 20 30 29 3b 0a 20 20 20 20  , iVal, 0);.    
7a90: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7aa0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7ab0: 2d 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  -1, pExpr->token
7ac0: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
7ad0: 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .n);.      break
7ae0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7af0: 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
7b00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7b10: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
7b20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73   0, 0);.      as
7b30: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
7b40: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 73 71  en.z );.      sq
7b50: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
7b60: 28 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e 74  (v, -1, pExpr->t
7b70: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
7b80: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62  oken.n);.      b
7b90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7ba0: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
7bb0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
7bc0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
7bd0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
7be0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73   0, 0);.      as
7bf0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
7c00: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 73 71  en.z );.      sq
7c10: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
7c20: 28 76 2c 20 61 64 64 72 2c 20 70 45 78 70 72 2d  (v, addr, pExpr-
7c30: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
7c40: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
7c50: 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f   sqliteVdbeDequo
7c60: 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20  teP3(v, addr);. 
7c70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7c80: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
7c90: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
7ca0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7cb0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
7cc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7cd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
7ce0: 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
7cf0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7d00: 70 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65  p(v, OP_Variable
7d10: 2c 20 61 74 6f 69 28 26 70 45 78 70 72 2d 3e 74  , atoi(&pExpr->t
7d20: 6f 6b 65 6e 2e 7a 5b 31 5d 29 2c 20 30 29 3b 0a  oken.z[1]), 0);.
7d30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7d40: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
7d50: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
7d60: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
7d70: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
7d80: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
7d90: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
7da0: 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  Q: {.      if( p
7db0: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f  Parse->db->file_
7dc0: 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 73 71 6c  format>=4 && sql
7dd0: 69 74 65 45 78 70 72 54 79 70 65 28 70 45 78 70  iteExprType(pExp
7de0: 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45  r)==SQLITE_SO_TE
7df0: 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  XT ){.        op
7e00: 20 2b 3d 20 36 3b 20 20 2f 2a 20 43 6f 6e 76 65   += 6;  /* Conve
7e10: 72 74 20 6e 75 6d 65 72 69 63 20 6f 70 63 6f 64  rt numeric opcod
7e20: 65 73 20 74 6f 20 74 65 78 74 20 6f 70 63 6f 64  es to text opcod
7e30: 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  es */.      }.  
7e40: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
7e50: 75 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78  ugh into the nex
7e60: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  t case */.    }.
7e70: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
7e80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
7e90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
7ea0: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
7eb0: 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
7ec0: 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
7ed0: 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
7ee0: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
7ef0: 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
7f00: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
7f10: 48 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  H: {.      sqlit
7f20: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
7f30: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
7f40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
7f50: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
7f60: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
7f70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7f80: 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29  dOp(v, op, 0, 0)
7f90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7fa0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7fb0: 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73  _LSHIFT:.    cas
7fc0: 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 7b 0a 20  e TK_RSHIFT: {. 
7fd0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
7fe0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
7ff0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
8000: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
8010: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8020: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
8030: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8040: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
8050: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8060: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
8070: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
8080: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
8090: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
80a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
80b0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
80c0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
80d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
80e0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  dOp(v, OP_Concat
80f0: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 2, 0);.      b
8100: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8110: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
8120: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
8130: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
8140: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  t;.      if( pLe
8150: 66 74 20 26 26 20 70 4c 65 66 74 2d 3e 6f 70 3d  ft && pLeft->op=
8160: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
8170: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
8180: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
8190: 65 67 65 72 2c 20 61 74 6f 69 28 70 4c 65 66 74  eger, atoi(pLeft
81a0: 2d 3e 74 6f 6b 65 6e 2e 7a 29 2c 20 30 29 3b 0a  ->token.z), 0);.
81b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
81c0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
81d0: 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a  , pLeft->token.z
81e0: 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e  , pLeft->token.n
81f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
8200: 66 28 20 70 4c 65 66 74 20 26 26 20 70 4c 65 66  f( pLeft && pLef
8210: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
8220: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8230: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8240: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
8250: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8260: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
8270: 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a  , pLeft->token.z
8280: 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e  , pLeft->token.n
8290: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
82a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
82b0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
82c0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
82d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
82e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
82f0: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
8300: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
8310: 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20  pr->pLeft );.   
8320: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
8330: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
8340: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66  T || pExpr->pLef
8350: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
8360: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b  R ){.        Tok
8370: 65 6e 20 2a 70 20 3d 20 26 70 45 78 70 72 2d 3e  en *p = &pExpr->
8380: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
8390: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
83a0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d  sqliteMalloc( p-
83b0: 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20  >n + 2 );.      
83c0: 20 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25    sprintf(z, "-%
83d0: 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a  .*s", p->n, p->z
83e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
83f0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  Expr->pLeft->op=
8400: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
8410: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
8420: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
8430: 6e 74 65 67 65 72 2c 20 61 74 6f 69 28 7a 29 2c  nteger, atoi(z),
8440: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   0);.        }el
8450: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
8460: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8470: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
8480: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8490: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
84a0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
84b0: 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20  , p->n+1);.     
84c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
84d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
84e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
84f0: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
8500: 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20  nto TK_NOT */.  
8510: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8520: 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
8530: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
8540: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
8550: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
8560: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
8570: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8580: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
8590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
85a0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
85b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
85c0: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
85d0: 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 73  nt dest;.      s
85e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
85f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
8600: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8610: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
8620: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
8630: 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71  .      dest = sq
8640: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
8650: 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20  ddr(v) + 2;.    
8660: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8670: 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74  p(v, op, 1, dest
8680: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8690: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
86a0: 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20  ddImm, -1, 0);. 
86b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
86c0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
86d0: 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
86e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
86f0: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74  dOp(v, OP_AggGet
8700: 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67  , 0, pExpr->iAgg
8710: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8720: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8730: 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65  K_GLOB:.    case
8740: 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63 61   TK_LIKE:.    ca
8750: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
8760: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
8770: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
8780: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
8790: 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ist;.      int n
87a0: 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70  Expr = pList ? p
87b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
87c0: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
87d0: 70 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  pDef;.      int 
87e0: 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  nId;.      const
87f0: 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20   char *zId;.    
8800: 20 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d    getFunctionNam
8810: 65 28 70 45 78 70 72 2c 20 26 7a 49 64 2c 20 26  e(pExpr, &zId, &
8820: 6e 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66  nId);.      pDef
8830: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 46 75 6e   = sqliteFindFun
8840: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
8850: 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70  , zId, nId, nExp
8860: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  r, 0);.      ass
8870: 65 72 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a  ert( pDef!=0 );.
8880: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8890: 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
88a0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
88b0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
88c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
88d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
88e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
88f0: 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 6e  , OP_Function, n
8900: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
8910: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
8920: 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P3(v, -1, (char*
8930: 29 70 44 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45  )pDef, P3_POINTE
8940: 52 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  R);.      break;
8950: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
8960: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
8970: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8980: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
8990: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
89a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
89b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
89c0: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
89d0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
89e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
89f0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
8a00: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
8a10: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
8a20: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
8a30: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
8a40: 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e  sqliteVdbeCurren
8a50: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
8a60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8a70: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
8a80: 31 2c 20 61 64 64 72 2b 34 29 3b 0a 20 20 20 20  1, addr+4);.    
8a90: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8aa0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
8ab0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8ac0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8ad0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
8ae0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8af0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
8b00: 20 30 2c 20 61 64 64 72 2b 36 29 3b 0a 20 20 20   0, addr+6);.   
8b10: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
8b20: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
8b30: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8b40: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
8b50: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64  xpr->iTable, add
8b60: 72 2b 36 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  r+6);.      }els
8b70: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8b80: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8b90: 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45 78 70 72  _SetFound, pExpr
8ba0: 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 36  ->iTable, addr+6
8bb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8bc0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8bd0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d  (v, OP_AddImm, -
8be0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
8bf0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8c00: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
8c10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
8c20: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
8c30: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8c40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8c50: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
8c60: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8c70: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
8c80: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
8c90: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
8ca0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8cb0: 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20  Op(v, OP_Ge, 0, 
8cc0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8cd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8ce0: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
8cf0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
8d00: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
8d10: 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
8d20: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
8d30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8d40: 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  _Le, 0, 0);.    
8d50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8d60: 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20  p(v, OP_And, 0, 
8d70: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
8d80: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
8d90: 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73  TK_AS: {.      s
8da0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
8db0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
8dc0: 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ft);.      break
8dd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8de0: 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20   TK_CASE: {.    
8df0: 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c    int expr_end_l
8e00: 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  abel;.      int 
8e10: 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20  jumpInst;.      
8e20: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
8e30: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20  int nExpr;.     
8e40: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 61   int i;..      a
8e50: 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
8e60: 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st);.      asser
8e70: 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  t((pExpr->pList-
8e80: 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30  >nExpr % 2) == 0
8e90: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8ea0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
8eb0: 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
8ec0: 6e 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70  nExpr = pExpr->p
8ed0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
8ee0: 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65     expr_end_labe
8ef0: 6c 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  l = sqliteVdbeMa
8f00: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
8f10: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
8f20: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
8f30: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
8f40: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
8f50: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
8f60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
8f70: 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  pr; i=i+2){.    
8f80: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
8f90: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
8fa0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
8fb0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
8fc0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
8fd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
8fe0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8ff0: 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20  P_Dup, 1, 1);.  
9000: 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
9010: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
9020: 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 31 2c 20  Op(v, OP_Ne, 1, 
9030: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
9040: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9050: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
9060: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9070: 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73           jumpIns
9080: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  t = sqliteVdbeAd
9090: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  dOp(v, OP_IfNot,
90a0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
90b0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
90c0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
90d0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
90e0: 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  [i+1].pExpr);.  
90f0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9100: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
9110: 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61  , 0, expr_end_la
9120: 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 64  bel);.        ad
9130: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  dr = sqliteVdbeC
9140: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
9150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
9160: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75 6d  eChangeP2(v, jum
9170: 70 49 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20 20  pInst, addr);.  
9180: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9190: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
91a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
91b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
91c0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
91d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
91e0: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
91f0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
9200: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9210: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
9220: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9230: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9240: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
9250: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
9260: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
9270: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78  solveLabel(v, ex
9280: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20  pr_end_label);. 
9290: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
92a0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  }.    case TK_RA
92b0: 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ISE: {.      if(
92c0: 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   !pParse->trigSt
92d0: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ack ){.        s
92e0: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
92f0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
9310: 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
9320: 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
9330: 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
9340: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
9350: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 09 72 65 74 75  e->nErr++;..retu
9360: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
9370: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
9380: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 52 6f 6c 6c 62  lumn == OE_Rollb
9390: 61 63 6b 20 7c 7c 0a 09 20 20 70 45 78 70 72 2d  ack ||..  pExpr-
93a0: 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41  >iColumn == OE_A
93b0: 62 6f 72 74 20 7c 7c 0a 09 20 20 70 45 78 70 72  bort ||..  pExpr
93c0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
93d0: 46 61 69 6c 20 29 7b 0a 09 20 20 63 68 61 72 20  Fail ){..  char 
93e0: 2a 20 6d 73 67 20 3d 20 73 71 6c 69 74 65 53 74  * msg = sqliteSt
93f0: 72 4e 44 75 70 28 70 45 78 70 72 2d 3e 74 6f 6b  rNDup(pExpr->tok
9400: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
9410: 65 6e 2e 6e 29 3b 0a 09 20 20 73 71 6c 69 74 65  en.n);..  sqlite
9420: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9430: 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  Halt, SQLITE_CON
9440: 53 54 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e  STRAINT, pExpr->
9450: 69 43 6f 6c 75 6d 6e 29 3b 0a 09 20 20 73 71 6c  iColumn);..  sql
9460: 69 74 65 44 65 71 75 6f 74 65 28 6d 73 67 29 3b  iteDequote(msg);
9470: 0a 09 20 20 73 71 6c 69 74 65 56 64 62 65 43 68  ..  sqliteVdbeCh
9480: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 6d 73  angeP3(v, -1, ms
9490: 67 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65  g, 0);..  sqlite
94a0: 46 72 65 65 28 6d 73 67 29 3b 0a 20 20 20 20 20  Free(msg);.     
94b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 61 73 73   } else {..  ass
94c0: 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
94d0: 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65  umn == OE_Ignore
94e0: 20 29 3b 0a 09 20 20 73 71 6c 69 74 65 56 64 62   );..  sqliteVdb
94f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
9500: 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72  o, 0, pParse->tr
9510: 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a  igStack->ignoreJ
9520: 75 6d 70 29 3b 0a 09 20 20 73 71 6c 69 74 65 56  ump);..  sqliteV
9530: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
9540: 31 2c 20 22 28 49 47 4e 4f 52 45 20 6a 75 6d 70  1, "(IGNORE jump
9550: 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  )", 0);.      }.
9560: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
9570: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
9580: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
9590: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
95a0: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
95b0: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
95c0: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
95d0: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
95e0: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
95f0: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
9600: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
9610: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
9620: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
9630: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
9640: 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
9650: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
9660: 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
9670: 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
9680: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
9690: 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
96a0: 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  flag is true..*/
96b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
96c0: 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
96d0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
96e0: 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
96f0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
9700: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
9710: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
9720: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d  p = 0;.  if( v==
9730: 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
9740: 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68  return;.  switch
9750: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
9760: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
9770: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b       op = OP_Lt;
9780: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9790: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
97a0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20      op = OP_Le; 
97b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
97c0: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
97d0: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20     op = OP_Gt;  
97e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
97f0: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
9800: 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20    op = OP_Ge;   
9810: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9820: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
9830: 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20   op = OP_Ne;    
9840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9850: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20  se TK_EQ:       
9860: 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20  op = OP_Eq;     
9870: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9880: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f  e TK_ISNULL:   o
9890: 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20  p = OP_IsNull;  
98a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
98b0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70   TK_NOTNULL:  op
98c0: 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20   = OP_NotNull;  
98d0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
98e0: 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  lt:  break;.  }.
98f0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9900: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
9910: 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
9920: 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 56  int d2 = sqliteV
9930: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
9940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
9950: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
9960: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
9970: 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  2, !jumpIfNull);
9980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
9990: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
99a0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
99b0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
99c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
99d0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
99e0: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
99f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9a00: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
9a10: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72    sqliteExprIfTr
9a20: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
9a30: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
9a40: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
9a50: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72    sqliteExprIfTr
9a60: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
9a70: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
9a80: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
9a90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9aa0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
9ab0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
9ac0: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
9ad0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
9ae0: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
9af0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
9b00: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9b10: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
9b20: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
9b30: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
9b40: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
9b50: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
9b60: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73  TK_EQ: {.      s
9b70: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
9b80: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
9b90: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
9ba0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
9bb0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
9bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
9bd0: 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  se->db->file_for
9be0: 6d 61 74 3e 3d 34 20 26 26 20 73 71 6c 69 74 65  mat>=4 && sqlite
9bf0: 45 78 70 72 54 79 70 65 28 70 45 78 70 72 29 3d  ExprType(pExpr)=
9c00: 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20  =SQLITE_SO_TEXT 
9c10: 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 2b 3d  ){.        op +=
9c20: 20 36 3b 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20   6;  /* Convert 
9c30: 6e 75 6d 65 72 69 63 20 6f 70 63 6f 64 65 73 20  numeric opcodes 
9c40: 74 6f 20 74 65 78 74 20 6f 70 63 6f 64 65 73 20  to text opcodes 
9c50: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
9c60: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9c70: 28 76 2c 20 6f 70 2c 20 6a 75 6d 70 49 66 4e 75  (v, op, jumpIfNu
9c80: 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ll, dest);.     
9c90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9ca0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
9cb0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
9cc0: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
9cd0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
9ce0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
9cf0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
9d00: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
9d10: 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
9d20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9d30: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
9d40: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
9d50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
9d60: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
9d70: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
9d80: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
9d90: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
9da0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
9db0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9dc0: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
9dd0: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
9de0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9df0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
9e00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9e10: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
9e20: 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20  0, jumpIfNull ? 
9e30: 64 65 73 74 20 3a 20 61 64 64 72 2b 34 29 3b 0a  dest : addr+4);.
9e40: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
9e50: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
9e60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9e70: 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  dOp(v, OP_Found,
9e80: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
9e90: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
9ea0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
9eb0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9ec0: 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_SetFound, pExp
9ed0: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29  r->iTable, dest)
9ee0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9ef0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9f00: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
9f10: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
9f20: 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dr;.      sqlite
9f30: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
9f40: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
9f50: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9f60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
9f70: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
9f80: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
9f90: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
9fa0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
9fb0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
9fc0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9fd0: 4f 50 5f 4c 74 2c 20 21 6a 75 6d 70 49 66 4e 75  OP_Lt, !jumpIfNu
9fe0: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ll, 0);.      sq
9ff0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
a000: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
a010: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  t->a[1].pExpr);.
a020: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a030: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 65 2c 20  AddOp(v, OP_Le, 
a040: 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74  jumpIfNull, dest
a050: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
a060: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
a070: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
a080: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
a090: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
a0a0: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
a0b0: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
a0c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
a0d0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
a0e0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
a0f0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
a100: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  lt: {.      sqli
a110: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
a120: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
a130: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a140: 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49  (v, OP_If, jumpI
a150: 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20  fNull, dest);.  
a160: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a170: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
a180: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
a190: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
a1a0: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
a1b0: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
a1c0: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
a1d0: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
a1e0: 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
a1f0: 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
a200: 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
a210: 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
a220: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
a230: 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
a240: 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
a250: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
a260: 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
a270: 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
a280: 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
a290: 6c 20 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c  l is true or fal
a2a0: 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
a2b0: 70 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65  pIfNull is false
a2c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a2d0: 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
a2e0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
a2f0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
a300: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
a310: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
a320: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
a330: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66  int op = 0;.  if
a340: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
a350: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
a360: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
a370: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
a380: 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LT:       op = O
a390: 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ge;       brea
a3a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
a3b0: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
a3c0: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
a3d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
a3e0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
a3f0: 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Le;       break;
a400: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
a410: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c         op = OP_L
a420: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
a430: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
a440: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
a450: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
a460: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
a470: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b       op = OP_Ne;
a480: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a490: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
a4a0: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  :   op = OP_NotN
a4b0: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
a4c0: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
a4d0: 3a 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c  :  op = OP_IsNul
a4e0: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
a4f0: 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b  default:  break;
a500: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
a510: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
a520: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
a530: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
a540: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
a550: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
a560: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
a570: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
a580: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
a590: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
a5a0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
a5b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a5c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a5d0: 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
a5e0: 20 64 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65   d2 = sqliteVdbe
a5f0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
a600: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
a610: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
a620: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21  pr->pLeft, d2, !
a630: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
a640: 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 46     sqliteExprIfF
a650: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
a660: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
a670: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
a680: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
a690: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
a6a0: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
a6b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a6c0: 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
a6d0: 73 71 6c 69 74 65 45 78 70 72 49 66 54 72 75 65  sqliteExprIfTrue
a6e0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
a6f0: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
a700: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
a710: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a720: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
a730: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
a740: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
a750: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
a760: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
a770: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
a780: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
a790: 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  >db->file_format
a7a0: 3e 3d 34 20 26 26 20 73 71 6c 69 74 65 45 78 70  >=4 && sqliteExp
a7b0: 72 54 79 70 65 28 70 45 78 70 72 29 3d 3d 53 51  rType(pExpr)==SQ
a7c0: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a  LITE_SO_TEXT ){.
a7d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
a7e0: 72 74 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61  rt numeric compa
a7f0: 72 69 73 6f 6e 20 6f 70 63 6f 64 65 73 20 69 6e  rison opcodes in
a800: 74 6f 20 74 65 78 74 20 63 6f 6d 70 61 72 69 73  to text comparis
a810: 6f 6e 20 6f 70 63 6f 64 65 73 2e 0a 20 20 20 20  on opcodes..    
a820: 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 65 70      ** This step
a830: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
a840: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 74 65  fact that the te
a850: 78 74 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6f  xt comparision o
a860: 70 63 6f 64 65 73 20 61 72 65 0a 20 20 20 20 20  pcodes are.     
a870: 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 36 20 67     ** always 6 g
a880: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69  reater than thei
a890: 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
a8a0: 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61 72 69 73  numeric comparis
a8b0: 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 70  on.        ** op
a8c0: 63 6f 64 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  codes..        *
a8d0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
a8e0: 28 20 4f 50 5f 45 71 2b 36 20 3d 3d 20 4f 50 5f  ( OP_Eq+6 == OP_
a8f0: 53 74 72 45 71 20 29 3b 0a 20 20 20 20 20 20 20  StrEq );.       
a900: 20 6f 70 20 2b 3d 20 36 3b 0a 20 20 20 20 20 20   op += 6;.      
a910: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  }.      sqliteEx
a920: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
a930: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
a940: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
a950: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
a960: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
a970: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a980: 28 76 2c 20 6f 70 2c 20 6a 75 6d 70 49 66 4e 75  (v, op, jumpIfNu
a990: 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ll, dest);.     
a9a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a9b0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
a9c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
a9d0: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
a9e0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
a9f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
aa00: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
aa10: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
aa20: 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
aa30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
aa40: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
aa50: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
aa60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
aa70: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
aa80: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
aa90: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
aaa0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
aab0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
aac0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
aad0: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
aae0: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
aaf0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ab00: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
ab10: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ab20: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
ab30: 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20  0, jumpIfNull ? 
ab40: 64 65 73 74 20 3a 20 61 64 64 72 2b 34 29 3b 0a  dest : addr+4);.
ab50: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
ab60: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
ab70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ab80: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
ab90: 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
aba0: 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  e, dest);.      
abb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
abc0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
abd0: 2c 20 4f 50 5f 53 65 74 4e 6f 74 46 6f 75 6e 64  , OP_SetNotFound
abe0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
abf0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a   dest);.      }.
ac00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ac10: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
ac20: 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
ac30: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
ac40: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
ac50: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
ac60: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
ac70: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ac80: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
ac90: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
aca0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
acb0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
acc0: 78 70 72 29 3b 0a 20 20 20 20 20 20 61 64 64 72  xpr);.      addr
acd0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72   = sqliteVdbeCur
ace0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
acf0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ad00: 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 21 6a 75  Op(v, OP_Ge, !ju
ad10: 6d 70 49 66 4e 75 6c 6c 2c 20 61 64 64 72 2b 33  mpIfNull, addr+3
ad20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
ad30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
ad40: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
ad50: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ad60: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
ad70: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
ad80: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
ad90: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
ada0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
adb0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
adc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 74 2c 20 6a  ddOp(v, OP_Gt, j
add0: 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29  umpIfNull, dest)
ade0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
adf0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
ae00: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
ae10: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ae20: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
ae30: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ae40: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70  , OP_IfNot, jump
ae50: 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20  IfNull, dest);. 
ae60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ae70: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
ae80: 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
ae90: 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
aea0: 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
aeb0: 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a  turn TRUE (non-z
aec0: 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20  ero).** if they 
aed0: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
aee0: 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69  d return FALSE i
aef0: 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
af00: 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74   any way..*/.int
af10: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61   sqliteExprCompa
af20: 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
af30: 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b  r *pB){.  int i;
af40: 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a  .  if( pA==0 ){.
af50: 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 30      return pB==0
af60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
af70: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
af80: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
af90: 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20  A->op!=pB->op ) 
afa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
afb0: 21 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61  !sqliteExprCompa
afc0: 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
afd0: 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
afe0: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
aff0: 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  teExprCompare(pA
b000: 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
b010: 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30  ight) ) return 0
b020: 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73  ;.  if( pA->pLis
b030: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  t ){.    if( pB-
b040: 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  >pList==0 ) retu
b050: 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41  rn 0;.    if( pA
b060: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
b070: 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pB->pList->nExpr
b080: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
b090: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
b0a0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
b0b0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73  +){.      if( !s
b0c0: 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65  qliteExprCompare
b0d0: 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  (pA->pList->a[i]
b0e0: 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73  .pExpr, pB->pLis
b0f0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
b100: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
b110: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
b120: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  }.  }else if( pB
b130: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72  ->pList ){.    r
b140: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
b150: 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c  f( pA->pSelect |
b160: 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20  | pB->pSelect ) 
b170: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
b180: 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e  pA->iTable!=pB->
b190: 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43  iTable || pA->iC
b1a0: 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75  olumn!=pB->iColu
b1b0: 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  mn ) return 0;. 
b1c0: 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a   if( pA->token.z
b1d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e   ){.    if( pB->
b1e0: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74  token.z==0 ) ret
b1f0: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
b200: 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e  B->token.n!=pA->
b210: 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e  token.n ) return
b220: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
b230: 74 65 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74  teStrNICmp(pA->t
b240: 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65  oken.z, pB->toke
b250: 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e  n.z, pB->token.n
b260: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )!=0 ) return 0;
b270: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
b280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
b290: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
b2a0: 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
b2b0: 5d 20 61 72 72 61 79 20 61 6e 64 20 72 65 74 75  ] array and retu
b2c0: 72 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2f  rn its index..*/
b2d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 65  .static int appe
b2e0: 6e 64 41 67 67 49 6e 66 6f 28 50 61 72 73 65 20  ndAggInfo(Parse 
b2f0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
b300: 28 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 26 20  (pParse->nAgg & 
b310: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  0x7)==0 ){.    i
b320: 6e 74 20 61 6d 74 20 3d 20 70 50 61 72 73 65 2d  nt amt = pParse-
b330: 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20 20 41  >nAgg + 8;.    A
b340: 67 67 45 78 70 72 20 2a 61 41 67 67 20 3d 20 73  ggExpr *aAgg = s
b350: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61  qliteRealloc(pPa
b360: 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73  rse->aAgg, amt*s
b370: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41  izeof(pParse->aA
b380: 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  gg[0]));.    if(
b390: 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20   aAgg==0 ){.    
b3a0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
b3b0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61   }.    pParse->a
b3c0: 41 67 67 20 3d 20 61 41 67 67 3b 0a 20 20 7d 0a  Agg = aAgg;.  }.
b3d0: 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65    memset(&pParse
b3e0: 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d 3e 6e  ->aAgg[pParse->n
b3f0: 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Agg], 0, sizeof(
b400: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29  pParse->aAgg[0])
b410: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  );.  return pPar
b420: 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f  se->nAgg++;.}../
b430: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
b440: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
b450: 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
b460: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
b470: 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
b480: 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
b490: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
b4a0: 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
b4b0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b  [] array..** Mak
b4c0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  e additional ent
b4d0: 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72  ries to the pPar
b4e0: 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
b4f0: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
b500: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b510: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
b520: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
b530: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
b540: 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
b550: 64 20 62 79 20 73 71 6c 69 74 65 45 78 70 72 52  d by sqliteExprR
b560: 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20  esolveIds() and 
b570: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
b580: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f  )..**.** If erro
b590: 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61  rs are seen, lea
b5a0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
b5b0: 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61  age in zErrMsg a
b5c0: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  nd return.** the
b5d0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
b5e0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
b5f0: 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
b600: 67 61 74 65 73 28 50 61 72 73 65 20 2a 70 50 61  gates(Parse *pPa
b610: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
b620: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41 67  ){.  int i;.  Ag
b630: 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20 20 69  gExpr *aAgg;.  i
b640: 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20  nt nErr = 0;..  
b650: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
b660: 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63  eturn 0;.  switc
b670: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
b680: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
b690: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67 67  MN: {.      aAgg
b6a0: 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b   = pParse->aAgg;
b6b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b6c0: 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
b6d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
b6e0: 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ( aAgg[i].isAgg 
b6f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
b700: 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e      if( aAgg[i].
b710: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
b720: 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20  Expr->iTable.   
b730: 20 20 20 20 20 20 26 26 20 61 41 67 67 5b 69 5d        && aAgg[i]
b740: 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  .pExpr->iColumn=
b750: 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
b760: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
b770: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
b780: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b790: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  i>=pParse->nAgg 
b7a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 61  ){.        i = a
b7b0: 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61  ppendAggInfo(pPa
b7c0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
b7d0: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31  ( i<0 ) return 1
b7e0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
b7f0: 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ->aAgg[i].isAgg 
b800: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
b810: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
b820: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
b830: 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d    }.      pExpr-
b840: 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
b850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b860: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
b870: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
b880: 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  aAgg = pParse->a
b890: 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Agg;.      for(i
b8a0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
b8b0: 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
b8c0: 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d 2e 69    if( !aAgg[i].i
b8d0: 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
b8e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
b8f0: 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 61  iteExprCompare(a
b900: 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  Agg[i].pExpr, pE
b910: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
b920: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b930: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
b940: 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e   if( i>=pParse->
b950: 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  nAgg ){.        
b960: 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66  i = appendAggInf
b970: 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  o(pParse);.     
b980: 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74     if( i<0 ) ret
b990: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70  urn 1;.        p
b9a0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
b9b0: 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
b9c0: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
b9d0: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
b9e0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
b9f0: 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20 3d  >aAgg[i].pFunc =
ba00: 20 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74   sqliteFindFunct
ba10: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
ba30: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
ba40: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20  pr->token.n,.   
ba50: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
ba60: 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  >pList ? pExpr->
ba70: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
ba80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
ba90: 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
baa0: 3d 20 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = i;.      break
bab0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
bac0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ult: {.      if(
bad0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
bae0: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
baf0: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
bb00: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
bb10: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
bb20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bb30: 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20   if( nErr==0 && 
bb40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
bb50: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
bb60: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
bb70: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
bb80: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
bb90: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
bba0: 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26    if( nErr==0 &&
bbb0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
bbc0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
bbd0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
bbe0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Expr;.        in
bbf0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
bc00: 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26  (i=0; nErr==0 &&
bc10: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
bc20: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
bc30: 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  iteExprAnalyzeAg
bc40: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
bc50: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
bc60: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
bc70: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bc80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bc90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
bca0: 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rr;.}../*.** Loc
bcb0: 61 74 65 20 61 20 75 73 65 72 20 66 75 6e 63 74  ate a user funct
bcc0: 69 6f 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d 65  ion given a name
bcd0: 20 61 6e 64 20 61 20 6e 75 6d 62 65 72 20 6f 66   and a number of
bce0: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 52   arguments..** R
bcf0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
bd00: 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 73  to the FuncDef s
bd10: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
bd20: 66 69 6e 65 73 20 74 68 61 74 0a 2a 2a 20 66 75  fines that.** fu
bd30: 6e 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75 72  nction, or retur
bd40: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 75  n NULL if the fu
bd50: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
bd60: 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  exist..**.** If 
bd70: 74 68 65 20 63 72 65 61 74 65 46 6c 61 67 20 61  the createFlag a
bd80: 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
bd90: 20 74 68 65 6e 20 61 20 6e 65 77 20 28 62 6c 61   then a new (bla
bda0: 6e 6b 29 20 46 75 6e 63 44 65 66 0a 2a 2a 20 73  nk) FuncDef.** s
bdb0: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
bdc0: 74 65 64 20 61 6e 64 20 6c 69 6b 65 64 20 69 6e  ted and liked in
bdd0: 74 6f 20 74 68 65 20 22 64 62 22 20 73 74 72 75  to the "db" stru
bde0: 63 74 75 72 65 20 69 66 20 61 0a 2a 2a 20 6e 6f  cture if a.** no
bdf0: 20 6d 61 74 63 68 69 6e 67 20 66 75 6e 63 74 69   matching functi
be00: 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78  on previously ex
be10: 69 73 74 65 64 2e 20 20 57 68 65 6e 20 63 72 65  isted.  When cre
be20: 61 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 0a  ateFlag is true.
be30: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 41 72 67 20  ** and the nArg 
be40: 70 61 72 61 6d 65 74 65 72 20 69 73 20 2d 31 2c  parameter is -1,
be50: 20 74 68 65 6e 20 6f 6e 6c 79 20 61 20 66 75 6e   then only a fun
be60: 63 74 69 6f 6e 20 74 68 61 74 20 61 63 63 65 70  ction that accep
be70: 74 73 0a 2a 2a 20 61 6e 79 20 6e 75 6d 62 65 72  ts.** any number
be80: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77 69   of arguments wi
be90: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a  ll be returned..
bea0: 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74 65 46  **.** If createF
beb0: 6c 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64  lag is false and
bec0: 20 6e 41 72 67 20 69 73 20 2d 31 2c 20 74 68 65   nArg is -1, the
bed0: 6e 20 74 68 65 20 66 69 72 73 74 20 76 61 6c 69  n the first vali
bee0: 64 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 6f  d.** function fo
bef0: 75 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e  und is returned.
bf00: 20 20 41 20 66 75 6e 63 74 69 6f 6e 20 69 73 20    A function is 
bf10: 76 61 6c 69 64 20 69 66 20 65 69 74 68 65 72 20  valid if either 
bf20: 78 46 75 6e 63 0a 2a 2a 20 6f 72 20 78 53 74 65  xFunc.** or xSte
bf30: 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  p is non-zero..*
bf40: 2f 0a 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74  /.FuncDef *sqlit
bf50: 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a 20  eFindFunction(. 
bf60: 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20   sqlite *db,    
bf70: 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64      /* An open d
bf80: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
bf90: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
bfa0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
bfb0: 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e 75  unction.  Not nu
bfc0: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a 2f  ll-terminated */
bfd0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20 20  .  int nName,   
bfe0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bff0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
c000: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69   the name */.  i
c010: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
c020: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
c030: 72 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d 65  rguments.  -1 me
c040: 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72 20 2a  ans any number *
c050: 2f 0a 20 20 69 6e 74 20 63 72 65 61 74 65 46 6c  /.  int createFl
c060: 61 67 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ag     /* Create
c070: 20 6e 65 77 20 65 6e 74 72 79 20 69 66 20 74 72   new entry if tr
c080: 75 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ue and does not 
c090: 6f 74 68 65 72 77 69 73 65 20 65 78 69 73 74 20  otherwise exist 
c0a0: 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  */.){.  FuncDef 
c0b0: 2a 70 46 69 72 73 74 2c 20 2a 70 2c 20 2a 70 4d  *pFirst, *p, *pM
c0c0: 61 79 62 65 3b 0a 20 20 70 46 69 72 73 74 20 3d  aybe;.  pFirst =
c0d0: 20 70 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73   p = (FuncDef*)s
c0e0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
c0f0: 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c  b->aFunc, zName,
c100: 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70   nName);.  if( p
c110: 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67 20   && !createFlag 
c120: 26 26 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20  && nArg<0 ){.   
c130: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
c140: 78 46 75 6e 63 3d 3d 30 20 26 26 20 70 2d 3e 78  xFunc==0 && p->x
c150: 53 74 65 70 3d 3d 30 20 29 7b 20 70 20 3d 20 70  Step==0 ){ p = p
c160: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 72  ->pNext; }.    r
c170: 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70  eturn p;.  }.  p
c180: 4d 61 79 62 65 20 3d 20 30 3b 0a 20 20 77 68 69  Maybe = 0;.  whi
c190: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 41 72 67  le( p && p->nArg
c1a0: 21 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66  !=nArg ){.    if
c1b0: 28 20 70 2d 3e 6e 41 72 67 3c 30 20 26 26 20 21  ( p->nArg<0 && !
c1c0: 63 72 65 61 74 65 46 6c 61 67 20 26 26 20 28 70  createFlag && (p
c1d0: 2d 3e 78 46 75 6e 63 20 7c 7c 20 70 2d 3e 78 53  ->xFunc || p->xS
c1e0: 74 65 70 29 20 29 20 70 4d 61 79 62 65 20 3d 20  tep) ) pMaybe = 
c1f0: 70 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  p;.    p = p->pN
c200: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
c210: 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67 20   && !createFlag 
c220: 26 26 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 26  && p->xFunc==0 &
c230: 26 20 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29 7b  & p->xStep==0 ){
c240: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c250: 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20 26 26   }.  if( p==0 &&
c260: 20 70 4d 61 79 62 65 20 29 7b 0a 20 20 20 20 61   pMaybe ){.    a
c270: 73 73 65 72 74 28 20 63 72 65 61 74 65 46 6c 61  ssert( createFla
c280: 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  g==0 );.    retu
c290: 72 6e 20 70 4d 61 79 62 65 3b 0a 20 20 7d 0a 20  rn pMaybe;.  }. 
c2a0: 20 69 66 28 20 70 3d 3d 30 20 26 26 20 63 72 65   if( p==0 && cre
c2b0: 61 74 65 46 6c 61 67 20 26 26 20 28 70 20 3d 20  ateFlag && (p = 
c2c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
c2d0: 65 6f 66 28 2a 70 29 29 29 21 3d 30 20 29 7b 0a  eof(*p)))!=0 ){.
c2e0: 20 20 20 20 70 2d 3e 6e 41 72 67 20 3d 20 6e 41      p->nArg = nA
c2f0: 72 67 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  rg;.    p->pNext
c300: 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 70   = pFirst;.    p
c310: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 70 46 69  ->dataType = pFi
c320: 72 73 74 20 3f 20 70 46 69 72 73 74 2d 3e 64 61  rst ? pFirst->da
c330: 74 61 54 79 70 65 20 3a 20 53 51 4c 49 54 45 5f  taType : SQLITE_
c340: 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 73 71 6c  NUMERIC;.    sql
c350: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
c360: 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c  b->aFunc, zName,
c370: 20 6e 4e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 70   nName, (void*)p
c380: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c390: 70 3b 0a 7d 0a                                   p;.}.