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

Artifact 8acdc2f7b2e756fc62336c728ab6a579979a5719:


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 31 30 30 20 32 30 30 33 2f 30 39 2f 30 36 20  .100 2003/09/06 
0220: 32 32 3a 31 38 3a 30 38 20 64 72 68 20 45 78 70  22:18:08 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
0270: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
0280: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
0290: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
02a0: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
02b0: 72 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f  r this node is o
02c0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
02d0: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  iteMalloc().  Th
02e0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
02f0: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
0300: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
0310: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
0320: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
0330: 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  eed..*/.Expr *sq
0340: 6c 69 74 65 45 78 70 72 28 69 6e 74 20 6f 70 2c  liteExpr(int op,
0350: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
0360: 70 72 20 2a 70 52 69 67 68 74 2c 20 54 6f 6b 65  pr *pRight, Toke
0370: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
0380: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  pr *pNew;.  pNew
0390: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
03a0: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
03b0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
03c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72  {.    sqliteExpr
03d0: 44 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20  Delete(pLeft);. 
03e0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
03f0: 65 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20  ete(pRight);.   
0400: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
0410: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a   pNew->op = op;.
0420: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
0430: 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  pLeft;.  pNew->p
0440: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a  Right = pRight;.
0450: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
0460: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
0470: 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  en->dyn==0 );.  
0480: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
0490: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 70 4e 65  *pToken;.    pNe
04a0: 77 2d 3e 73 70 61 6e 20 3d 20 2a 70 54 6f 6b 65  w->span = *pToke
04b0: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
04c0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  pNew->token.dyn 
04d0: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  = 0;.    pNew->t
04e0: 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  oken.z = 0;.    
04f0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  pNew->token.n = 
0500: 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  0;.    if( pLeft
0510: 20 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20   && pRight ){.  
0520: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 53 70      sqliteExprSp
0530: 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d  an(pNew, &pLeft-
0540: 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e  >span, &pRight->
0550: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  span);.    }else
0560: 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 73 70  {.      pNew->sp
0570: 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  an = pNew->token
0580: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
0590: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
05a0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
05b0: 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74  .span field of t
05c0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
05d0: 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a  ion to span all.
05e0: 2a 2a 20 74 65 78 74 20 62 65 74 77 65 65 6e 20  ** text between 
05f0: 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f  the two given to
0600: 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  kens..*/.void sq
0610: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 45 78 70  liteExprSpan(Exp
0620: 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20  r *pExpr, Token 
0630: 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pLeft, Token *p
0640: 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 45  Right){.  if( pE
0650: 78 70 72 20 26 26 20 70 52 69 67 68 74 20 26 26  xpr && pRight &&
0660: 20 70 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c   pRight->z && pL
0670: 65 66 74 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20  eft && pLeft->z 
0680: 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  ){.    if( pLeft
0690: 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67  ->dyn==0 && pRig
06a0: 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20  ht->dyn==0 ){.  
06b0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
06c0: 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20  z = pLeft->z;.  
06d0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
06e0: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20  n = pRight->n + 
06f0: 41 64 64 72 28 70 52 69 67 68 74 2d 3e 7a 29 20  Addr(pRight->z) 
0700: 2d 20 41 64 64 72 28 70 4c 65 66 74 2d 3e 7a 29  - Addr(pLeft->z)
0710: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0720: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
0730: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 45 78 70   = 0;.      pExp
0740: 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 30 3b 0a 20  r->span.n = 0;. 
0750: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
0760: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  .dyn = 0;.    }.
0770: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
0780: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
0790: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
07a0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
07b0: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
07c0: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
07d0: 2a 73 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74  *sqliteExprFunct
07e0: 69 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ion(ExprList *pL
07f0: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
0800: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
0810: 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  w;.  pNew = sqli
0820: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
0830: 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20  (Expr) );.  if( 
0840: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
0850: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
0860: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
0870: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
0880: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55  pNew->op = TK_FU
0890: 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e  NCTION;.  pNew->
08a0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
08b0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e   pNew->token.dyn
08c0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 6f 6b   = 0;.  if( pTok
08d0: 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
08e0: 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30  ( pToken->dyn==0
08f0: 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   );.    pNew->to
0900: 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20  ken = *pToken;. 
0910: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
0920: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20  ->token.z = 0;. 
0930: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e     pNew->token.n
0940: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
0950: 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74  ->span = pNew->t
0960: 6f 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70  oken;.  return p
0970: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  New;.}../*.** Re
0980: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
0990: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
09a0: 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ree..*/.void sql
09b0: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 45 78  iteExprDelete(Ex
09c0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
09d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
09e0: 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 26  f( p->span.dyn &
09f0: 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 29 20 73 71  & p->span.z ) sq
0a00: 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29  liteFree((char*)
0a10: 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66  p->span.z);.  if
0a20: 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 26  ( p->token.dyn &
0a30: 26 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 20 73  & p->token.z ) s
0a40: 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a  qliteFree((char*
0a50: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  )p->token.z);.  
0a60: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 20 73  if( p->pLeft ) s
0a70: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
0a80: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
0a90: 20 70 2d 3e 70 52 69 67 68 74 20 29 20 73 71 6c   p->pRight ) sql
0aa0: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d  iteExprDelete(p-
0ab0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20  >pRight);.  if( 
0ac0: 70 2d 3e 70 4c 69 73 74 20 29 20 73 71 6c 69 74  p->pList ) sqlit
0ad0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
0ae0: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 69 66 28  p->pList);.  if(
0af0: 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 20 73 71   p->pSelect ) sq
0b00: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
0b10: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
0b20: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
0b30: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  .../*.** The fol
0b40: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
0b50: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
0b60: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
0b70: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
0b80: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
0b90: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
0ba0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
0bb0: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
0bc0: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
0bd0: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
0be0: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
0bf0: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
0c00: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
0c10: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
0c20: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
0c30: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
0c40: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
0c50: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
0c60: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 45 78 70  urn by sqliteExp
0c70: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
0c80: 71 6c 69 74 65 49 64 4c 69 73 74 44 75 70 28 29  qliteIdListDup()
0c90: 2c 20 61 6e 64 20 73 71 6c 69 74 65 53 72 63 4c  , and sqliteSrcL
0ca0: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
0cb0: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
0cc0: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
0cd0: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
0ce0: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
0cf0: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
0d00: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
0d10: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
0d20: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
0d30: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
0d40: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
0d50: 74 65 45 78 70 72 44 75 70 28 45 78 70 72 20 2a  teExprDup(Expr *
0d60: 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  p){.  Expr *pNew
0d70: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
0d80: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
0d90: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
0da0: 77 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  w( sizeof(*p) );
0db0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
0dc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d   return 0;.  mem
0dd0: 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a  cpy(pNew, p, siz
0de0: 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69  eof(*pNew));.  i
0df0: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30  f( p->token.z!=0
0e00: 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   ){.    pNew->to
0e10: 6b 65 6e 2e 7a 20 3d 20 73 71 6c 69 74 65 53 74  ken.z = sqliteSt
0e20: 72 44 75 70 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  rDup(p->token.z)
0e30: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  ;.    pNew->toke
0e40: 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  n.dyn = 1;.  }el
0e50: 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f  se{.    pNew->to
0e60: 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 70  ken.z = 0;.    p
0e70: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30  New->token.n = 0
0e80: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  ;.    pNew->toke
0e90: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20  n.dyn = 0;.  }. 
0ea0: 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20   pNew->span.z = 
0eb0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e  0;.  pNew->span.
0ec0: 6e 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73  n = 0;.  pNew->s
0ed0: 70 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 70  pan.dyn = 0;.  p
0ee0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
0ef0: 69 74 65 45 78 70 72 44 75 70 28 70 2d 3e 70 4c  iteExprDup(p->pL
0f00: 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  eft);.  pNew->pR
0f10: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70  ight = sqliteExp
0f20: 72 44 75 70 28 70 2d 3e 70 52 69 67 68 74 29 3b  rDup(p->pRight);
0f30: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d  .  pNew->pList =
0f40: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
0f50: 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  up(p->pList);.  
0f60: 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20  pNew->pSelect = 
0f70: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28  sqliteSelectDup(
0f80: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72  p->pSelect);.  r
0f90: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f  eturn pNew;.}.vo
0fa0: 69 64 20 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f  id sqliteTokenCo
0fb0: 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54  py(Token *pTo, T
0fc0: 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  oken *pFrom){.  
0fd0: 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73  if( pTo->dyn ) s
0fe0: 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a  qliteFree((char*
0ff0: 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20  )pTo->z);.  if( 
1000: 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20  pFrom->z ){.    
1010: 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e  pTo->n = pFrom->
1020: 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20  n;.    pTo->z = 
1030: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 46  sqliteStrNDup(pF
1040: 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e  rom->z, pFrom->n
1050: 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20  );.    pTo->dyn 
1060: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
1070: 20 20 70 54 6f 2d 3e 6e 20 3d 20 30 3b 0a 20 20    pTo->n = 0;.  
1080: 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20    pTo->z = 0;.  
1090: 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 30 3b 0a    pTo->dyn = 0;.
10a0: 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a    }.}.ExprList *
10b0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75  sqliteExprListDu
10c0: 70 28 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a  p(ExprList *p){.
10d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
10e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
10f0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
1100: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
1110: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
1120: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
1130: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
1140: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70   0;.  pNew->nExp
1150: 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  r = pNew->nAlloc
1160: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70   = p->nExpr;.  p
1170: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d  New->a = sqliteM
1180: 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a  alloc( p->nExpr*
1190: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
11a0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
11b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
11c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
11d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11e0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c   Expr *pNewExpr,
11f0: 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20   *pOldExpr;.    
1200: 70 4e 65 77 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pNew->a[i].pExpr
1210: 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71   = pNewExpr = sq
1220: 6c 69 74 65 45 78 70 72 44 75 70 28 70 4f 6c 64  liteExprDup(pOld
1230: 45 78 70 72 20 3d 20 70 2d 3e 61 5b 69 5d 2e 70  Expr = p->a[i].p
1240: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
1250: 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21  OldExpr->span.z!
1260: 3d 30 20 26 26 20 70 4e 65 77 45 78 70 72 20 29  =0 && pNewExpr )
1270: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79  {.      /* Alway
1280: 73 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  s make a copy of
1290: 20 74 68 65 20 73 70 61 6e 20 66 6f 72 20 74 6f   the span for to
12a0: 70 2d 6c 65 76 65 6c 20 65 78 70 72 65 73 73 69  p-level expressi
12b0: 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ons in the.     
12c0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   ** expression l
12d0: 69 73 74 2e 20 20 54 68 65 20 6c 6f 67 69 63 20  ist.  The logic 
12e0: 69 6e 20 53 45 4c 45 43 54 20 70 72 6f 63 65 73  in SELECT proces
12f0: 73 69 6e 67 20 74 68 61 74 20 64 65 74 65 72 6d  sing that determ
1300: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  ines.      ** th
1310: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
1320: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
1330: 20 73 65 74 20 6e 65 65 64 73 20 74 68 69 73 20   set needs this 
1340: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
1350: 20 20 20 20 20 73 71 6c 69 74 65 54 6f 6b 65 6e       sqliteToken
1360: 43 6f 70 79 28 26 70 4e 65 77 45 78 70 72 2d 3e  Copy(&pNewExpr->
1370: 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d  span, &pOldExpr-
1380: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >span);.    }.  
1390: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78    assert( pNewEx
13a0: 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70  pr==0 || pNewExp
13b0: 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20  r->span.z!=0 .  
13c0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c            || pOl
13d0: 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30  dExpr->span.z==0
13e0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
13f0: 63 5f 66 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  c_failed );.    
1400: 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pNew->a[i].zName
1410: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
1420: 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  p->a[i].zName);.
1430: 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 73      pNew->a[i].s
1440: 6f 72 74 4f 72 64 65 72 20 3d 20 70 2d 3e 61 5b  ortOrder = p->a[
1450: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
1460: 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 69 73 41    pNew->a[i].isA
1470: 67 67 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73 41  gg = p->a[i].isA
1480: 67 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  gg;.    pNew->a[
1490: 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  i].done = 0;.  }
14a0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
14b0: 7d 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  }.SrcList *sqlit
14c0: 65 53 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c  eSrcListDup(SrcL
14d0: 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ist *p){.  SrcLi
14e0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
14f0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
1500: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1510: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
1520: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
1530: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
1540: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
1550: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
1560: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
1570: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
1580: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
1590: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
15a0: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
15b0: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
15c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
15d0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
15e0: 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61  pNew->a[i].zData
15f0: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72  base = sqliteStr
1600: 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 44 61 74  Dup(p->a[i].zDat
1610: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
1620: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
1630: 71 6c 69 74 65 53 74 72 44 75 70 28 70 2d 3e 61  qliteStrDup(p->a
1640: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
1650: 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  pNew->a[i].zAlia
1660: 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  s = sqliteStrDup
1670: 28 70 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29  (p->a[i].zAlias)
1680: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d  ;.    pNew->a[i]
1690: 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61  .jointype = p->a
16a0: 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  [i].jointype;.  
16b0: 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 69 43 75    pNew->a[i].iCu
16c0: 72 73 6f 72 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69  rsor = p->a[i].i
16d0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77  Cursor;.    pNew
16e0: 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b  ->a[i].pTab = 0;
16f0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e  .    pNew->a[i].
1700: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
1710: 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 61 5b 69  SelectDup(p->a[i
1720: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
1730: 70 4e 65 77 2d 3e 61 5b 69 5d 2e 70 4f 6e 20 3d  pNew->a[i].pOn =
1740: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
1750: 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20  ->a[i].pOn);.   
1760: 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 70 55 73 69   pNew->a[i].pUsi
1770: 6e 67 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73  ng = sqliteIdLis
1780: 74 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 70 55 73  tDup(p->a[i].pUs
1790: 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ing);.  }.  retu
17a0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
17b0: 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 44  t *sqliteIdListD
17c0: 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  up(IdList *p){. 
17d0: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
17e0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
17f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1800: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
1810: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
1820: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
1830: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
1840: 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70  .  pNew->nId = p
1850: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
1860: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
1870: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1880: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
1890: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
18a0: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 20 72 65 74  pNew->a==0 ) ret
18b0: 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
18c0: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
18d0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d  {.    pNew->a[i]
18e0: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  .zName = sqliteS
18f0: 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e  trDup(p->a[i].zN
1900: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ame);.    pNew->
1910: 61 5b 69 5d 2e 69 64 78 20 3d 20 70 2d 3e 61 5b  a[i].idx = p->a[
1920: 69 5d 2e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65  i].idx;.  }.  re
1930: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c  turn pNew;.}.Sel
1940: 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c 65 63  ect *sqliteSelec
1950: 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b  tDup(Select *p){
1960: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
1970: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1980: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
1990: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
19a0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
19b0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
19c0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  urn 0;.  pNew->i
19d0: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
19e0: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65  sDistinct;.  pNe
19f0: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
1a00: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  teExprListDup(p-
1a10: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77  >pEList);.  pNew
1a20: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 53  ->pSrc = sqliteS
1a30: 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70 53 72  rcListDup(p->pSr
1a40: 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  c);.  pNew->pWhe
1a50: 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  re = sqliteExprD
1a60: 75 70 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  up(p->pWhere);. 
1a70: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
1a80: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
1a90: 44 75 70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  Dup(p->pGroupBy)
1aa0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
1ab0: 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  g = sqliteExprDu
1ac0: 70 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  p(p->pHaving);. 
1ad0: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
1ae0: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
1af0: 44 75 70 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  Dup(p->pOrderBy)
1b00: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
1b10: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
1b20: 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 53 65 6c  rior = sqliteSel
1b30: 65 63 74 44 75 70 28 70 2d 3e 70 50 72 69 6f 72  ectDup(p->pPrior
1b40: 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d 69  );.  pNew->nLimi
1b50: 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20  t = p->nLimit;. 
1b60: 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20 3d   pNew->nOffset =
1b70: 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 70   p->nOffset;.  p
1b80: 4e 65 77 2d 3e 7a 53 65 6c 65 63 74 20 3d 20 30  New->zSelect = 0
1b90: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
1ba0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69   = -1;.  pNew->i
1bb0: 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 72  Offset = -1;.  r
1bc0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a  eturn pNew;.}...
1bd0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
1be0: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
1bf0: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
1c00: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
1c10: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
1c20: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
1c30: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
1c40: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
1c50: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
1c60: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45  ExprListAppend(E
1c70: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1c80: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
1c90: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
1ca0: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1cb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
1cc0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1cd0: 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74   sizeof(ExprList
1ce0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
1cf0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  st==0 ){.      s
1d00: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
1d10: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65  pExpr);.      re
1d20: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1d30: 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
1d40: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
1d50: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c  List->nAlloc<=pL
1d60: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
1d70: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1d80: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70  t_item *a;.    p
1d90: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  List->nAlloc = p
1da0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b  List->nAlloc*2 +
1db0: 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   4;.    a = sqli
1dc0: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  teRealloc(pList-
1dd0: 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >a, pList->nAllo
1de0: 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  c*sizeof(pList->
1df0: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
1e00: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  a==0 ){.      sq
1e10: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
1e20: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
1e30: 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d  urn pList;.    }
1e40: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
1e50: 61 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78  a;.  }.  if( pEx
1e60: 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20  pr || pName ){. 
1e70: 20 20 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45     i = pList->nE
1e80: 78 70 72 2b 2b 3b 0a 20 20 20 20 70 4c 69 73 74  xpr++;.    pList
1e90: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  ->a[i].pExpr = p
1ea0: 45 78 70 72 3b 0a 20 20 20 20 70 4c 69 73 74 2d  Expr;.    pList-
1eb0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b  >a[i].zName = 0;
1ec0: 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20 29  .    if( pName )
1ed0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
1ee0: 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d  tNString(&pList-
1ef0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[i].zName, pNa
1f00: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c  me->z, pName->n,
1f10: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1f20: 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e  eDequote(pList->
1f30: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
1f40: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f50: 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
1f60: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
1f70: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1f80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1f90: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45  ExprListDelete(E
1fa0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1fb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1fc0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1fd0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1fe0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1ff0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  +){.    sqliteEx
2000: 70 72 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e  prDelete(pList->
2010: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
2020: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
2030: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
2040: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
2050: 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71  (pList->a);.  sq
2060: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b  liteFree(pList);
2070: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
2080: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2090: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
20a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
20b0: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e  s constant.** an
20c0: 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  d 0 if it involv
20d0: 65 73 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  es variables..**
20e0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
20f0: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
2100: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
2110: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
2120: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
2130: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
2140: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
2150: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
2160: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
2170: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
2180: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72  /.int sqliteExpr
2190: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
21a0: 2a 70 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  *p){.  switch( p
21b0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
21c0: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
21d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
21e0: 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20  case TK_DOT:.   
21f0: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
2200: 4e 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  N:.      return 
2210: 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  0;.    case TK_N
2220: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
2230: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
2240: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
2250: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
2260: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
2270: 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 72 65 74  IABLE:.      ret
2280: 75 72 6e 20 31 3b 0a 20 20 20 20 64 65 66 61 75  urn 1;.    defau
2290: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  lt: {.      if( 
22a0: 70 2d 3e 70 4c 65 66 74 20 26 26 20 21 73 71 6c  p->pLeft && !sql
22b0: 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  iteExprIsConstan
22c0: 74 28 70 2d 3e 70 4c 65 66 74 29 20 29 20 72 65  t(p->pLeft) ) re
22d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66  turn 0;.      if
22e0: 28 20 70 2d 3e 70 52 69 67 68 74 20 26 26 20 21  ( p->pRight && !
22f0: 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73  sqliteExprIsCons
2300: 74 61 6e 74 28 70 2d 3e 70 52 69 67 68 74 29 20  tant(p->pRight) 
2310: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2320: 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29    if( p->pList )
2330: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
2340: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2350: 3b 20 69 3c 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45  ; i<p->pList->nE
2360: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
2370: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
2380: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
2390: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
23a0: 78 70 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  xpr) ) return 0;
23b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
23d0: 70 2d 3e 70 4c 65 66 74 21 3d 30 20 7c 7c 20 70  p->pLeft!=0 || p
23e0: 2d 3e 70 52 69 67 68 74 21 3d 30 20 7c 7c 20 28  ->pRight!=0 || (
23f0: 70 2d 3e 70 4c 69 73 74 20 26 26 20 70 2d 3e 70  p->pList && p->p
2400: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 3b 0a  List->nExpr>0);.
2410: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2420: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
2430: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
2440: 65 73 73 69 6f 6e 20 63 6f 64 65 73 20 61 20 63  ession codes a c
2450: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 2c  onstant integer,
2460: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
2470: 74 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  t.** the value o
2480: 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e  f the integer in
2490: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
24a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
24b0: 6e 6f 74 20 61 6e 0a 2a 2a 20 69 6e 74 65 67 65  not an.** intege
24c0: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
24d0: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
24e0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
24f0: 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65  sqliteExprIsInte
2500: 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
2510: 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69   *pValue){.  swi
2520: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
2530: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
2540: 52 3a 20 7b 0a 20 20 20 20 20 20 2a 70 56 61 6c  R: {.      *pVal
2550: 75 65 20 3d 20 61 74 6f 69 28 70 2d 3e 74 6f 6b  ue = atoi(p->tok
2560: 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  en.z);.      ret
2570: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2580: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
2590: 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
25a0: 68 61 72 20 2a 7a 20 3d 20 70 2d 3e 74 6f 6b 65  har *z = p->toke
25b0: 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n.z;.      int n
25c0: 20 3d 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20   = p->token.n;. 
25d0: 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20       if( n>0 && 
25e0: 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b  z[0]=='-' ){ z++
25f0: 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 77  ; n--; }.      w
2600: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 2a 7a 20  hile( n>0 && *z 
2610: 26 26 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29  && isdigit(*z) )
2620: 7b 20 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d 0a 20 20  { z++; n--; }.  
2630: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
2640: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
2650: 3d 20 61 74 6f 69 28 70 2d 3e 74 6f 6b 65 6e 2e  = atoi(p->token.
2660: 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  z);.        retu
2670: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
2680: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2690: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
26a0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  US: {.      retu
26b0: 72 6e 20 73 71 6c 69 74 65 45 78 70 72 49 73 49  rn sqliteExprIsI
26c0: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
26d0: 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a   pValue);.    }.
26e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
26f0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
2700: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
2710: 69 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72  iteExprIsInteger
2720: 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
2730: 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  {.        *pValu
2740: 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
2750: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2760: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
2770: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
2780: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  : break;.  }.  r
2790: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
27a0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
27b0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
27c0: 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
27d0: 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
27e0: 74 20 73 71 6c 69 74 65 49 73 52 6f 77 69 64 28  t sqliteIsRowid(
27f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
2800: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
2810: 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
2820: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
2830: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
2840: 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29  ICmp(z, "ROWID")
2850: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
2860: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
2870: 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
2880: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
2890: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
28a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
28b0: 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69  alks an expressi
28c0: 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f  on tree and reso
28d0: 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20  lves references 
28e0: 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75  to.** table colu
28f0: 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74  mns.  Nodes of t
2900: 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72  he form ID.ID or
2910: 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f   ID resolve into
2920: 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20   an.** index to 
2930: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  the table in the
2940: 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20   table list and 
2950: 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e  a column offset.
2960: 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f    The .** Expr.o
2970: 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e  pcode for such n
2980: 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64 20  odes is changed 
2990: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54  to TK_COLUMN.  T
29a0: 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a  he Expr.iTable.*
29b0: 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  * value is chang
29c0: 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ed to the index 
29d0: 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
29e0: 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  d table in pTabL
29f0: 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20  ist.** plus the 
2a00: 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54  "base" value.  T
2a10: 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77 69  he base value wi
2a20: 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65  ll ultimately be
2a30: 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45  come the.** VDBE
2a40: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
2a50: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
2a60: 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
2a70: 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  o the referenced
2a80: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20  .** table.  The 
2a90: 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c  Expr.iColumn val
2aa0: 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ue is changed to
2ab0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
2ac0: 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20  e column .** of 
2ad0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
2ae0: 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e  able.  The Expr.
2af0: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f  iColumn value fo
2b00: 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  r the special.**
2b10: 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73   ROWID column is
2b20: 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45   -1.  Any INTEGE
2b30: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
2b40: 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73  lumn is tried as
2b50: 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72   an.** alias for
2b60: 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 57 65   ROWID..**.** We
2b70: 20 61 6c 73 6f 20 63 68 65 63 6b 20 66 6f 72 20   also check for 
2b80: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
2b90: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
2ba0: 4e 20 63 6f 6d 65 73 20 69 6e 20 74 77 6f 0a 2a  N comes in two.*
2bb0: 2a 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20  * forms:.**.**  
2bc0: 20 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e           expr IN
2bd0: 20 28 65 78 70 72 6c 69 73 74 29 0a 2a 2a 20 61   (exprlist).** a
2be0: 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
2bf0: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
2c00: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ...).**.** The f
2c10: 69 72 73 74 20 66 6f 72 6d 20 69 73 20 68 61 6e  irst form is han
2c20: 64 6c 65 64 20 62 79 20 63 72 65 61 74 69 6e 67  dled by creating
2c30: 20 61 20 73 65 74 20 68 6f 6c 64 69 6e 67 20 74   a set holding t
2c40: 68 65 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c  he list.** of al
2c50: 6c 6f 77 65 64 20 76 61 6c 75 65 73 2e 20 20 54  lowed values.  T
2c60: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63  he second form c
2c70: 61 75 73 65 73 20 74 68 65 20 53 45 4c 45 43 54  auses the SELECT
2c80: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 0a 2a 2a   to generate .**
2c90: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
2ca0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
2cb0: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6c 6f 6f 6b  outine also look
2cc0: 73 20 66 6f 72 20 73 63 61 6c 61 72 20 53 45 4c  s for scalar SEL
2cd0: 45 43 54 73 20 74 68 61 74 20 61 72 65 20 70 61  ECTs that are pa
2ce0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
2cf0: 69 6f 6e 2e 0a 2a 2a 20 49 66 20 69 74 20 66 69  ion..** If it fi
2d00: 6e 64 73 20 61 6e 79 2c 20 69 74 20 67 65 6e 65  nds any, it gene
2d10: 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 77 72  rates code to wr
2d20: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ite the value of
2d30: 20 74 68 61 74 20 73 65 6c 65 63 74 0a 2a 2a 20   that select.** 
2d40: 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65  into a memory ce
2d50: 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f 77  ll..**.** Unknow
2d60: 6e 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 74 61 62  n columns or tab
2d70: 6c 65 73 20 70 72 6f 76 6f 6b 65 20 61 6e 20 65  les provoke an e
2d80: 72 72 6f 72 2e 20 20 54 68 65 20 66 75 6e 63 74  rror.  The funct
2d90: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  ion returns.** t
2da0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2db0: 6f 72 73 20 73 65 65 6e 20 61 6e 64 20 6c 65 61  ors seen and lea
2dc0: 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ves an error mes
2dd0: 73 61 67 65 20 6f 6e 20 70 50 61 72 73 65 2d 3e  sage on pParse->
2de0: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
2df0: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
2e00: 65 49 64 73 28 0a 20 20 50 61 72 73 65 20 2a 70  eIds(.  Parse *p
2e10: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
2e20: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
2e30: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
2e40: 54 61 62 4c 69 73 74 2c 20 2f 2a 20 4c 69 73 74  TabList, /* List
2e50: 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64 20   of tables used 
2e60: 74 6f 20 72 65 73 6f 6c 76 65 20 63 6f 6c 75 6d  to resolve colum
2e70: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 45 78 70  n names */.  Exp
2e80: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
2e90: 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65  /* List of expre
2ea0: 73 73 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 72  ssions used to r
2eb0: 65 73 6f 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20  esolve "AS" */. 
2ec0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
2ed0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
2ee0: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c  ssion to be anal
2ef0: 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  yzed. */.){.  in
2f00: 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  t i;..  if( pExp
2f10: 72 3d 3d 30 20 7c 7c 20 70 54 61 62 4c 69 73 74  r==0 || pTabList
2f20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2f30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2f40: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2f50: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2f60: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
2f70: 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 54 61 62  ursor>=0 && pTab
2f80: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
2f90: 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  or<pParse->nTab 
2fa0: 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  );.  }.  switch(
2fb0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
2fc0: 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74    /* Double-quot
2fd0: 65 64 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20  ed strings (ex: 
2fe0: 22 61 62 63 22 29 20 61 72 65 20 75 73 65 64 20  "abc") are used 
2ff0: 61 73 20 69 64 65 6e 74 69 66 69 65 72 73 20 69  as identifiers i
3000: 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c  f.    ** possibl
3010: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
3020: 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73 74 72  ey remain as str
3030: 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75  ings.  Single-qu
3040: 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74 72 69  oted.    ** stri
3050: 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27 29 20  ngs (ex: 'abc') 
3060: 61 72 65 20 61 6c 77 61 79 73 20 73 74 72 69 6e  are always strin
3070: 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20 20  g literals..    
3080: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  */.    case TK_S
3090: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69  TRING: {.      i
30a0: 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
30b0: 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65  z[0]=='\'' ) bre
30c0: 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  ak;.      /* Fal
30d0: 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
30e0: 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20 74 68  TK_ID case if th
30f0: 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71  is is a double-q
3100: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  uoted string */.
3110: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c      }.    /* A l
3120: 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72 2e 20  one identifier. 
3130: 20 54 72 79 20 61 6e 64 20 6d 61 74 63 68 20 69   Try and match i
3140: 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  t as follows:.  
3150: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
3160: 31 2e 20 20 54 6f 20 74 68 65 20 6e 61 6d 65 20  1.  To the name 
3170: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f  of a column of o
3180: 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
3190: 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 20 20 20   in pTabList.   
31a0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 32   **.    **     2
31b0: 2e 20 20 54 6f 20 74 68 65 20 72 69 67 68 74 20  .  To the right 
31c0: 73 69 64 65 20 6f 66 20 61 6e 20 41 53 20 6b 65  side of an AS ke
31d0: 79 77 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c  yword in the col
31e0: 75 6d 6e 20 6c 69 73 74 20 6f 66 0a 20 20 20 20  umn list of.    
31f0: 2a 2a 20 20 20 20 20 20 20 20 20 61 20 53 45 4c  **         a SEL
3200: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
3210: 28 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 6d 61  (For example, ma
3220: 74 63 68 20 61 67 61 69 6e 73 74 20 27 78 27 20  tch against 'x' 
3230: 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  in.    **       
3240: 20 20 22 53 45 4c 45 43 54 20 61 2b 62 20 41 53    "SELECT a+b AS
3250: 20 27 78 27 20 46 52 4f 4d 20 74 31 22 2e 29 0a   'x' FROM t1".).
3260: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
3270: 20 20 33 2e 20 20 4f 6e 65 20 6f 66 20 74 68 65    3.  One of the
3280: 20 73 70 65 63 69 61 6c 20 6e 61 6d 65 73 20 22   special names "
3290: 52 4f 57 49 44 22 2c 20 22 4f 49 44 22 2c 20 6f  ROWID", "OID", o
32a0: 72 20 22 5f 52 4f 57 49 44 5f 22 2e 0a 20 20 20  r "_ROWID_"..   
32b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
32c0: 49 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ID: {.      int 
32d0: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  cnt = 0;      /*
32e0: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
32f0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  es */.      char
3300: 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   *z;.      int i
3310: 44 62 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 20 20  Db = -1;..      
3320: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74  assert( pExpr->t
3330: 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20  oken.z );.      
3340: 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  z = sqliteStrNDu
3350: 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  p(pExpr->token.z
3360: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
3370: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44  );.      sqliteD
3380: 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 20 20 20  equote(z);.     
3390: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
33a0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28  rn 1;.      for(
33b0: 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
33c0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
33d0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
33e0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
33f0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  = pTabList->a[i]
3400: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  .pTab;.        i
3410: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e  f( pTab==0 ) con
3420: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
3430: 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a  Db = pTab->iDb;.
3440: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3450: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
3460: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
3470: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
3480: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
3490: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
34a0: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  (pTab->aCol[j].z
34b0: 4e 61 6d 65 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20  Name, z)==0 ){. 
34c0: 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
34d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
34e0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54  xpr->iTable = pT
34f0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
3500: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rsor;.          
3510: 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70    pExpr->iDb = p
3520: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20  Tab->iDb;.      
3530: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
3540: 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
3550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
3560: 73 74 69 74 75 74 65 20 74 68 65 20 72 65 63 6f  stitute the reco
3570: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
3580: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
3590: 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20  Y KEY */.       
35a0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
35b0: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
35c0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
35d0: 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c 49  >dataType = SQLI
35e0: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20  TE_SO_NUM;.     
35f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3600: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
3610: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  r->iColumn = j;.
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
3630: 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20  xpr->dataType = 
3640: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 73 6f  pTab->aCol[j].so
3650: 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49 54 45  rtOrder & SQLITE
3660: 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 3b 0a 20 20  _SO_TYPEMASK;.  
3670: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3680: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
3690: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
36a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
36b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
36c0: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26     if( cnt==0 &&
36d0: 20 70 45 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20   pEList!=0 ){.  
36e0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
36f0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3700: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
3710: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
3720: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
3730: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
3740: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73           if( zAs
3750: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 53 74 72  !=0 && sqliteStr
3760: 49 43 6d 70 28 7a 41 73 2c 20 7a 29 3d 3d 30 20  ICmp(zAs, z)==0 
3770: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
3780: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
3790: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
37a0: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
37b0: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
37c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
37d0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a  pr->op = TK_AS;.
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
37f0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  r->iColumn = j;.
3800: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
3810: 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
3820: 65 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  eExprDup(pEList-
3830: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[j].pExpr);.  
3840: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3850: 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 20 20 20    } .      }.   
3860: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26     if( cnt==0 &&
3870: 20 69 44 62 3e 3d 30 20 26 26 20 73 71 6c 69 74   iDb>=0 && sqlit
3880: 65 49 73 52 6f 77 69 64 28 7a 29 20 29 7b 0a 20  eIsRowid(z) ){. 
3890: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
38a0: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
38b0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
38c0: 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  e = pTabList->a[
38d0: 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  0].iCursor;.    
38e0: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d      pExpr->iDb =
38f0: 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 63 6e   iDb;.        cn
3900: 74 20 3d 20 31 20 2b 20 28 70 54 61 62 4c 69 73  t = 1 + (pTabLis
3910: 74 2d 3e 6e 53 72 63 3e 31 29 3b 0a 20 20 20 20  t->nSrc>1);.    
3920: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
3930: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
3940: 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79     pExpr->dataTy
3950: 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e  pe = SQLITE_SO_N
3960: 55 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  UM;.      }.    
3970: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
3980: 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  .      if( cnt==
3990: 30 20 26 26 20 70 45 78 70 72 2d 3e 74 6f 6b 65  0 && pExpr->toke
39a0: 6e 2e 7a 5b 30 5d 21 3d 27 22 27 20 29 7b 0a 20  n.z[0]!='"' ){. 
39b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
39c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
39d0: 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25  o such column: %
39e0: 54 22 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65  T", &pExpr->toke
39f0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  n);.        retu
3a00: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 1;.      }els
3a10: 65 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a 20  e if( cnt>1 ){. 
3a20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
3a30: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
3a40: 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20  mbiguous column 
3a50: 6e 61 6d 65 3a 20 25 54 22 2c 20 26 70 45 78 70  name: %T", &pExp
3a60: 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  r->token);.     
3a70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3a80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
3a90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
3aa0: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  UMN ){.        s
3ab0: 71 6c 69 74 65 41 75 74 68 52 65 61 64 28 70 50  qliteAuthRead(pP
3ac0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 54 61  arse, pExpr, pTa
3ad0: 62 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  bList);.      }.
3ae0: 20 20 20 20 20 20 62 72 65 61 6b 3b 20 0a 20 20        break; .  
3af0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20    }.  .    /* A 
3b00: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63  table name and c
3b10: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20  olumn name:     
3b20: 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20  ID.ID.    ** Or 
3b30: 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c  a database, tabl
3b40: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49  e and column:  I
3b50: 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20  D.ID.ID.    */. 
3b60: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20     case TK_DOT: 
3b70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  {.      int cnt 
3b80: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
3b90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
3ba0: 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  tches */.      i
3bb0: 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20  nt cntTab = 0;  
3bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3bd0: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61  r of matching ta
3be0: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  bles */.      in
3bf0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
3c00: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
3c10: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
3c20: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52  Expr *pLeft, *pR
3c30: 69 67 68 74 3b 20 20 20 20 2f 2a 20 4c 65 66 74  ight;    /* Left
3c40: 20 61 6e 64 20 72 69 67 68 74 20 73 75 62 62 72   and right subbr
3c50: 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20 65 78  anches of the ex
3c60: 70 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  pr */.      char
3c70: 20 2a 7a 4c 65 66 74 2c 20 2a 7a 52 69 67 68 74   *zLeft, *zRight
3c80: 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  ;    /* Text of 
3c90: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  an identifier */
3ca0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 44 62  .      char *zDb
3cb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3cc0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62  /* Name of datab
3cd0: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 61 62 6c  ase holding tabl
3ce0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
3cf0: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
3d00: 64 62 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68  db;..      pRigh
3d10: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
3d20: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  t;.      if( pRi
3d30: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  ght->op==TK_ID )
3d40: 7b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20  {.        pLeft 
3d50: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
3d60: 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20 30 3b          zDb = 0;
3d70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3d80: 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 62 20        Expr *pDb 
3d90: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
3da0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3db0: 70 44 62 20 26 26 20 70 44 62 2d 3e 6f 70 3d 3d  pDb && pDb->op==
3dc0: 54 4b 5f 49 44 20 26 26 20 70 44 62 2d 3e 74 6f  TK_ID && pDb->to
3dd0: 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 20  ken.z );.       
3de0: 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 53 74 72   zDb = sqliteStr
3df0: 4e 44 75 70 28 70 44 62 2d 3e 74 6f 6b 65 6e 2e  NDup(pDb->token.
3e00: 7a 2c 20 70 44 62 2d 3e 74 6f 6b 65 6e 2e 6e 29  z, pDb->token.n)
3e10: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20  ;.        pLeft 
3e20: 3d 20 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 3b  = pRight->pLeft;
3e30: 0a 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20  .        pRight 
3e40: 3d 20 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74  = pRight->pRight
3e50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3e60: 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 26 26  assert( pLeft &&
3e70: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
3e80: 44 20 26 26 20 70 4c 65 66 74 2d 3e 74 6f 6b 65  D && pLeft->toke
3e90: 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 61 73 73  n.z );.      ass
3ea0: 65 72 74 28 20 70 52 69 67 68 74 20 26 26 20 70  ert( pRight && p
3eb0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  Right->op==TK_ID
3ec0: 20 26 26 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65   && pRight->toke
3ed0: 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 7a 4c 65  n.z );.      zLe
3ee0: 66 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  ft = sqliteStrND
3ef0: 75 70 28 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e  up(pLeft->token.
3f00: 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e  z, pLeft->token.
3f10: 6e 29 3b 0a 20 20 20 20 20 20 7a 52 69 67 68 74  n);.      zRight
3f20: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
3f30: 28 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  (pRight->token.z
3f40: 2c 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  , pRight->token.
3f50: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  n);.      if( zL
3f60: 65 66 74 3d 3d 30 20 7c 7c 20 7a 52 69 67 68 74  eft==0 || zRight
3f70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
3f80: 71 6c 69 74 65 46 72 65 65 28 7a 4c 65 66 74 29  qliteFree(zLeft)
3f90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3fa0: 46 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 20 20  Free(zRight);.  
3fb0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
3fc0: 28 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 72  (zDb);.        r
3fd0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3fe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71  .      sqliteDeq
3ff0: 75 6f 74 65 28 7a 44 62 29 3b 0a 20 20 20 20 20  uote(zDb);.     
4000: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
4010: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
4020: 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67 68  iteDequote(zRigh
4030: 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
4040: 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20  >iTable = -1;.  
4050: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4060: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
4070: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
4080: 20 6a 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   j;.        char
4090: 20 2a 7a 54 61 62 3b 0a 20 20 20 20 20 20 20 20   *zTab;.        
40a0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
40b0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
40c0: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  b;.        if( p
40d0: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
40e0: 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
40f0: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
4100: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
4110: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
4120: 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
4130: 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73    zTab = pTabLis
4140: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a  t->a[i].zAlias;.
4150: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
4160: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 54 61 62  liteStrICmp(zTab
4170: 2c 20 7a 4c 65 66 74 29 21 3d 30 20 29 20 63 6f  , zLeft)!=0 ) co
4180: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
4190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
41a0: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
41b0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ame;.          i
41c0: 66 28 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 73 71  f( zTab==0 || sq
41d0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 54 61 62  liteStrICmp(zTab
41e0: 2c 20 7a 4c 65 66 74 29 21 3d 30 20 29 20 63 6f  , zLeft)!=0 ) co
41f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
4200: 20 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20    if( zDb!=0 && 
4210: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 64 62  sqliteStrICmp(db
4220: 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d  ->aDb[pTab->iDb]
4230: 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20  .zName, zDb)!=0 
4240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
4250: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
4260: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
4270: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63         if( 0==(c
4280: 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20  ntTab++) ){.    
4290: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
42a0: 62 6c 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  ble = pTabList->
42b0: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
42c0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
42d0: 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a  Db = pTab->iDb;.
42e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
42f0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
4300: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
4310: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
4320: 69 74 65 53 74 72 49 43 6d 70 28 70 54 61 62 2d  iteStrICmp(pTab-
4330: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
4340: 7a 52 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20  zRight)==0 ){.  
4350: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
4360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
4370: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 61  pr->iTable = pTa
4380: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
4390: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sor;.           
43a0: 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54   pExpr->iDb = pT
43b0: 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20  ab->iDb;.       
43c0: 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
43d0: 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f  te the rowid (co
43e0: 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65  lumn -1) for the
43f0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
4400: 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20   KEY */.        
4410: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4420: 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50  mn = j==pTab->iP
4430: 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20  Key ? -1 : j;.  
4440: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
4450: 3e 64 61 74 61 54 79 70 65 20 3d 20 70 54 61 62  >dataType = pTab
4460: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 73 6f 72 74 4f 72  ->aCol[j].sortOr
4470: 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f  der & SQLITE_SO_
4480: 54 59 50 45 4d 41 53 4b 3b 0a 20 20 20 20 20 20  TYPEMASK;.      
4490: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
44a0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
44b0: 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74  * If we have not
44c0: 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65   already resolve
44d0: 64 20 74 68 69 73 20 2a 2e 2a 20 65 78 70 72 65  d this *.* expre
44e0: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 79 62  ssion, then mayb
44f0: 65 20 0a 20 20 20 20 20 20 20 2a 20 69 74 20 69  e .       * it i
4500: 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64  s a new.* or old
4510: 2e 2a 20 74 72 69 67 67 65 72 20 61 72 67 75 6d  .* trigger argum
4520: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ent reference */
4530: 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 3d  .      if( cnt =
4540: 3d 20 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74  = 0 && pParse->t
4550: 72 69 67 53 74 61 63 6b 20 21 3d 20 30 20 29 7b  rigStack != 0 ){
4560: 0a 20 20 20 20 20 20 20 20 54 72 69 67 67 65 72  .        Trigger
4570: 53 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53  Stack *pTriggerS
4580: 74 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74  tack = pParse->t
4590: 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20  rigStack;.      
45a0: 20 20 69 6e 74 20 74 20 3d 20 30 3b 0a 20 20 20    int t = 0;.   
45b0: 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65       if( pTrigge
45c0: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21  rStack->newIdx !
45d0: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 53 74  = -1 && sqliteSt
45e0: 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 4c 65  rICmp("new", zLe
45f0: 66 74 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ft) == 0 ){.    
4600: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
4610: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
4620: 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20  ack->newIdx;.   
4630: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
4640: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
4650: 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab );.          
4660: 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 72  pExpr->iDb = pTr
4670: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
4680: 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  ->iDb;.         
4690: 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20   cntTab++;.     
46a0: 20 20 20 20 20 74 20 3d 20 31 3b 0a 20 20 20 20       t = 1;.    
46b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
46c0: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
46d0: 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26 26  >oldIdx != -1 &&
46e0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 22   sqliteStrICmp("
46f0: 6f 6c 64 22 2c 20 7a 4c 65 66 74 29 20 3d 3d 20  old", zLeft) == 
4700: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
4710: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
4720: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c  TriggerStack->ol
4730: 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  dIdx;.          
4740: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
4750: 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20  Stack->pTab );. 
4760: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
4770: 69 44 62 20 3d 20 70 54 72 69 67 67 65 72 53 74  iDb = pTriggerSt
4780: 61 63 6b 2d 3e 70 54 61 62 2d 3e 69 44 62 3b 0a  ack->pTab->iDb;.
4790: 20 20 20 20 20 20 20 20 20 20 63 6e 74 54 61 62            cntTab
47a0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 74 20  ++;.          t 
47b0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 1;.        }..
47c0: 20 20 20 20 20 20 20 20 69 66 28 20 74 20 29 7b          if( t ){
47d0: 20 0a 09 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20   ..  int j;.    
47e0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
47f0: 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  b = pTriggerStac
4800: 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  k->pTab;.       
4810: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20     for(j=0; j < 
4820: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
4830: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
4840: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
4850: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  (pTab->aCol[j].z
4860: 4e 61 6d 65 2c 20 7a 52 69 67 68 74 29 3d 3d 30  Name, zRight)==0
4870: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4880: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
4890: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
48a0: 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d  olumn = j==pTab-
48b0: 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b  >iPKey ? -1 : j;
48c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
48d0: 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d  Expr->dataType =
48e0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 73   pTab->aCol[j].s
48f0: 6f 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49 54  ortOrder & SQLIT
4900: 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 3b 0a 20  E_SO_TYPEMASK;. 
4910: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4920: 20 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20         }..}.    
4930: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 63    }..      if( c
4940: 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d  nt==0 && cntTab=
4950: 3d 31 20 26 26 20 73 71 6c 69 74 65 49 73 52 6f  =1 && sqliteIsRo
4960: 77 69 64 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  wid(zRight) ){. 
4970: 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a         cnt = 1;.
4980: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
4990: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
49a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61       pExpr->data
49b0: 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f  Type = SQLITE_SO
49c0: 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _NUM;.      }.  
49d0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
49e0: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
49f0: 65 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20  eFree(zLeft);.  
4a00: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4a10: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66  Right);.      if
4a20: 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( cnt==0 ){.    
4a30: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
4a40: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
4a50: 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 54 2e 25  uch column: %T.%
4a60: 54 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  T",.            
4a70: 20 20 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e     &pLeft->token
4a80: 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
4a90: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
4aa0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
4ab0: 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a 20 20   if( cnt>1 ){.  
4ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
4ad0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6d  rMsg(pParse, "am
4ae0: 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e  biguous column n
4af0: 61 6d 65 3a 20 25 54 2e 25 54 22 2c 0a 20 20 20  ame: %T.%T",.   
4b00: 20 20 20 20 20 20 20 26 70 4c 65 66 74 2d 3e 74         &pLeft->t
4b10: 6f 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e 74  oken, &pRight->t
4b20: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 72  oken);.        r
4b30: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
4b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
4b50: 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70  rDelete(pExpr->p
4b60: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 45 78  Left);.      pEx
4b70: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr->pLeft = 0;. 
4b80: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
4b90: 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69  elete(pExpr->pRi
4ba0: 67 68 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ght);.      pExp
4bb0: 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20  r->pRight = 0;. 
4bc0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
4bd0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
4be0: 20 20 73 71 6c 69 74 65 41 75 74 68 52 65 61 64    sqliteAuthRead
4bf0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
4c00: 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 20  pTabList);.     
4c10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4c20: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
4c30: 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d  .      Vdbe *v =
4c40: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
4c50: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
4c60: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
4c70: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  1;.      if( sql
4c80: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
4c90: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
4ca0: 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70  st, pEList, pExp
4cb0: 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  r->pLeft) ){.   
4cc0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4cd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4ce0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
4cf0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
4d00: 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
4d10: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
4d20: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
4d30: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
4d40: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
4d50: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
4d60: 65 6c 65 63 74 20 69 6e 74 6f 20 61 20 74 65 6d  elect into a tem
4d70: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
4d80: 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 75  * table.  The cu
4d90: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
4da0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
4db0: 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  le has already. 
4dc0: 20 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 70         ** been p
4dd0: 75 74 20 69 6e 20 69 54 61 62 6c 65 20 62 79 20  ut in iTable by 
4de0: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
4df0: 65 49 6e 53 65 6c 65 63 74 28 29 2e 0a 20 20 20  eInSelect()..   
4e00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
4e10: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
4e20: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
4e30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4e40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
4e50: 65 6e 54 65 6d 70 2c 20 70 45 78 70 72 2d 3e 69  enTemp, pExpr->i
4e60: 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20  Table, 1);.     
4e70: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28     sqliteSelect(
4e80: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
4e90: 53 65 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c  Select, SRT_Set,
4ea0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
4eb0: 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  0,0,0);.      }e
4ec0: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
4ed0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
4ee0: 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65  /* Case 2:     e
4ef0: 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
4f00: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
4f10: 20 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61       ** Create a
4f20: 20 73 65 74 20 74 6f 20 70 75 74 20 74 68 65 20   set to put the 
4f30: 65 78 70 72 6c 69 73 74 20 76 61 6c 75 65 73 20  exprlist values 
4f40: 69 6e 2e 20 20 54 68 65 20 53 65 74 20 69 64 20  in.  The Set id 
4f50: 69 73 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20  is stored.      
4f60: 20 20 2a 2a 20 69 6e 20 69 54 61 62 6c 65 2e 0a    ** in iTable..
4f70: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
4f80: 20 20 20 69 6e 74 20 69 2c 20 69 53 65 74 3b 0a     int i, iSet;.
4f90: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
4fa0: 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   i<pExpr->pList-
4fb0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4fc0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
4fd0: 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  2 = pExpr->pList
4fe0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
4ff0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
5000: 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  iteExprIsConstan
5010: 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
5020: 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
5030: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
5040: 20 20 20 20 20 20 20 20 20 20 20 22 72 69 67 68             "righ
5050: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49  t-hand side of I
5060: 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20  N operator must 
5070: 62 65 20 63 6f 6e 73 74 61 6e 74 22 29 3b 0a 20  be constant");. 
5080: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
5090: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 1;.          }
50a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
50b0: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
50c0: 50 61 72 73 65 2c 20 70 45 32 2c 20 30 2c 20 30  Parse, pE2, 0, 0
50d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
50e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
50f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
5100: 0a 20 20 20 20 20 20 20 20 69 53 65 74 20 3d 20  .        iSet = 
5110: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
5120: 70 50 61 72 73 65 2d 3e 6e 53 65 74 2b 2b 3b 0a  pParse->nSet++;.
5130: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
5140: 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   i<pExpr->pList-
5150: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
5160: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
5170: 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  2 = pExpr->pList
5180: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
5190: 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
51a0: 70 45 32 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  pE2->op ){.     
51b0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 46         case TK_F
51c0: 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20 20 20 20  LOAT:.          
51d0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
51e0: 52 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  R:.            c
51f0: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
5200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
5210: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
5220: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5230: 53 65 74 49 6e 73 65 72 74 2c 20 69 53 65 74 2c  SetInsert, iSet,
5240: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
5250: 20 20 20 61 73 73 65 72 74 28 20 70 45 32 2d 3e     assert( pE2->
5260: 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20  token.z );.     
5270: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
5280: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
5290: 64 64 72 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e  ddr, pE2->token.
52a0: 7a 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e 6e 29  z, pE2->token.n)
52b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
52c0: 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74  sqliteVdbeDequot
52d0: 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  eP3(v, addr);.  
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
52f0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
5300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66  .            def
5310: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
5320: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5330: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32  Code(pParse, pE2
5340: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
5350: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5360: 28 76 2c 20 4f 50 5f 53 65 74 49 6e 73 65 72 74  (v, OP_SetInsert
5370: 2c 20 69 53 65 74 2c 20 30 29 3b 0a 20 20 20 20  , iSet, 0);.    
5380: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
53a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
53b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
53c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
53d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
53e0: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
53f0: 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  This has to be a
5400: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
5410: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
5420: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
5430: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
5440: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
5450: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
5460: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
5470: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
5480: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
5490: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  olumn..      */.
54a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
54b0: 6c 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  lumn = pParse->n
54c0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Mem++;.      if(
54d0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
54e0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
54f0: 6c 65 63 74 2c 20 53 52 54 5f 4d 65 6d 2c 20 70  lect, SRT_Mem, p
5500: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 30 2c  Expr->iColumn,0,
5510: 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  0,0) ){.        
5520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
5530: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5540: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72     }..    /* For
5550: 20 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20   all else, just 
5560: 72 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b  recursively walk
5570: 20 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 20   the tree */.   
5580: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5590: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
55a0: 66 74 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69  ft.      && sqli
55b0: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
55c0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
55d0: 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72  t, pEList, pExpr
55e0: 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  ->pLeft) ){.    
55f0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
5600: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5610: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 0a 20  pExpr->pRight . 
5620: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 45 78       && sqliteEx
5630: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
5640: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
5650: 45 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 52  EList, pExpr->pR
5660: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ight) ){.       
5670: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
5680: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
5690: 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pr->pList ){.   
56a0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
56b0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
56c0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
56d0: 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  st;.        for(
56e0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
56f0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
5700: 20 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20       Expr *pArg 
5710: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
5720: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
5730: 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
5740: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
5750: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
5760: 2c 20 70 41 72 67 29 20 29 7b 0a 20 20 20 20 20  , pArg) ){.     
5770: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
5780: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
57a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
57b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  n 0;.}../*.** pE
57c0: 78 70 72 20 69 73 20 61 20 6e 6f 64 65 20 74 68  xpr is a node th
57d0: 61 74 20 64 65 66 69 6e 65 73 20 61 20 66 75 6e  at defines a fun
57e0: 63 74 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69  ction of some ki
57f0: 6e 64 2e 20 20 49 74 20 6d 69 67 68 74 0a 2a 2a  nd.  It might.**
5800: 20 62 65 20 61 20 73 79 6e 74 61 63 74 69 63 20   be a syntactic 
5810: 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65 20 22 63  function like "c
5820: 6f 75 6e 74 28 78 29 22 20 6f 72 20 69 74 20 6d  ount(x)" or it m
5830: 69 67 68 74 20 62 65 20 61 20 66 75 6e 63 74 69  ight be a functi
5840: 6f 6e 0a 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65  on.** that imple
5850: 6d 65 6e 74 73 20 61 6e 20 6f 70 65 72 61 74 6f  ments an operato
5860: 72 2c 20 6c 69 6b 65 20 22 61 20 4c 49 4b 45 20  r, like "a LIKE 
5870: 62 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  b".  .**.** This
5880: 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 2a   routine makes *
5890: 70 7a 4e 61 6d 65 20 70 6f 69 6e 74 20 74 6f 20  pzName point to 
58a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
58b0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 0a 2a 2a  function and .**
58c0: 20 2a 70 6e 4e 61 6d 65 20 68 6f 6c 64 20 74 68   *pnName hold th
58d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
58e0: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 66 75  acters in the fu
58f0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  nction name..*/.
5900: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 46  static void getF
5910: 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 45 78 70 72  unctionName(Expr
5920: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
5930: 68 61 72 20 2a 2a 70 7a 4e 61 6d 65 2c 20 69 6e  har **pzName, in
5940: 74 20 2a 70 6e 4e 61 6d 65 29 7b 0a 20 20 73 77  t *pnName){.  sw
5950: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
5960: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  ){.    case TK_F
5970: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
5980: 20 2a 70 7a 4e 61 6d 65 20 3d 20 70 45 78 70 72   *pzName = pExpr
5990: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  ->token.z;.     
59a0: 20 2a 70 6e 4e 61 6d 65 20 3d 20 70 45 78 70 72   *pnName = pExpr
59b0: 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20  ->token.n;.     
59c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
59d0: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 20    case TK_LIKE: 
59e0: 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20  {.      *pzName 
59f0: 3d 20 22 6c 69 6b 65 22 3b 0a 20 20 20 20 20 20  = "like";.      
5a00: 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20 20 20  *pnName = 4;.   
5a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5a20: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42      case TK_GLOB
5a30: 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d  : {.      *pzNam
5a40: 65 20 3d 20 22 67 6c 6f 62 22 3b 0a 20 20 20 20  e = "glob";.    
5a50: 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20    *pnName = 4;. 
5a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5a70: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
5a80: 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d  .      *pzName =
5a90: 20 22 63 61 6e 27 74 20 68 61 70 70 65 6e 22 3b   "can't happen";
5aa0: 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d  .      *pnName =
5ab0: 20 31 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   12;.      break
5ac0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
5ad0: 2a 0a 2a 2a 20 45 72 72 6f 72 20 63 68 65 63 6b  *.** Error check
5ae0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 69   the functions i
5af0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n an expression.
5b00: 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 0a    Make sure all.
5b10: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ** function name
5b20: 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64  s are recognized
5b30: 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f   and all functio
5b40: 6e 73 20 68 61 76 65 20 74 68 65 20 63 6f 72 72  ns have the corr
5b50: 65 63 74 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  ect.** number of
5b60: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61   arguments.  Lea
5b70: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
5b80: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
5b90: 45 72 72 4d 73 67 0a 2a 2a 20 69 66 20 61 6e 79  ErrMsg.** if any
5ba0: 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20  thing is amiss. 
5bb0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
5bc0: 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
5bd0: 0a 2a 2a 20 69 66 20 70 49 73 41 67 67 20 69 73  .** if pIsAgg is
5be0: 20 6e 6f 74 20 6e 75 6c 6c 20 61 6e 64 20 74 68   not null and th
5bf0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
5c00: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75   an aggregate fu
5c10: 6e 63 74 69 6f 6e 0a 2a 2a 20 28 6c 69 6b 65 20  nction.** (like 
5c20: 63 6f 75 6e 74 28 2a 29 20 6f 72 20 6d 61 78 28  count(*) or max(
5c30: 76 61 6c 75 65 29 29 20 74 68 65 6e 20 77 72 69  value)) then wri
5c40: 74 65 20 61 20 31 20 69 6e 74 6f 20 2a 70 49 73  te a 1 into *pIs
5c50: 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Agg..*/.int sqli
5c60: 74 65 45 78 70 72 43 68 65 63 6b 28 50 61 72 73  teExprCheck(Pars
5c70: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
5c80: 2a 70 45 78 70 72 2c 20 69 6e 74 20 61 6c 6c 6f  *pExpr, int allo
5c90: 77 41 67 67 2c 20 69 6e 74 20 2a 70 49 73 41 67  wAgg, int *pIsAg
5ca0: 67 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  g){.  int nErr =
5cb0: 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d   0;.  if( pExpr=
5cc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
5cd0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
5ce0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
5cf0: 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65  K_GLOB:.    case
5d00: 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63 61   TK_LIKE:.    ca
5d10: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
5d20: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
5d30: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70  pExpr->pList ? p
5d40: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
5d50: 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  pr : 0;  /* Numb
5d60: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
5d70: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f  */.      int no_
5d80: 73 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20 20  such_func = 0;  
5d90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5da0: 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e  no such function
5db0: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20   exists */.     
5dc0: 20 69 6e 74 20 69 73 5f 74 79 70 65 5f 6f 66 20   int is_type_of 
5dd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
5de0: 54 72 75 65 20 69 66 20 69 73 20 74 68 65 20 73  True if is the s
5df0: 70 65 63 69 61 6c 20 54 79 70 65 4f 66 28 29 20  pecial TypeOf() 
5e00: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
5e10: 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f    int wrong_num_
5e20: 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a  args = 0;     /*
5e30: 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67 20 6e   True if wrong n
5e40: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
5e50: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
5e60: 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20 20 20  is_agg = 0;     
5e70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5e80: 69 66 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  if is an aggrega
5e90: 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  te function */. 
5ea0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
5eb0: 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20    int nId;      
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ed0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
5ee0: 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f  cters in functio
5ef0: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
5f00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5f20: 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
5f30: 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  . */.      FuncD
5f40: 65 66 20 2a 70 44 65 66 3b 0a 0a 20 20 20 20 20  ef *pDef;..     
5f50: 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65   getFunctionName
5f60: 28 70 45 78 70 72 2c 20 26 7a 49 64 2c 20 26 6e  (pExpr, &zId, &n
5f70: 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20  Id);.      pDef 
5f80: 3d 20 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63  = sqliteFindFunc
5f90: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
5fa0: 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 30 29   zId, nId, n, 0)
5fb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
5fc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
5fd0: 44 65 66 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Def = sqliteFind
5fe0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
5ff0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d  >db, zId, nId, -
6000: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  1, 0);.        i
6010: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
6020: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 31          if( n==1
6030: 20 26 26 20 6e 49 64 3d 3d 36 20 26 26 20 73 71   && nId==6 && sq
6040: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 7a 49 64  liteStrNICmp(zId
6050: 2c 20 22 74 79 70 65 6f 66 22 2c 20 36 29 3d 3d  , "typeof", 6)==
6060: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6070: 20 69 73 5f 74 79 70 65 5f 6f 66 20 3d 20 31 3b   is_type_of = 1;
6080: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6090: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e   {.            n
60a0: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b  o_such_func = 1;
60b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
60c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
60d0: 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f        wrong_num_
60e0: 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  args = 1;.      
60f0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
6100: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
6110: 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30  = pDef->xFunc==0
6120: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6130: 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 61  if( is_agg && !a
6140: 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20  llowAgg ){.     
6150: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
6160: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
6170: 72 4d 73 67 2c 20 22 6d 69 73 75 73 65 20 6f 66  rMsg, "misuse of
6180: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
6190: 69 6f 6e 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20  ion ", -1,.     
61a0: 20 20 20 20 20 20 7a 49 64 2c 20 6e 49 64 2c 20        zId, nId, 
61b0: 22 28 29 22 2c 20 32 2c 20 30 29 3b 0a 20 20 20  "()", 2, 0);.   
61c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
61d0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72  r++;.        nEr
61e0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f  r++;.        is_
61f0: 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  agg = 0;.      }
6200: 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68  else if( no_such
6210: 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  _func ){.       
6220: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
6230: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
6240: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e  sg, "no such fun
6250: 63 74 69 6f 6e 3a 20 22 2c 20 2d 31 2c 20 7a 49  ction: ", -1, zI
6260: 64 2c 6e 49 64 2c 30 29 3b 0a 20 20 20 20 20 20  d,nId,0);.      
6270: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6280: 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b  ;.        nErr++
6290: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
62a0: 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73  ( wrong_num_args
62b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
62c0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
62d0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a  arse->zErrMsg, .
62e0: 20 20 20 20 20 20 20 20 20 20 20 22 77 72 6f 6e             "wron
62f0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
6300: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
6310: 6e 20 22 2c 20 2d 31 2c 20 7a 49 64 2c 20 6e 49  n ", -1, zId, nI
6320: 64 2c 20 22 28 29 22 2c 20 32 2c 20 30 29 3b 0a  d, "()", 2, 0);.
6330: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
6340: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
6350: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nErr++;.      }.
6360: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
6370: 20 29 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54   ) pExpr->op = T
6380: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a  K_AGG_FUNCTION;.
6390: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
63a0: 20 26 26 20 70 49 73 41 67 67 20 29 20 2a 70 49   && pIsAgg ) *pI
63b0: 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
63c0: 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30  for(i=0; nErr==0
63d0: 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20   && i<n; i++){. 
63e0: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
63f0: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
6400: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69  arse, pExpr->pLi
6410: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 0a  st->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 20 61                 a
6440: 6c 6c 6f 77 41 67 67 20 26 26 20 21 69 73 5f 61  llowAgg && !is_a
6450: 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20  gg, pIsAgg);.   
6460: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
6470: 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Def==0 ){.      
6480: 20 20 69 66 28 20 69 73 5f 74 79 70 65 5f 6f 66    if( is_type_of
6490: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
64a0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54 52  xpr->op = TK_STR
64b0: 49 4e 47 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ING;.          i
64c0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 54 79 70  f( sqliteExprTyp
64d0: 65 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  e(pExpr->pList->
64e0: 61 5b 30 5d 2e 70 45 78 70 72 29 3d 3d 53 51 4c  a[0].pExpr)==SQL
64f0: 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20  ITE_SO_NUM ){.  
6500: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6510: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22 6e 75 6d 65  >token.z = "nume
6520: 72 69 63 22 3b 0a 20 20 20 20 20 20 20 20 20 20  ric";.          
6530: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e    pExpr->token.n
6540: 20 3d 20 37 3b 0a 20 20 20 20 20 20 20 20 20 20   = 7;.          
6550: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6560: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
6570: 7a 20 3d 20 22 74 65 78 74 22 3b 0a 20 20 20 20  z = "text";.    
6580: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
6590: 6f 6b 65 6e 2e 6e 20 3d 20 34 3b 0a 20 20 20 20  oken.n = 4;.    
65a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
65b0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
65c0: 28 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65  ( pDef->dataType
65d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
65e0: 66 28 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70  f( pDef->dataTyp
65f0: 65 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e<n ){.         
6600: 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65   pExpr->dataType
6610: 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
6620: 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28   sqliteExprType(
6630: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
6640: 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65 5d 2e  pDef->dataType].
6650: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
6660: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6670: 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65   pExpr->dataType
6680: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d   = SQLITE_SO_NUM
6690: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
66a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 66    }else if( pDef
66b0: 2d 3e 64 61 74 61 54 79 70 65 3d 3d 53 51 4c 49  ->dataType==SQLI
66c0: 54 45 5f 41 52 47 53 20 29 7b 0a 20 20 20 20 20  TE_ARGS ){.     
66d0: 20 20 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70     pDef->dataTyp
66e0: 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45  e = SQLITE_SO_TE
66f0: 58 54 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  XT;.        for(
6700: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
6710: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
6720: 6c 69 74 65 45 78 70 72 54 79 70 65 28 70 45 78  liteExprType(pEx
6730: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pr->pList->a[i].
6740: 70 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53  pExpr)==SQLITE_S
6750: 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  O_NUM ){.       
6760: 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61       pExpr->data
6770: 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f  Type = SQLITE_SO
6780: 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  _NUM;.          
6790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
67a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
67b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
67c0: 44 65 66 2d 3e 64 61 74 61 54 79 70 65 3d 3d 53  Def->dataType==S
67d0: 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 20 29 7b  QLITE_NUMERIC ){
67e0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
67f0: 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c 49 54  dataType = SQLIT
6800: 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20  E_SO_NUM;.      
6810: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
6820: 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d  Expr->dataType =
6830: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b   SQLITE_SO_TEXT;
6840: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6850: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
6860: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
6870: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
6880: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70  nErr = sqliteExp
6890: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
68a0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 6c 6c  Expr->pLeft, all
68b0: 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a  owAgg, pIsAgg);.
68c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
68d0: 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78  ( nErr==0 && pEx
68e0: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
68f0: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
6900: 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61  iteExprCheck(pPa
6910: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
6920: 68 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49  ht, allowAgg, pI
6930: 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sAgg);.      }. 
6940: 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30       if( nErr==0
6950: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   && pExpr->pList
6960: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
6970: 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  n = pExpr->pList
6980: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
6990: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
69a0: 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30  for(i=0; nErr==0
69b0: 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20   && i<n; i++){. 
69c0: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
69d0: 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  E2 = pExpr->pLis
69e0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
69f0: 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20           nErr = 
6a00: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
6a10: 70 50 61 72 73 65 2c 20 70 45 32 2c 20 61 6c 6c  pParse, pE2, all
6a20: 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a  owAgg, pIsAgg);.
6a30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6a40: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6a50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6a60: 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nErr;.}../*.**
6a70: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
6a80: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 6f 72 20  QLITE_SO_NUM or 
6a90: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 74  SQLITE_SO_TEXT t
6aa0: 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 74 68  o indicate wheth
6ab0: 65 72 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20  er the.** given 
6ac0: 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c  expression shoul
6ad0: 64 20 73 6f 72 74 20 61 73 20 6e 75 6d 65 72 69  d sort as numeri
6ae0: 63 20 76 61 6c 75 65 73 20 6f 72 20 61 73 20 74  c values or as t
6af0: 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ext..**.** The s
6b00: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
6b10: 49 64 73 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Ids() and sqlite
6b20: 45 78 70 72 43 68 65 63 6b 28 29 20 72 6f 75 74  ExprCheck() rout
6b30: 69 6e 65 73 20 6d 75 73 74 20 68 61 76 65 0a 2a  ines must have.*
6b40: 2a 20 62 6f 74 68 20 62 65 65 6e 20 63 61 6c 6c  * both been call
6b50: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
6b60: 73 69 6f 6e 20 62 65 66 6f 72 65 20 69 74 20 69  sion before it i
6b70: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
6b80: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
6b90: 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28   sqliteExprType(
6ba0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
6bb0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
6bc0: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 77  LITE_SO_NUM;.  w
6bd0: 68 69 6c 65 28 20 70 20 29 20 73 77 69 74 63 68  hile( p ) switch
6be0: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
6bf0: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
6c00: 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
6c10: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
6c20: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  :.    case TK_SL
6c30: 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASH:.    case TK
6c40: 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
6c50: 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
6c60: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
6c70: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a 20  se TK_NOTNULL:. 
6c80: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a     case TK_NOT:.
6c90: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
6ca0: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
6cb0: 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  UPLUS:.    case 
6cc0: 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
6cd0: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
6ce0: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
6cf0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
6d00: 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
6d10: 4b 5f 52 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_RSHIFT:.    ca
6d20: 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63  se TK_REM:.    c
6d30: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
6d40: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
6d50: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  T:.    case TK_I
6d60: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  N:.    case TK_B
6d70: 45 54 57 45 45 4e 3a 0a 20 20 20 20 63 61 73 65  ETWEEN:.    case
6d80: 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61   TK_GLOB:.    ca
6d90: 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20  se TK_LIKE:.    
6da0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6db0: 53 4f 5f 4e 55 4d 3b 0a 0a 20 20 20 20 63 61 73  SO_NUM;..    cas
6dc0: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
6dd0: 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20   case TK_NULL:. 
6de0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
6df0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  T:.    case TK_V
6e00: 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 72  ARIABLE:.      r
6e10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
6e20: 54 45 58 54 3b 0a 0a 20 20 20 20 63 61 73 65 20  TEXT;..    case 
6e30: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
6e40: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
6e50: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
6e60: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
6e70: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
6e80: 54 4b 5f 45 51 3a 0a 20 20 20 20 20 20 69 66 28  TK_EQ:.      if(
6e90: 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28   sqliteExprType(
6ea0: 70 2d 3e 70 4c 65 66 74 29 3d 3d 53 51 4c 49 54  p->pLeft)==SQLIT
6eb0: 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20  E_SO_NUM ){.    
6ec0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6ed0: 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20  E_SO_NUM;.      
6ee0: 7d 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70  }.      p = p->p
6ef0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 62 72 65  Right;.      bre
6f00: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  ak;..    case TK
6f10: 5f 41 53 3a 0a 20 20 20 20 20 20 70 20 3d 20 70  _AS:.      p = p
6f20: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 62  ->pLeft;.      b
6f30: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
6f40: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
6f50: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
6f60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
6f70: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
6f80: 20 72 65 74 75 72 6e 20 70 2d 3e 64 61 74 61 54   return p->dataT
6f90: 79 70 65 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  ype;..    case T
6fa0: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 20 20  K_SELECT:.      
6fb0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65 6c 65  assert( p->pSele
6fc0: 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ct );.      asse
6fd0: 72 74 28 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e  rt( p->pSelect->
6fe0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
6ff0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65 6c 65  assert( p->pSele
7000: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
7010: 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 20 3d  r>0 );.      p =
7020: 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c   p->pSelect->pEL
7030: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
7040: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
7050: 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a     case TK_CASE:
7060: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
7070: 70 52 69 67 68 74 20 26 26 20 73 71 6c 69 74 65  pRight && sqlite
7080: 45 78 70 72 54 79 70 65 28 70 2d 3e 70 52 69 67  ExprType(p->pRig
7090: 68 74 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e  ht)==SQLITE_SO_N
70a0: 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  UM ){.        re
70b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e  turn SQLITE_SO_N
70c0: 55 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  UM;.      }.    
70d0: 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29    if( p->pList )
70e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
70f0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
7100: 74 20 2a 70 4c 69 73 74 20 3d 20 70 2d 3e 70 4c  t *pList = p->pL
7110: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
7120: 28 69 3d 31 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=1; i<pList->n
7130: 45 78 70 72 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  Expr; i+=2){.   
7140: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
7150: 65 45 78 70 72 54 79 70 65 28 70 4c 69 73 74 2d  eExprType(pList-
7160: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3d 3d 53 51  >a[i].pExpr)==SQ
7170: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20  LITE_SO_NUM ){. 
7180: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
7190: 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b  n SQLITE_SO_NUM;
71a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
71b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
71c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
71d0: 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20  TE_SO_TEXT;.    
71e0: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  }..    default:.
71f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
7200: 3e 6f 70 3d 3d 54 4b 5f 41 42 4f 52 54 20 29 3b  >op==TK_ABORT );
7210: 20 20 2f 2a 20 43 61 6e 27 74 20 48 61 70 70 65    /* Can't Happe
7220: 6e 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  n */.      break
7230: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
7240: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 7d 0a  QLITE_SO_NUM;.}.
7250: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
7260: 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
7270: 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
7280: 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
7290: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
72a0: 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65 73  nd leave the res
72b0: 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  ult on the top o
72c0: 66 20 73 74 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  f stack..*/.void
72d0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
72e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
72f0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56  xpr *pExpr){.  V
7300: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
7310: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
7320: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
7330: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
7340: 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  n;.  switch( pEx
7350: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
7360: 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 20  se TK_PLUS:     
7370: 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20 20 20 20  op = OP_Add;    
7380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7390: 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 20 6f  e TK_MINUS:    o
73a0: 70 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74 3b  p = OP_Subtract;
73b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
73c0: 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 20 6f 70   TK_STAR:     op
73d0: 20 3d 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3b 20   = OP_Multiply; 
73e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
73f0: 54 4b 5f 53 4c 41 53 48 3a 20 20 20 20 6f 70 20  TK_SLASH:    op 
7400: 3d 20 4f 50 5f 44 69 76 69 64 65 3b 20 20 20 62  = OP_Divide;   b
7410: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
7420: 4b 5f 41 4e 44 3a 20 20 20 20 20 20 6f 70 20 3d  K_AND:      op =
7430: 20 4f 50 5f 41 6e 64 3b 20 20 20 20 20 20 62 72   OP_And;      br
7440: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7450: 5f 4f 52 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _OR:       op = 
7460: 4f 50 5f 4f 72 3b 20 20 20 20 20 20 20 62 72 65  OP_Or;       bre
7470: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7480: 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LT:       op = O
7490: 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65 61  P_Lt;       brea
74a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
74b0: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
74c0: 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Le;       break
74d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
74e0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
74f0: 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Gt;       break;
7500: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
7510: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47         op = OP_G
7520: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
7530: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
7540: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65        op = OP_Ne
7550: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
7560: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
7570: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b       op = OP_Eq;
7580: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7590: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
75a0: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75  :   op = OP_IsNu
75b0: 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ll;   break;.   
75c0: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
75d0: 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75  :  op = OP_NotNu
75e0: 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ll;  break;.    
75f0: 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20  case TK_NOT:    
7600: 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 3b 20 20    op = OP_Not;  
7610: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
7620: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20  ase TK_UMINUS:  
7630: 20 6f 70 20 3d 20 4f 50 5f 4e 65 67 61 74 69 76   op = OP_Negativ
7640: 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  e; break;.    ca
7650: 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 20  se TK_BITAND:   
7660: 6f 70 20 3d 20 4f 50 5f 42 69 74 41 6e 64 3b 20  op = OP_BitAnd; 
7670: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7680: 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 20 6f  e TK_BITOR:    o
7690: 70 20 3d 20 4f 50 5f 42 69 74 4f 72 3b 20 20 20  p = OP_BitOr;   
76a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
76b0: 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 20 6f 70   TK_BITNOT:   op
76c0: 20 3d 20 4f 50 5f 42 69 74 4e 6f 74 3b 20 20 20   = OP_BitNot;   
76d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
76e0: 54 4b 5f 4c 53 48 49 46 54 3a 20 20 20 6f 70 20  TK_LSHIFT:   op 
76f0: 3d 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3b 20  = OP_ShiftLeft; 
7700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7710: 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 20 6f 70   TK_RSHIFT:   op
7720: 20 3d 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74   = OP_ShiftRight
7730: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
7740: 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 20 6f  e TK_REM:      o
7750: 70 20 3d 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72  p = OP_Remainder
7760: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  ;  break;.    de
7770: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
7780: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  }.  switch( pExp
7790: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
77a0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
77b0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
77c0: 3e 75 73 65 41 67 67 20 29 7b 0a 20 20 20 20 20  >useAgg ){.     
77d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
77e0: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c  Op(v, OP_AggGet,
77f0: 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29   0, pExpr->iAgg)
7800: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7810: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
7820: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  >=0 ){.        s
7830: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7840: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78  , OP_Column, pEx
7850: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70  pr->iTable, pExp
7860: 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
7870: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7880: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7890: 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 70  p(v, OP_Recno, p
78a0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29  Expr->iTable, 0)
78b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
78c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
78d0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
78e0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56  : {.      int iV
78f0: 61 6c 20 3d 20 61 74 6f 69 28 70 45 78 70 72 2d  al = atoi(pExpr-
7900: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20  >token.z);.     
7910: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
7920: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42        sprintf(zB
7930: 75 66 2c 22 25 64 22 2c 69 56 61 6c 29 3b 0a 20  uf,"%d",iVal);. 
7940: 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28       if( strlen(
7950: 7a 42 75 66 29 21 3d 70 45 78 70 72 2d 3e 74 6f  zBuf)!=pExpr->to
7960: 6b 65 6e 2e 6e 20 0a 20 20 20 20 20 20 20 20 20  ken.n .         
7970: 20 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 70 45     || strncmp(pE
7980: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 7a 42 75  xpr->token.z,zBu
7990: 66 2c 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  f,pExpr->token.n
79a0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
79b0: 2f 2a 20 49 66 20 74 68 65 20 69 6e 74 65 67 65  /* If the intege
79c0: 72 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  r value cannot b
79d0: 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 65 78  e represented ex
79e0: 61 63 74 6c 79 20 69 6e 20 33 32 20 62 69 74 73  actly in 32 bits
79f0: 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
7a00: 6e 20 63 6f 64 65 20 69 74 20 61 73 20 61 20 73  n code it as a s
7a10: 74 72 69 6e 67 20 69 6e 73 74 65 61 64 2e 20 2a  tring instead. *
7a20: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
7a30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7a40: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
7a50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7a60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7a70: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
7a80: 72 2c 20 69 56 61 6c 2c 20 30 29 3b 0a 20 20 20  r, iVal, 0);.   
7a90: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7aa0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7ab0: 20 2d 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65   -1, pExpr->toke
7ac0: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
7ad0: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  n.n);.      brea
7ae0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7af0: 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
7b00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7b10: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
7b20: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  , 0, 0);.      a
7b30: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f  ssert( pExpr->to
7b40: 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 73  ken.z );.      s
7b50: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
7b60: 33 28 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e  3(v, -1, pExpr->
7b70: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
7b80: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
7b90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7ba0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
7bb0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
7bc0: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
7bd0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
7be0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  , 0, 0);.      a
7bf0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f  ssert( pExpr->to
7c00: 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 73  ken.z );.      s
7c10: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
7c20: 33 28 76 2c 20 61 64 64 72 2c 20 70 45 78 70 72  3(v, addr, pExpr
7c30: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
7c40: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
7c50: 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75    sqliteVdbeDequ
7c60: 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a  oteP3(v, addr);.
7c70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7c80: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
7c90: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
7ca0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7cb0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
7cc0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7cd0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7ce0: 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
7cf0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7d00: 4f 70 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c  Op(v, OP_Variabl
7d10: 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e, pExpr->iTable
7d20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
7d30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7d40: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
7d50: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
7d60: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
7d70: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
7d80: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
7d90: 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
7da0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
7db0: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
7dc0: 26 26 20 73 71 6c 69 74 65 45 78 70 72 54 79 70  && sqliteExprTyp
7dd0: 65 28 70 45 78 70 72 29 3d 3d 53 51 4c 49 54 45  e(pExpr)==SQLITE
7de0: 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  _SO_TEXT ){.    
7df0: 20 20 20 20 6f 70 20 2b 3d 20 36 3b 20 20 2f 2a      op += 6;  /*
7e00: 20 43 6f 6e 76 65 72 74 20 6e 75 6d 65 72 69 63   Convert numeric
7e10: 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 65 78 74   opcodes to text
7e20: 20 6f 70 63 6f 64 65 73 20 2a 2f 0a 20 20 20 20   opcodes */.    
7e30: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
7e40: 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74  l through into t
7e50: 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a  he next case */.
7e60: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
7e70: 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
7e80: 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  TK_OR:.    case 
7e90: 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
7ea0: 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63  e TK_STAR:.    c
7eb0: 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
7ec0: 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20    case TK_REM:. 
7ed0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
7ee0: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  D:.    case TK_B
7ef0: 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  ITOR:.    case T
7f00: 4b 5f 53 4c 41 53 48 3a 20 7b 0a 20 20 20 20 20  K_SLASH: {.     
7f10: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
7f20: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
7f30: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
7f40: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
7f50: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
7f60: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
7f70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
7f80: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
7f90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7fa0: 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
7fb0: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
7fc0: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
7fd0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
7fe0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
7ff0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
8000: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
8010: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
8020: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8030: 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29  dOp(v, op, 0, 0)
8040: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8050: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
8060: 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
8070: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
8080: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
8090: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
80a0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
80b0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
80c0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
80d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
80e0: 43 6f 6e 63 61 74 2c 20 32 2c 20 30 29 3b 0a 20  Concat, 2, 0);. 
80f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8100: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
8110: 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  LUS: {.      Exp
8120: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
8130: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 69  ->pLeft;.      i
8140: 66 28 20 70 4c 65 66 74 20 26 26 20 70 4c 65 66  f( pLeft && pLef
8150: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
8160: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  R ){.        sql
8170: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8180: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 61 74 6f 69  OP_Integer, atoi
8190: 28 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 29  (pLeft->token.z)
81a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
81b0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
81c0: 28 76 2c 20 2d 31 2c 20 70 4c 65 66 74 2d 3e 74  (v, -1, pLeft->t
81d0: 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74  oken.z, pLeft->t
81e0: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  oken.n);.      }
81f0: 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20 26  else if( pLeft &
8200: 26 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  & pLeft->op==TK_
8210: 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
8220: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8230: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
8240: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
8250: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
8260: 28 76 2c 20 2d 31 2c 20 70 4c 65 66 74 2d 3e 74  (v, -1, pLeft->t
8270: 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74  oken.z, pLeft->t
8280: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  oken.n);.      }
8290: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
82a0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
82b0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
82c0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
82d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
82e0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
82f0: 53 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  S: {.      asser
8300: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
8310: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
8320: 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
8330: 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 45 78 70 72  K_FLOAT || pExpr
8340: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
8350: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
8360: 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70     Token *p = &p
8370: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  Expr->pLeft->tok
8380: 65 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  en;.        char
8390: 20 2a 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c   *z = sqliteMall
83a0: 6f 63 28 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a  oc( p->n + 2 );.
83b0: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
83c0: 7a 2c 20 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e  z, "-%.*s", p->n
83d0: 2c 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  , p->z);.       
83e0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
83f0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
8400: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  R ){.          s
8410: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8420: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 61 74  , OP_Integer, at
8430: 6f 69 28 7a 29 2c 20 30 29 3b 0a 20 20 20 20 20  oi(z), 0);.     
8440: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8450: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8460: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
8470: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
8480: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
8490: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
84a0: 20 2d 31 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b   -1, z, p->n+1);
84b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
84c0: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  ree(z);.        
84d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
84e0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
84f0: 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54  ough into TK_NOT
8500: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
8510: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
8520: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
8530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
8540: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
8550: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8560: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8570: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b  Op(v, op, 0, 0);
8580: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8590: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
85a0: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
85b0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
85c0: 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20       int dest;. 
85d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
85e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
85f0: 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  er, 1, 0);.     
8600: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
8610: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
8620: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73  Left);.      des
8630: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75  t = sqliteVdbeCu
8640: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32  rrentAddr(v) + 2
8650: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8660: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
8670: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
8680: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8690: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c  , OP_AddImm, -1,
86a0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
86b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
86c0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
86d0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
86e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
86f0: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
8700: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 62  ->iAgg);.      b
8710: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8720: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20  case TK_GLOB:.  
8730: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a    case TK_LIKE:.
8740: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
8750: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TION: {.      in
8760: 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  t i;.      ExprL
8770: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
8780: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
8790: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69   int nExpr = pLi
87a0: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
87b0: 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e  r : 0;.      Fun
87c0: 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
87d0: 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20    int nId;.     
87e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
87f0: 3b 0a 20 20 20 20 20 20 67 65 74 46 75 6e 63 74  ;.      getFunct
8800: 69 6f 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20 26  ionName(pExpr, &
8810: 7a 49 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20  zId, &nId);.    
8820: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 46    pDef = sqliteF
8830: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
8840: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
8850: 2c 20 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , nExpr, 0);.   
8860: 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66 21     assert( pDef!
8870: 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
8880: 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
8890: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
88a0: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
88b0: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
88c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
88d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
88e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6e 63 74  ddOp(v, OP_Funct
88f0: 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 30 29 3b 0a  ion, nExpr, 0);.
8900: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8910: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
8920: 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f  (char*)pDef, P3_
8930: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20 20  POINTER);.      
8940: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8950: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
8960: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   {.      sqliteV
8970: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
8980: 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69  emLoad, pExpr->i
8990: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
89a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
89b0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
89c0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
89d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
89e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
89f0: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
8a00: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
8a10: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
8a20: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
8a30: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
8a40: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
8a50: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8a60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e  AddOp(v, OP_NotN
8a70: 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29  ull, -1, addr+4)
8a80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8a90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
8aa0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
8ab0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8ac0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
8ad0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8ae0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8af0: 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b 36  _Goto, 0, addr+6
8b00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
8b10: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
8b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
8b30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75  eAddOp(v, OP_Fou
8b40: 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
8b50: 65 2c 20 61 64 64 72 2b 36 29 3b 0a 20 20 20 20  e, addr+6);.    
8b60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8b70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8b80: 28 76 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64 2c  (v, OP_SetFound,
8b90: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
8ba0: 61 64 64 72 2b 36 29 3b 0a 20 20 20 20 20 20 7d  addr+6);.      }
8bb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8bc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
8bd0: 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20  Imm, -1, 0);.   
8be0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8bf0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
8c00: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EEN: {.      sql
8c10: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
8c20: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
8c30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8c40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
8c50: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
8c60: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
8c70: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
8c80: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
8c90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8ca0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
8cb0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
8cc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8cd0: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
8ce0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
8cf0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
8d00: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
8d10: 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
8d20: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8d30: 28 76 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29  (v, OP_Le, 0, 0)
8d40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8d50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e  beAddOp(v, OP_An
8d60: 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
8d70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8d80: 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20   case TK_AS: {. 
8d90: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
8da0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
8db0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
8dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8dd0: 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20    case TK_CASE: 
8de0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70 72  {.      int expr
8df0: 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20  _end_label;.    
8e00: 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a    int jumpInst;.
8e10: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
8e20: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
8e30: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  .      int i;.. 
8e40: 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
8e50: 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r->pList);.     
8e60: 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e   assert((pExpr->
8e70: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32  pList->nExpr % 2
8e80: 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61  ) == 0);.      a
8e90: 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
8ea0: 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
8eb0: 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
8ec0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
8ed0: 72 3b 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e  r;.      expr_en
8ee0: 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  d_label = sqlite
8ef0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
8f00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
8f10: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
8f20: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
8f30: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
8f40: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
8f50: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
8f60: 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29   i<nExpr; i=i+2)
8f70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8f80: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
8f90: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
8fa0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
8fb0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
8fc0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
8fd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8fe0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20  p(v, OP_Dup, 1, 
8ff0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 75  1);.          ju
9000: 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 56  mpInst = sqliteV
9010: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
9020: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
9030: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9040: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
9050: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
9060: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  lse{.          j
9070: 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65  umpInst = sqlite
9080: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9090: 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  IfNot, 1, 0);.  
90a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
90b0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
90c0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
90d0: 69 73 74 2d 3e 61 5b 69 2b 31 5d 2e 70 45 78 70  ist->a[i+1].pExp
90e0: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
90f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9100: 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f  P_Goto, 0, expr_
9110: 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20  end_label);.    
9120: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
9130: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
9140: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
9150: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 32 28  iteVdbeChangeP2(
9160: 76 2c 20 6a 75 6d 70 49 6e 73 74 2c 20 61 64 64  v, jumpInst, add
9170: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
9180: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
9190: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
91a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
91b0: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
91c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
91d0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
91e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
91f0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
9200: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
9210: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9220: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
9230: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
9240: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
9250: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9260: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
9270: 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62  (v, expr_end_lab
9280: 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  el);.      break
9290: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
92a0: 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
92b0: 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
92c0: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
92d0: 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72       sqliteError
92e0: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9300: 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
9310: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
9320: 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
9330: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
9340: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
9350: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ..return;.      
9360: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
9370: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
9380: 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 09 20 20  _Rollback ||..  
9390: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
93a0: 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 09 20  = OE_Abort ||.. 
93b0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
93c0: 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 7b 0a 09 20  == OE_Fail ){.. 
93d0: 20 63 68 61 72 20 2a 20 6d 73 67 20 3d 20 73 71   char * msg = sq
93e0: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78 70  liteStrNDup(pExp
93f0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
9400: 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 09 20 20  r->token.n);..  
9410: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9420: 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
9430: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70  TE_CONSTRAINT, p
9440: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
9450: 09 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
9460: 28 6d 73 67 29 3b 0a 09 20 20 73 71 6c 69 74 65  (msg);..  sqlite
9470: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
9480: 2d 31 2c 20 6d 73 67 2c 20 30 29 3b 0a 09 20 20  -1, msg, 0);..  
9490: 73 71 6c 69 74 65 46 72 65 65 28 6d 73 67 29 3b  sqliteFree(msg);
94a0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
94b0: 09 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
94c0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
94d0: 49 67 6e 6f 72 65 20 29 3b 0a 09 20 20 73 71 6c  Ignore );..  sql
94e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
94f0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72  OP_Goto, 0, pPar
9500: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69  se->trigStack->i
9510: 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 09 20 20 73  gnoreJump);..  s
9520: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
9530: 33 28 76 2c 20 2d 31 2c 20 22 28 49 47 4e 4f 52  3(v, -1, "(IGNOR
9540: 45 20 6a 75 6d 70 29 22 2c 20 30 29 3b 0a 20 20  E jump)", 0);.  
9550: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9560: 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  break;.  }.}../*
9570: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
9580: 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
9590: 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
95a0: 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
95b0: 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
95c0: 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
95d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
95e0: 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
95f0: 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
9600: 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
9610: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9620: 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
9630: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9640: 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
9650: 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
9660: 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
9670: 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
9680: 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
9690: 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 74 72  fNull flag is tr
96a0: 75 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ue..*/.void sqli
96b0: 74 65 45 78 70 72 49 66 54 72 75 65 28 50 61 72  teExprIfTrue(Par
96c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
96d0: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
96e0: 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
96f0: 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
9700: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
9710: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
9720: 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
9730: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9740: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
9750: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
9760: 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _LT:       op = 
9770: 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Lt;       bre
9780: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9790: 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LE:       op = O
97a0: 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Le;       brea
97b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
97c0: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
97d0: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
97e0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
97f0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
9800: 47 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Ge;       break;
9810: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
9820: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e         op = OP_N
9830: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
9840: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
9850: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
9860: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
9870: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
9880: 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e  L:   op = OP_IsN
9890: 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ull;   break;.  
98a0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
98b0: 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  L:  op = OP_NotN
98c0: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
98d0: 20 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b   default:  break
98e0: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
98f0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
9900: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
9910: 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
9920: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
9930: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
9940: 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70  iteExprIfFalse(p
9950: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
9960: 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66  eft, d2, !jumpIf
9970: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
9980: 69 74 65 45 78 70 72 49 66 54 72 75 65 28 70 50  iteExprIfTrue(pP
9990: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
99a0: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
99b0: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
99c0: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
99d0: 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
99e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
99f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
9a00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
9a10: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
9a20: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
9a30: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
9a40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
9a50: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
9a60: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
9a70: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
9a80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9a90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
9aa0: 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73  K_NOT: {.      s
9ab0: 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65  qliteExprIfFalse
9ac0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
9ad0: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
9ae0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
9af0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9b00: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
9b10: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
9b20: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
9b30: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
9b40: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
9b50: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
9b60: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
9b70: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9b80: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
9b90: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
9ba0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9bb0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66  Right);.      if
9bc0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69  ( pParse->db->fi
9bd0: 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20  le_format>=4 && 
9be0: 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 70  sqliteExprType(p
9bf0: 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  Expr)==SQLITE_SO
9c00: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
9c10: 20 6f 70 20 2b 3d 20 36 3b 20 20 2f 2a 20 43 6f   op += 6;  /* Co
9c20: 6e 76 65 72 74 20 6e 75 6d 65 72 69 63 20 6f 70  nvert numeric op
9c30: 63 6f 64 65 73 20 74 6f 20 74 65 78 74 20 6f 70  codes to text op
9c40: 63 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d  codes */.      }
9c50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
9c60: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 6a 75  eAddOp(v, op, ju
9c70: 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b  mpIfNull, dest);
9c80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9c90: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9ca0: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
9cb0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
9cc0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
9cd0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9ce0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
9cf0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9d00: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
9d10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9d20: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
9d30: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
9d40: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c   addr;.      sql
9d50: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
9d60: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
9d70: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
9d80: 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e  sqliteVdbeCurren
9d90: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
9da0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9db0: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
9dc0: 31 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20  1, addr+3);.    
9dd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
9de0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
9df0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
9e00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9e10: 47 6f 74 6f 2c 20 30 2c 20 6a 75 6d 70 49 66 4e  Goto, 0, jumpIfN
9e20: 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 61 64 64  ull ? dest : add
9e30: 72 2b 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  r+4);.      if( 
9e40: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
9e50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9e60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9e70: 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
9e80: 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20  able, dest);.   
9e90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9ea0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
9eb0: 70 28 76 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64  p(v, OP_SetFound
9ec0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
9ed0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a   dest);.      }.
9ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9ef0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
9f00: 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
9f10: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
9f20: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
9f30: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
9f40: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
9f50: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9f60: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
9f70: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
9f80: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
9f90: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
9fa0: 78 70 72 29 3b 0a 20 20 20 20 20 20 61 64 64 72  xpr);.      addr
9fb0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
9fc0: 4f 70 28 76 2c 20 4f 50 5f 4c 74 2c 20 21 6a 75  Op(v, OP_Lt, !ju
9fd0: 6d 70 49 66 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20  mpIfNull, 0);.  
9fe0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
9ff0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
a000: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
a010: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
a020: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a030: 50 5f 4c 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  P_Le, jumpIfNull
a040: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
a050: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a060: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
a070: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
a080: 65 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  eVdbeChangeP2(v,
a090: 20 61 64 64 72 2c 20 73 71 6c 69 74 65 56 64 62   addr, sqliteVdb
a0a0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
a0b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
a0c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
a0d0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
a0e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a0f0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
a100: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
a110: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
a120: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
a130: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c  eAddOp(v, OP_If,
a140: 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73   jumpIfNull, des
a150: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
a160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a170: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
a180: 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
a190: 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
a1a0: 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
a1b0: 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
a1c0: 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
a1d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a1e0: 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
a1f0: 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
a200: 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
a210: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a220: 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
a230: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
a240: 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
a250: 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
a260: 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
a270: 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
a280: 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 20  pIfNull is true 
a290: 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
a2a0: 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
a2b0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20   false..*/.void 
a2c0: 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73  sqliteExprIfFals
a2d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a2e0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
a2f0: 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
a300: 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
a310: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a320: 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
a330: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
a340: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
a350: 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  n;.  switch( pEx
a360: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
a370: 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20  se TK_LT:       
a380: 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20  op = OP_Ge;     
a390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a3a0: 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f  e TK_LE:       o
a3b0: 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20 20  p = OP_Gt;      
a3c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a3d0: 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f 70   TK_GT:       op
a3e0: 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20   = OP_Le;       
a3f0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a400: 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_GE:       op 
a410: 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62  = OP_Lt;       b
a420: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a430: 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_NE:       op =
a440: 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62 72   OP_Eq;       br
a450: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a460: 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _EQ:       op = 
a470: 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65  OP_Ne;       bre
a480: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a490: 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f  ISNULL:   op = O
a4a0: 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61  P_NotNull;  brea
a4b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
a4c0: 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50  OTNULL:  op = OP
a4d0: 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b  _IsNull;   break
a4e0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
a4f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69  break;.  }.  swi
a500: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
a510: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
a520: 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
a530: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
a540: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
a550: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
a560: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
a570: 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  teExprIfFalse(pP
a580: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
a590: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
a5a0: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
a5b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a5c0: 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
a5d0: 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
a5e0: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
a5f0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
a600: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
a610: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
a620: 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c   d2, !jumpIfNull
a630: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
a640: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
a650: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
a660: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
a670: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
a680: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
a690: 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
a6a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a6b0: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
a6c0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
a6d0: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
a6e0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
a6f0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
a700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a710: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
a720: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
a730: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
a740: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
a750: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
a760: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
a770: 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  Q: {.      if( p
a780: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f  Parse->db->file_
a790: 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 73 71 6c  format>=4 && sql
a7a0: 69 74 65 45 78 70 72 54 79 70 65 28 70 45 78 70  iteExprType(pExp
a7b0: 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45  r)==SQLITE_SO_TE
a7c0: 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  XT ){.        /*
a7d0: 20 43 6f 6e 76 65 72 74 20 6e 75 6d 65 72 69 63   Convert numeric
a7e0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f   comparison opco
a7f0: 64 65 73 20 69 6e 74 6f 20 74 65 78 74 20 63 6f  des into text co
a800: 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 73  mparison opcodes
a810: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  ..        ** Thi
a820: 73 20 73 74 65 70 20 64 65 70 65 6e 64 73 20 6f  s step depends o
a830: 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
a840: 74 68 65 20 74 65 78 74 20 63 6f 6d 70 61 72 69  the text compari
a850: 73 69 6f 6e 20 6f 70 63 6f 64 65 73 20 61 72 65  sion opcodes are
a860: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
a870: 79 73 20 36 20 67 72 65 61 74 65 72 20 74 68 61  ys 6 greater tha
a880: 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f  n their correspo
a890: 6e 64 69 6e 67 20 6e 75 6d 65 72 69 63 20 63 6f  nding numeric co
a8a0: 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 20 20 20  mparison.       
a8b0: 20 2a 2a 20 6f 70 63 6f 64 65 73 2e 0a 20 20 20   ** opcodes..   
a8c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a8d0: 61 73 73 65 72 74 28 20 4f 50 5f 45 71 2b 36 20  assert( OP_Eq+6 
a8e0: 3d 3d 20 4f 50 5f 53 74 72 45 71 20 29 3b 0a 20  == OP_StrEq );. 
a8f0: 20 20 20 20 20 20 20 6f 70 20 2b 3d 20 36 3b 0a         op += 6;.
a900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a910: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
a920: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
a930: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
a940: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
a950: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
a960: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
a970: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 6a 75  eAddOp(v, op, ju
a980: 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b  mpIfNull, dest);
a990: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a9a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a9b0: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
a9c0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
a9d0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
a9e0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
a9f0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
aa00: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
aa10: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
aa20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
aa30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
aa40: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
aa50: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c   addr;.      sql
aa60: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
aa70: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
aa80: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
aa90: 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e  sqliteVdbeCurren
aaa0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
aab0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
aac0: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
aad0: 31 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20  1, addr+3);.    
aae0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
aaf0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
ab00: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
ab10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ab20: 47 6f 74 6f 2c 20 30 2c 20 6a 75 6d 70 49 66 4e  Goto, 0, jumpIfN
ab30: 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 61 64 64  ull ? dest : add
ab40: 72 2b 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  r+4);.      if( 
ab50: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
ab60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ab70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ab80: 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  NotFound, pExpr-
ab90: 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a  >iTable, dest);.
aba0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
abb0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
abc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 6f  ddOp(v, OP_SetNo
abd0: 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  tFound, pExpr->i
abe0: 54 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20  Table, dest);.  
abf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ac00: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
ac10: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
ac20: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
ac30: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
ac40: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
ac50: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
ac60: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ac70: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
ac80: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
ac90: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
aca0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
acb0: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
acc0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
acd0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ace0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
acf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
ad00: 65 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20  e, !jumpIfNull, 
ad10: 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73  addr+3);.      s
ad20: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ad30: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
ad40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ad50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
ad60: 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  o, 0, dest);.   
ad70: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
ad80: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
ad90: 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
ada0: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
adb0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
adc0: 5f 47 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c  _Gt, jumpIfNull,
add0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
ade0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
adf0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
ae00: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
ae10: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
ae20: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ae30: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  ddOp(v, OP_IfNot
ae40: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
ae50: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
ae60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
ae70: 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63  *.** Do a deep c
ae80: 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f  omparison of two
ae90: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
aea0: 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
aeb0: 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66  (non-zero).** if
aec0: 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
aed0: 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46  cal and return F
aee0: 41 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66  ALSE if they dif
aef0: 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
af00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70  */.int sqliteExp
af10: 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
af20: 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20  A, Expr *pB){.  
af30: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
af40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
af50: 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20   pB==0;.  }else 
af60: 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20  if( pB==0 ){.   
af70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
af80: 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d   if( pA->op!=pB-
af90: 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >op ) return 0;.
afa0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 45 78 70    if( !sqliteExp
afb0: 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
afc0: 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29  ft, pB->pLeft) )
afd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
afe0: 20 21 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70   !sqliteExprComp
aff0: 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20  are(pA->pRight, 
b000: 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65  pB->pRight) ) re
b010: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
b020: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69  ->pList ){.    i
b030: 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20  f( pB->pList==0 
b040: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
b050: 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e  if( pA->pList->n
b060: 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d  Expr!=pB->pList-
b070: 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
b080: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
b090: 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  i<pA->pList->nEx
b0a0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
b0b0: 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72 43  if( !sqliteExprC
b0c0: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74  ompare(pA->pList
b0d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42  ->a[i].pExpr, pB
b0e0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
b0f0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
b100: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
b110: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
b120: 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b  if( pB->pList ){
b130: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
b140: 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65   }.  if( pA->pSe
b150: 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c  lect || pB->pSel
b160: 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ect ) return 0;.
b170: 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
b180: 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20  !=pB->iTable || 
b190: 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
b1a0: 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
b1b0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74  n 0;.  if( pA->t
b1c0: 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66  oken.z ){.    if
b1d0: 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ( pB->token.z==0
b1e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
b1f0: 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e   if( pB->token.n
b200: 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20  !=pA->token.n ) 
b210: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
b220: 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  ( sqliteStrNICmp
b230: 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42  (pA->token.z, pB
b240: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74  ->token.z, pB->t
b250: 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74  oken.n)!=0 ) ret
b260: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
b270: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
b280: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
b290: 74 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  t to the pParse-
b2a0: 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 6e  >aAgg[] array an
b2b0: 64 20 72 65 74 75 72 6e 20 69 74 73 20 69 6e 64  d return its ind
b2c0: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ex..*/.static in
b2d0: 74 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28  t appendAggInfo(
b2e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
b2f0: 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 6e    if( (pParse->n
b300: 41 67 67 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Agg & 0x7)==0 ){
b310: 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 70  .    int amt = p
b320: 50 61 72 73 65 2d 3e 6e 41 67 67 20 2b 20 38 3b  Parse->nAgg + 8;
b330: 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 61 41  .    AggExpr *aA
b340: 67 67 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  gg = sqliteReall
b350: 6f 63 28 70 50 61 72 73 65 2d 3e 61 41 67 67 2c  oc(pParse->aAgg,
b360: 20 61 6d 74 2a 73 69 7a 65 6f 66 28 70 50 61 72   amt*sizeof(pPar
b370: 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20  se->aAgg[0]));. 
b380: 20 20 20 69 66 28 20 61 41 67 67 3d 3d 30 20 29     if( aAgg==0 )
b390: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
b3a0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
b3b0: 72 73 65 2d 3e 61 41 67 67 20 3d 20 61 41 67 67  rse->aAgg = aAgg
b3c0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
b3d0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 70 50 61  pParse->aAgg[pPa
b3e0: 72 73 65 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20 73  rse->nAgg], 0, s
b3f0: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41  izeof(pParse->aA
b400: 67 67 5b 30 5d 29 29 3b 0a 20 20 72 65 74 75 72  gg[0]));.  retur
b410: 6e 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 2b 2b  n pParse->nAgg++
b420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
b430: 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  ze the given exp
b440: 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
b450: 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
b460: 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
b470: 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
b480: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
b490: 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  ed to the pParse
b4a0: 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a  ->aAgg[] array..
b4b0: 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e  ** Make addition
b4c0: 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  al entries to th
b4d0: 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
b4e0: 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73   array as necess
b4f0: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
b500: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
b510: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
b520: 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
b530: 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
b540: 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
b550: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
b560: 29 20 61 6e 64 20 73 71 6c 69 74 65 45 78 70 72  ) and sqliteExpr
b570: 43 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Check()..**.** I
b580: 66 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65  f errors are see
b590: 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  n, leave an erro
b5a0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72  r message in zEr
b5b0: 72 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a  rMsg and return.
b5c0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
b5d0: 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
b5e0: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
b5f0: 65 41 67 67 72 65 67 61 74 65 73 28 50 61 72 73  eAggregates(Pars
b600: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
b610: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
b620: 3b 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67  ;.  AggExpr *aAg
b630: 67 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  g;.  int nErr = 
b640: 30 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  0;..  if( pExpr=
b650: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b660: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
b670: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
b680: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
b690: 20 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d    aAgg = pParse-
b6a0: 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72  >aAgg;.      for
b6b0: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
b6c0: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
b6d0: 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e      if( aAgg[i].
b6e0: 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
b6f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 41  ;.        if( aA
b700: 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 54 61  gg[i].pExpr->iTa
b710: 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
b720: 6c 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 61  le.         && a
b730: 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43  Agg[i].pExpr->iC
b740: 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
b750: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
b760: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b770: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b780: 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d    if( i>=pParse-
b790: 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  >nAgg ){.       
b7a0: 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e   i = appendAggIn
b7b0: 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  fo(pParse);.    
b7c0: 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65      if( i<0 ) re
b7d0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
b7e0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
b7f0: 69 73 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  isAgg = 0;.     
b800: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
b810: 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  i].pExpr = pExpr
b820: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b830: 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b  pExpr->iAgg = i;
b840: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b850: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b860: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
b870: 20 20 20 20 20 20 61 41 67 67 20 3d 20 70 50 61        aAgg = pPa
b880: 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20  rse->aAgg;.     
b890: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
b8a0: 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
b8b0: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 41 67          if( !aAg
b8c0: 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e  g[i].isAgg ) con
b8d0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
b8e0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d  f( sqliteExprCom
b8f0: 70 61 72 65 28 61 41 67 67 5b 69 5d 2e 70 45 78  pare(aAgg[i].pEx
b900: 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20  pr, pExpr) ){.  
b910: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b920: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b930: 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50  .      if( i>=pP
b940: 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20  arse->nAgg ){.  
b950: 20 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64        i = append
b960: 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b  AggInfo(pParse);
b970: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 30  .        if( i<0
b980: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
b990: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67       pParse->aAg
b9a0: 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a  g[i].isAgg = 1;.
b9b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
b9c0: 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20  aAgg[i].pExpr = 
b9d0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70  pExpr;.        p
b9e0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
b9f0: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 46 69 6e  Func = sqliteFin
ba00: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
ba10: 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
ba20: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
ba30: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
ba40: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
ba50: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70  pExpr->pList ? p
ba60: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
ba70: 70 72 20 3a 20 30 2c 20 30 29 3b 0a 20 20 20 20  pr : 0, 0);.    
ba80: 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d    }.      pExpr-
ba90: 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
baa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bab0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
bac0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
bad0: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  eft ){.        n
bae0: 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  Err = sqliteExpr
baf0: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
bb00: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  s(pParse, pExpr-
bb10: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d  >pLeft);.      }
bb20: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d  .      if( nErr=
bb30: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
bb40: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  ght ){.        n
bb50: 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  Err = sqliteExpr
bb60: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
bb70: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  s(pParse, pExpr-
bb80: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
bb90: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72  }.      if( nErr
bba0: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  ==0 && pExpr->pL
bbb0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ist ){.        i
bbc0: 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c  nt n = pExpr->pL
bbd0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
bbe0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
bbf0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72     for(i=0; nErr
bc00: 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29  ==0 && i<n; i++)
bc10: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72 72  {.          nErr
bc20: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61   = sqliteExprAna
bc30: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
bc40: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
bc50: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
bc60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bc70: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
bc80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
bc90: 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn nErr;.}../*.
bca0: 2a 2a 20 4c 6f 63 61 74 65 20 61 20 75 73 65 72  ** Locate a user
bcb0: 20 66 75 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20   function given 
bcc0: 61 20 6e 61 6d 65 20 61 6e 64 20 61 20 6e 75 6d  a name and a num
bcd0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
bce0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ..** Return a po
bcf0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e  inter to the Fun
bd00: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 74  cDef structure t
bd10: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 61 74  hat defines that
bd20: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72  .** function, or
bd30: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   return NULL if 
bd40: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
bd50: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a  s not exist..**.
bd60: 2a 2a 20 49 66 20 74 68 65 20 63 72 65 61 74 65  ** If the create
bd70: 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
bd80: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 6e 65   true, then a ne
bd90: 77 20 28 62 6c 61 6e 6b 29 20 46 75 6e 63 44 65  w (blank) FuncDe
bda0: 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69  f.** structure i
bdb0: 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6c 69  s created and li
bdc0: 6b 65 64 20 69 6e 74 6f 20 74 68 65 20 22 64 62  ked into the "db
bdd0: 22 20 73 74 72 75 63 74 75 72 65 20 69 66 20 61  " structure if a
bde0: 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20  .** no matching 
bdf0: 66 75 6e 63 74 69 6f 6e 20 70 72 65 76 69 6f 75  function previou
be00: 73 6c 79 20 65 78 69 73 74 65 64 2e 20 20 57 68  sly existed.  Wh
be10: 65 6e 20 63 72 65 61 74 65 46 6c 61 67 20 69 73  en createFlag is
be20: 20 74 72 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65   true.** and the
be30: 20 6e 41 72 67 20 70 61 72 61 6d 65 74 65 72 20   nArg parameter 
be40: 69 73 20 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c 79  is -1, then only
be50: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
be60: 20 61 63 63 65 70 74 73 0a 2a 2a 20 61 6e 79 20   accepts.** any 
be70: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
be80: 6e 74 73 20 77 69 6c 6c 20 62 65 20 72 65 74 75  nts will be retu
be90: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63  rned..**.** If c
bea0: 72 65 61 74 65 46 6c 61 67 20 69 73 20 66 61 6c  reateFlag is fal
beb0: 73 65 20 61 6e 64 20 6e 41 72 67 20 69 73 20 2d  se and nArg is -
bec0: 31 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  1, then the firs
bed0: 74 20 76 61 6c 69 64 0a 2a 2a 20 66 75 6e 63 74  t valid.** funct
bee0: 69 6f 6e 20 66 6f 75 6e 64 20 69 73 20 72 65 74  ion found is ret
bef0: 75 72 6e 65 64 2e 20 20 41 20 66 75 6e 63 74 69  urned.  A functi
bf00: 6f 6e 20 69 73 20 76 61 6c 69 64 20 69 66 20 65  on is valid if e
bf10: 69 74 68 65 72 20 78 46 75 6e 63 0a 2a 2a 20 6f  ither xFunc.** o
bf20: 72 20 78 53 74 65 70 20 69 73 20 6e 6f 6e 2d 7a  r xStep is non-z
bf30: 65 72 6f 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66 20  ero..*/.FuncDef 
bf40: 2a 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74  *sqliteFindFunct
bf50: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 20 2a 64  ion(.  sqlite *d
bf60: 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  b,        /* An 
bf70: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f  open database */
bf80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
bf90: 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66  Name, /* Name of
bfa0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20   the function.  
bfb0: 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  Not null-termina
bfc0: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ted */.  int nNa
bfd0: 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  me,         /* N
bfe0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
bff0: 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  ers in the name 
c000: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
c010: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c020: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
c030: 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20 6e 75   -1 means any nu
c040: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 72  mber */.  int cr
c050: 65 61 74 65 46 6c 61 67 20 20 20 20 20 2f 2a 20  eateFlag     /* 
c060: 43 72 65 61 74 65 20 6e 65 77 20 65 6e 74 72 79  Create new entry
c070: 20 69 66 20 74 72 75 65 20 61 6e 64 20 64 6f 65   if true and doe
c080: 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20  s not otherwise 
c090: 65 78 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 75  exist */.){.  Fu
c0a0: 6e 63 44 65 66 20 2a 70 46 69 72 73 74 2c 20 2a  ncDef *pFirst, *
c0b0: 70 2c 20 2a 70 4d 61 79 62 65 3b 0a 20 20 70 46  p, *pMaybe;.  pF
c0c0: 69 72 73 74 20 3d 20 70 20 3d 20 28 46 75 6e 63  irst = p = (Func
c0d0: 44 65 66 2a 29 73 71 6c 69 74 65 48 61 73 68 46  Def*)sqliteHashF
c0e0: 69 6e 64 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20  ind(&db->aFunc, 
c0f0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
c100: 20 69 66 28 20 70 20 26 26 20 21 63 72 65 61 74   if( p && !creat
c110: 65 46 6c 61 67 20 26 26 20 6e 41 72 67 3c 30 20  eFlag && nArg<0 
c120: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20  ){.    while( p 
c130: 26 26 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 26  && p->xFunc==0 &
c140: 26 20 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29 7b  & p->xStep==0 ){
c150: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d   p = p->pNext; }
c160: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20  .    return p;. 
c170: 20 7d 0a 20 20 70 4d 61 79 62 65 20 3d 20 30 3b   }.  pMaybe = 0;
c180: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
c190: 2d 3e 6e 41 72 67 21 3d 6e 41 72 67 20 29 7b 0a  ->nArg!=nArg ){.
c1a0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67 3c      if( p->nArg<
c1b0: 30 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67  0 && !createFlag
c1c0: 20 26 26 20 28 70 2d 3e 78 46 75 6e 63 20 7c 7c   && (p->xFunc ||
c1d0: 20 70 2d 3e 78 53 74 65 70 29 20 29 20 70 4d 61   p->xStep) ) pMa
c1e0: 79 62 65 20 3d 20 70 3b 0a 20 20 20 20 70 20 3d  ybe = p;.    p =
c1f0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
c200: 20 69 66 28 20 70 20 26 26 20 21 63 72 65 61 74   if( p && !creat
c210: 65 46 6c 61 67 20 26 26 20 70 2d 3e 78 46 75 6e  eFlag && p->xFun
c220: 63 3d 3d 30 20 26 26 20 70 2d 3e 78 53 74 65 70  c==0 && p->xStep
c230: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c240: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
c250: 3d 3d 30 20 26 26 20 70 4d 61 79 62 65 20 29 7b  ==0 && pMaybe ){
c260: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 72 65  .    assert( cre
c270: 61 74 65 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20  ateFlag==0 );.  
c280: 20 20 72 65 74 75 72 6e 20 70 4d 61 79 62 65 3b    return pMaybe;
c290: 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20  .  }.  if( p==0 
c2a0: 26 26 20 63 72 65 61 74 65 46 6c 61 67 20 26 26  && createFlag &&
c2b0: 20 28 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c   (p = sqliteMall
c2c0: 6f 63 28 73 69 7a 65 6f 66 28 2a 70 29 29 29 21  oc(sizeof(*p)))!
c2d0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 72  =0 ){.    p->nAr
c2e0: 67 20 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70 2d  g = nArg;.    p-
c2f0: 3e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b  >pNext = pFirst;
c300: 0a 20 20 20 20 70 2d 3e 64 61 74 61 54 79 70 65  .    p->dataType
c310: 20 3d 20 70 46 69 72 73 74 20 3f 20 70 46 69 72   = pFirst ? pFir
c320: 73 74 2d 3e 64 61 74 61 54 79 70 65 20 3a 20 53  st->dataType : S
c330: 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 3b 0a 20  QLITE_NUMERIC;. 
c340: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
c350: 65 72 74 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20  ert(&db->aFunc, 
c360: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 28 76  zName, nName, (v
c370: 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 20 20 72  oid*)p);.  }.  r
c380: 65 74 75 72 6e 20 70 3b 0a 7d 0a                 eturn p;.}.