/ Hex Artifact Content
Login

Artifact 92ff4a2d87f7443f6081ba2d51e25c27e10c7b4e:


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 34 37 20 32 30 30 32 2f 30 32 2f 32 37 20 30  .47 2002/02/27 0
0220: 31 3a 35 33 3a 31 33 20 64 72 68 20 45 78 70 20  1:53:13 drh Exp 
0230: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
0240: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a  qliteInt.h".../*
0250: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
0260: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
0270: 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ode and return a
0280: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
0290: 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74   Memory.** for t
02a0: 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74 61  his node is obta
02b0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
02c0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
02d0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
02e0: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
02f0: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
0300: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
0310: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
0320: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0330: 65 45 78 70 72 28 69 6e 74 20 6f 70 2c 20 45 78  eExpr(int op, Ex
0340: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
0350: 2a 70 52 69 67 68 74 2c 20 54 6f 6b 65 6e 20 2a  *pRight, Token *
0360: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
0370: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
0380: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
0390: 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20  zeof(Expr) );.  
03a0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
03b0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
03c0: 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ete(pLeft);.    
03d0: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
03e0: 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65  (pRight);.    re
03f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
0400: 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ew->op = op;.  p
0410: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65  New->pLeft = pLe
0420: 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  ft;.  pNew->pRig
0430: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 69  ht = pRight;.  i
0440: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
0450: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a   pNew->token = *
0460: 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b  pToken;.  }else{
0470: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
0480: 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  .z = 0;.    pNew
0490: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20  ->token.n = 0;. 
04a0: 20 7d 0a 20 20 69 66 28 20 70 4c 65 66 74 20 26   }.  if( pLeft &
04b0: 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  & pRight ){.    
04c0: 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 70  sqliteExprSpan(p
04d0: 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61  New, &pLeft->spa
04e0: 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70 61 6e  n, &pRight->span
04f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
0500: 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65  pNew->span = pNe
0510: 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20  w->token;.  }.  
0520: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
0530: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
0540: 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6f  pr.token field o
0550: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
0560: 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61  ession to span a
0570: 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74 77 65  ll.** text betwe
0580: 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e  en the two given
0590: 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64   tokens..*/.void
05a0: 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28   sqliteExprSpan(
05b0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
05c0: 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e  en *pLeft, Token
05d0: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
05e0: 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45   pExpr ){.    pE
05f0: 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c  xpr->span.z = pL
0600: 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 70 45 78 70  eft->z;.    pExp
0610: 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67  r->span.n = pRig
0620: 68 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 52 69  ht->n + Addr(pRi
0630: 67 68 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70  ght->z) - Addr(p
0640: 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a  Left->z);.  }.}.
0650: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
0660: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
0670: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e  n node for a fun
0680: 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69  ction with multi
0690: 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ple.** arguments
06a0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
06b0: 65 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 45 78  eExprFunction(Ex
06c0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  prList *pList, T
06d0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
06e0: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70   Expr *pNew;.  p
06f0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
0700: 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29  oc( sizeof(Expr)
0710: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
0720: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  0 ){.    sqliteE
0730: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  xprListDelete(pL
0740: 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
0750: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
0760: 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  op = TK_FUNCTION
0770: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20  ;.  pNew->pList 
0780: 3d 20 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  = pList;.  if( p
0790: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 70 4e 65  Token ){.    pNe
07a0: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
07b0: 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  en;.  }else{.   
07c0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d   pNew->token.z =
07d0: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   0;.    pNew->to
07e0: 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20  ken.n = 0;.  }. 
07f0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
0800: 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65  ./*.** Recursive
0810: 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70  ly delete an exp
0820: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
0830: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
0840: 44 65 6c 65 74 65 28 45 78 70 72 20 2a 70 29 7b  Delete(Expr *p){
0850: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
0860: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  turn;.  if( p->o
0870: 70 21 3d 54 4b 5f 41 53 20 29 7b 0a 20 20 20 20  p!=TK_AS ){.    
0880: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 20 73  if( p->pLeft ) s
0890: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
08a0: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  p->pLeft);.    i
08b0: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 20 73  f( p->pRight ) s
08c0: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
08d0: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  p->pRight);.  }.
08e0: 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29    if( p->pList )
08f0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
0900: 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b  elete(p->pList);
0910: 0a 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63  .  if( p->pSelec
0920: 74 20 29 20 73 71 6c 69 74 65 53 65 6c 65 63 74  t ) sqliteSelect
0930: 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63  Delete(p->pSelec
0940: 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
0950: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
0960: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75  e following grou
0970: 70 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 20 61  p of functions a
0980: 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 6e 73  re used to trans
0990: 6c 61 74 65 20 74 68 65 20 73 74 72 69 6e 67 0a  late the string.
09a0: 2a 2a 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74  ** pointers of t
09b0: 6f 6b 65 6e 73 20 69 6e 20 65 78 70 72 65 73 73  okens in express
09c0: 69 6f 6e 20 66 72 6f 6d 20 6f 6e 65 20 62 75 66  ion from one buf
09d0: 66 65 72 20 74 6f 20 61 6e 6f 74 68 65 72 2e 0a  fer to another..
09e0: 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
09f0: 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
0a00: 20 61 6e 64 20 45 78 70 72 2e 73 70 61 6e 2e 7a   and Expr.span.z
0a10: 20 66 69 65 6c 64 73 20 70 6f 69 6e 74 20 69 6e   fields point in
0a20: 74 6f 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  to the.** origin
0a30: 61 6c 20 69 6e 70 75 74 20 62 75 66 66 65 72 20  al input buffer 
0a40: 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  of an SQL statem
0a50: 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20 75 73  ent.  This is us
0a60: 75 61 6c 6c 79 20 4f 4b 0a 2a 2a 20 73 69 6e 63  ually OK.** sinc
0a70: 65 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  e the SQL statem
0a80: 65 6e 74 20 69 73 20 65 78 65 63 75 74 65 64 20  ent is executed 
0a90: 61 6e 64 20 74 68 65 20 65 78 70 72 65 73 73 69  and the expressi
0aa0: 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a  on is deleted.**
0ab0: 20 62 65 66 6f 72 65 20 74 68 65 20 69 6e 70 75   before the inpu
0ac0: 74 20 62 75 66 66 65 72 20 69 73 20 66 72 65 65  t buffer is free
0ad0: 64 2e 20 20 4d 61 6b 69 6e 67 20 74 68 65 20 74  d.  Making the t
0ae0: 6f 6b 65 6e 73 20 70 6f 69 6e 74 20 74 6f 20 74  okens point to t
0af0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 69  he.** original i
0b00: 6e 70 75 74 20 62 75 66 66 65 72 20 73 61 76 65  nput buffer save
0b10: 73 20 6d 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20  s many calls to 
0b20: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 74 68 75  malloc() and thu
0b30: 73 20 68 65 6c 70 73 0a 2a 2a 20 74 68 65 20 6c  s helps.** the l
0b40: 69 62 72 61 72 79 20 74 6f 20 72 75 6e 20 66 61  ibrary to run fa
0b50: 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 42 75 74  ster. .**.** But
0b60: 20 73 6f 6d 65 74 69 6d 65 73 20 77 65 20 6e 65   sometimes we ne
0b70: 65 64 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ed an expression
0b80: 20 74 6f 20 70 65 72 73 69 73 74 20 70 61 73 74   to persist past
0b90: 20 74 68 65 20 74 69 6d 65 20 77 68 65 6e 0a 2a   the time when.*
0ba0: 2a 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  * the input buff
0bb0: 65 72 20 69 73 20 66 72 65 65 64 2e 20 20 28 45  er is freed.  (E
0bc0: 78 61 6d 70 6c 65 3a 20 54 68 65 20 53 45 4c 45  xample: The SELE
0bd0: 43 54 20 63 6c 61 75 73 65 20 6f 66 20 61 0a 2a  CT clause of a.*
0be0: 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  * CREATE VIEW st
0bf0: 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73  atement contains
0c00: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
0c10: 74 20 6d 75 73 74 20 70 65 72 73 69 73 74 20 66  t must persist f
0c20: 6f 72 0a 2a 2a 20 74 68 65 20 6c 69 66 65 20 6f  or.** the life o
0c30: 66 20 74 68 65 20 76 69 65 77 2e 29 20 20 57 68  f the view.)  Wh
0c40: 65 6e 20 74 68 61 74 20 68 61 70 70 65 6e 73 20  en that happens 
0c50: 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20  we have to make 
0c60: 61 0a 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 20  a.** persistent 
0c70: 63 6f 70 79 20 6f 66 20 74 68 65 20 69 6e 70 75  copy of the inpu
0c80: 74 20 62 75 66 66 65 72 20 61 6e 64 20 74 72 61  t buffer and tra
0c90: 6e 73 6c 61 74 65 20 74 68 65 20 45 78 70 72 2e  nslate the Expr.
0ca0: 74 6f 6b 65 6e 2e 7a 0a 2a 2a 20 61 6e 64 20 45  token.z.** and E
0cb0: 78 70 72 2e 73 70 61 6e 2e 7a 20 66 69 65 6c 64  xpr.span.z field
0cc0: 73 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  s to point to th
0cd0: 65 20 63 6f 70 79 20 72 61 74 68 65 72 20 74 68  e copy rather th
0ce0: 61 6e 20 74 68 65 20 0a 2a 2a 20 6f 72 69 67 69  an the .** origi
0cf0: 6e 61 6c 20 69 6e 70 75 74 20 62 75 66 66 65 72  nal input buffer
0d00: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
0d10: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
0d20: 65 73 20 68 61 6e 64 6c 65 20 74 68 61 74 0a 2a  es handle that.*
0d30: 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e 0a 2a  * translation..*
0d40: 2a 0a 2a 2a 20 54 68 65 20 22 6f 66 66 73 65 74  *.** The "offset
0d50: 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  " parameter is t
0d60: 68 65 20 64 69 73 74 61 6e 63 65 20 66 72 6f 6d  he distance from
0d70: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
0d80: 70 75 74 20 62 75 66 66 65 72 0a 2a 2a 20 74 6f  put buffer.** to
0d90: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
0da0: 63 6f 70 79 2e 20 20 54 68 65 73 65 20 72 6f 75  copy.  These rou
0db0: 74 69 6e 65 73 20 72 65 63 75 72 73 69 76 65 6c  tines recursivel
0dc0: 79 20 77 61 6c 6b 20 74 68 65 20 65 6e 74 69 72  y walk the entir
0dd0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
0de0: 74 72 65 65 20 61 6e 64 20 73 68 69 66 74 20 61  tree and shift a
0df0: 6c 6c 20 74 6f 6b 65 6e 73 20 62 79 20 22 6f 66  ll tokens by "of
0e00: 66 73 65 74 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2a  fset" amount..**
0e10: 0a 2a 2a 20 54 68 65 20 77 6f 72 6b 20 6f 66 20  .** The work of 
0e20: 66 69 67 75 72 69 6e 67 20 6f 75 74 20 74 68 65  figuring out the
0e30: 20 61 70 70 72 6f 70 72 69 61 74 65 20 22 6f 66   appropriate "of
0e40: 66 73 65 74 22 20 61 6e 64 20 6d 61 6b 69 6e 67  fset" and making
0e50: 20 74 68 65 0a 2a 2a 20 70 72 65 73 69 73 74 65   the.** presiste
0e60: 6e 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69  nt copy of the i
0e70: 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20 64  nput buffer is d
0e80: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
0e90: 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76  ng routine..*/.v
0ea0: 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 4d 6f  oid sqliteExprMo
0eb0: 76 65 53 74 72 69 6e 67 73 28 45 78 70 72 20 2a  veStrings(Expr *
0ec0: 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a  p, int offset){.
0ed0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0ee0: 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  urn;.  if( p->to
0ef0: 6b 65 6e 2e 7a 20 29 20 70 2d 3e 74 6f 6b 65 6e  ken.z ) p->token
0f00: 2e 7a 20 2b 3d 20 6f 66 66 73 65 74 3b 0a 20 20  .z += offset;.  
0f10: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 29 20  if( p->span.z ) 
0f20: 70 2d 3e 73 70 61 6e 2e 7a 20 2b 3d 20 6f 66 66  p->span.z += off
0f30: 73 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  set;.  if( p->pL
0f40: 65 66 74 20 29 20 73 71 6c 69 74 65 45 78 70 72  eft ) sqliteExpr
0f50: 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 2d 3e 70  MoveStrings(p->p
0f60: 4c 65 66 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Left, offset);. 
0f70: 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29   if( p->pRight )
0f80: 20 73 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53   sqliteExprMoveS
0f90: 74 72 69 6e 67 73 28 70 2d 3e 70 52 69 67 68 74  trings(p->pRight
0fa0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
0fb0: 20 70 2d 3e 70 4c 69 73 74 20 29 20 73 71 6c 69   p->pList ) sqli
0fc0: 74 65 45 78 70 72 4c 69 73 74 4d 6f 76 65 53 74  teExprListMoveSt
0fd0: 72 69 6e 67 73 28 70 2d 3e 70 4c 69 73 74 2c 20  rings(p->pList, 
0fe0: 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 70  offset);.  if( p
0ff0: 2d 3e 70 53 65 6c 65 63 74 20 29 20 73 71 6c 69  ->pSelect ) sqli
1000: 74 65 53 65 6c 65 63 74 4d 6f 76 65 53 74 72 69  teSelectMoveStri
1010: 6e 67 73 28 70 2d 3e 70 53 65 6c 65 63 74 2c 20  ngs(p->pSelect, 
1020: 6f 66 66 73 65 74 29 3b 0a 7d 0a 76 6f 69 64 20  offset);.}.void 
1030: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 4d 6f  sqliteExprListMo
1040: 76 65 53 74 72 69 6e 67 73 28 45 78 70 72 4c 69  veStrings(ExprLi
1050: 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 6f  st *pList, int o
1060: 66 66 73 65 74 29 7b 0a 20 20 69 6e 74 20 69 3b  ffset){.  int i;
1070: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1080: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1090: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
10a0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
10b0: 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53 74 72  qliteExprMoveStr
10c0: 69 6e 67 73 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ings(pList->a[i]
10d0: 2e 70 45 78 70 72 2c 20 6f 66 66 73 65 74 29 3b  .pExpr, offset);
10e0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
10f0: 74 65 53 65 6c 65 63 74 4d 6f 76 65 53 74 72 69  teSelectMoveStri
1100: 6e 67 73 28 53 65 6c 65 63 74 20 2a 70 53 65 6c  ngs(Select *pSel
1110: 65 63 74 2c 20 69 6e 74 20 6f 66 66 73 65 74 29  ect, int offset)
1120: 7b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d  {.  if( pSelect=
1130: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
1140: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 4d 6f 76  qliteExprListMov
1150: 65 53 74 72 69 6e 67 73 28 70 53 65 6c 65 63 74  eStrings(pSelect
1160: 2d 3e 70 45 4c 69 73 74 2c 20 6f 66 66 73 65 74  ->pEList, offset
1170: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4d  );.  sqliteExprM
1180: 6f 76 65 53 74 72 69 6e 67 73 28 70 53 65 6c 65  oveStrings(pSele
1190: 63 74 2d 3e 70 57 68 65 72 65 2c 20 6f 66 66 73  ct->pWhere, offs
11a0: 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  et);.  sqliteExp
11b0: 72 4c 69 73 74 4d 6f 76 65 53 74 72 69 6e 67 73  rListMoveStrings
11c0: 28 70 53 65 6c 65 63 74 2d 3e 70 47 72 6f 75 70  (pSelect->pGroup
11d0: 42 79 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 73  By, offset);.  s
11e0: 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53 74 72  qliteExprMoveStr
11f0: 69 6e 67 73 28 70 53 65 6c 65 63 74 2d 3e 70 48  ings(pSelect->pH
1200: 61 76 69 6e 67 2c 20 6f 66 66 73 65 74 29 3b 0a  aving, offset);.
1210: 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74    sqliteExprList
1220: 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 53 65 6c  MoveStrings(pSel
1230: 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6f  ect->pOrderBy, o
1240: 66 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  ffset);.  sqlite
1250: 53 65 6c 65 63 74 4d 6f 76 65 53 74 72 69 6e 67  SelectMoveString
1260: 73 28 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  s(pSelect->pPrio
1270: 72 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  r, offset);.}../
1280: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1290: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
12a0: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
12b0: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
12c0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
12d0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
12e0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
12f0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
1300: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
1310: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
1320: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
1330: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
1340: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
1350: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
1360: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
1370: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 4e  iginals..**.** N
1380: 6f 74 65 2c 20 68 6f 77 65 76 65 72 2c 20 74 68  ote, however, th
1390: 61 74 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  at the Expr.toke
13a0: 6e 2e 7a 20 61 6e 64 20 45 78 70 72 2e 73 70 61  n.z and Expr.spa
13b0: 6e 2e 7a 20 66 69 65 6c 64 73 20 70 6f 69 6e 74  n.z fields point
13c0: 20 74 6f 0a 2a 2a 20 73 74 72 69 6e 67 20 73 70   to.** string sp
13d0: 61 63 65 20 74 68 61 74 20 69 73 20 61 6c 6c 6f  ace that is allo
13e0: 63 61 74 65 64 20 73 65 70 61 72 61 74 65 6c 79  cated separately
13f0: 20 66 72 6f 6d 20 74 68 65 20 65 78 70 72 65 73   from the expres
1400: 73 69 6f 6e 20 74 72 65 65 0a 2a 2a 20 69 74 73  sion tree.** its
1410: 65 6c 66 2e 20 20 54 68 65 73 65 20 72 6f 75 74  elf.  These rout
1420: 69 6e 65 73 20 64 6f 20 4e 4f 54 20 64 75 70 6c  ines do NOT dupl
1430: 69 63 61 74 65 20 74 68 61 74 20 73 74 72 69 6e  icate that strin
1440: 67 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  g space..**.** T
1450: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
1460: 73 74 20 61 6e 64 20 49 44 20 6c 69 73 74 20 72  st and ID list r
1470: 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 45  eturn by sqliteE
1480: 78 70 72 4c 69 73 74 44 75 70 28 29 20 61 6e 64  xprListDup() and
1490: 20 0a 2a 2a 20 73 71 6c 69 74 65 49 64 4c 69 73   .** sqliteIdLis
14a0: 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62  tDup() can not b
14b0: 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64  e further expand
14c0: 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
14d0: 20 63 61 6c 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c   calls.** to sql
14e0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
14f0: 64 28 29 20 6f 72 20 73 71 6c 69 74 65 49 64 4c  d() or sqliteIdL
1500: 69 73 74 41 70 70 65 6e 64 28 29 2e 0a 2a 2a 0a  istAppend()..**.
1510: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
1520: 61 74 20 74 68 65 20 49 44 20 6c 69 73 74 20 6d  at the ID list m
1530: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
1540: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
1550: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
1560: 65 45 78 70 72 44 75 70 28 45 78 70 72 20 2a 70  eExprDup(Expr *p
1570: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
1580: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1590: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
15a0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
15b0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
15c0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
15d0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6f  urn 0;.  pNew->o
15e0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65  p = p->op;.  pNe
15f0: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
1600: 65 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 65 66  eExprDup(p->pLef
1610: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  t);.  pNew->pRig
1620: 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  ht = sqliteExprD
1630: 75 70 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  up(p->pRight);. 
1640: 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73   pNew->pList = s
1650: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70  qliteExprListDup
1660: 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e  (p->pList);.  pN
1670: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 70 2d 3e 74  ew->token = p->t
1680: 6f 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d 3e 73 70  oken;.  pNew->sp
1690: 61 6e 20 3d 20 70 2d 3e 73 70 61 6e 3b 0a 20 20  an = p->span;.  
16a0: 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20  pNew->pSelect = 
16b0: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28  sqliteSelectDup(
16c0: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72  p->pSelect);.  r
16d0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 45 78  eturn pNew;.}.Ex
16e0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 45 78  prList *sqliteEx
16f0: 70 72 4c 69 73 74 44 75 70 28 45 78 70 72 4c 69  prListDup(ExprLi
1700: 73 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69  st *p){.  ExprLi
1710: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
1720: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
1730: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
1740: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1750: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
1760: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
1770: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
1780: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e 6e  ew->nExpr = p->n
1790: 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  Expr;.  pNew->a 
17a0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
17b0: 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28  p->nExpr*sizeof(
17c0: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 66 6f  p->a[0]) );.  fo
17d0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
17e0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4e 65  r; i++){.    pNe
17f0: 77 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20  w->a[i].pExpr = 
1800: 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 2d  sqliteExprDup(p-
1810: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1820: 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 4e 61    pNew->a[i].zNa
1830: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
1840: 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  p(p->a[i].zName)
1850: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d  ;.    pNew->a[i]
1860: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 2d 3e  .sortOrder = p->
1870: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
1880: 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 69      pNew->a[i].i
1890: 73 41 67 67 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69  sAgg = p->a[i].i
18a0: 73 41 67 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  sAgg;.    pNew->
18b0: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20  a[i].done = 0;. 
18c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
18d0: 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  ;.}.IdList *sqli
18e0: 74 65 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69  teIdListDup(IdLi
18f0: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
1900: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
1910: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1920: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
1930: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
1940: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
1950: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
1960: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
1970: 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a  ->nId = p->nId;.
1980: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
1990: 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 49 64  teMalloc( p->nId
19a0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
19b0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
19c0: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
19d0: 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 4e     pNew->a[i].zN
19e0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
19f0: 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  up(p->a[i].zName
1a00: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69  );.    pNew->a[i
1a10: 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ].zAlias = sqlit
1a20: 65 53 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e  eStrDup(p->a[i].
1a30: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
1a40: 77 2d 3e 61 5b 69 5d 2e 69 64 78 20 3d 20 70 2d  w->a[i].idx = p-
1a50: 3e 61 5b 69 5d 2e 69 64 78 3b 0a 20 20 20 20 70  >a[i].idx;.    p
1a60: 4e 65 77 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d  New->a[i].pTab =
1a70: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b   0;.    pNew->a[
1a80: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
1a90: 69 74 65 53 65 6c 65 63 74 44 75 70 28 70 2d 3e  iteSelectDup(p->
1aa0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
1ab0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
1ac0: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
1ad0: 74 65 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65  teSelectDup(Sele
1ae0: 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74  ct *p){.  Select
1af0: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
1b00: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1b10: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
1b20: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
1b30: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
1b40: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1b50: 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74  pNew->isDistinct
1b60: 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
1b70: 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  ;.  pNew->pEList
1b80: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
1b90: 74 44 75 70 28 70 2d 3e 70 45 4c 69 73 74 29 3b  tDup(p->pEList);
1ba0: 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20  .  pNew->pSrc = 
1bb0: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 75 70 28  sqliteIdListDup(
1bc0: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77  p->pSrc);.  pNew
1bd0: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
1be0: 65 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65  eExprDup(p->pWhe
1bf0: 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  re);.  pNew->pGr
1c00: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 45 78  oupBy = sqliteEx
1c10: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72  prListDup(p->pGr
1c20: 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  oupBy);.  pNew->
1c30: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
1c40: 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69  ExprDup(p->pHavi
1c50: 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ng);.  pNew->pOr
1c60: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 45 78  derBy = sqliteEx
1c70: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72  prListDup(p->pOr
1c80: 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  derBy);.  pNew->
1c90: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
1ca0: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c  ew->pPrior = sql
1cb0: 69 74 65 53 65 6c 65 63 74 44 75 70 28 70 2d 3e  iteSelectDup(p->
1cc0: 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d  pPrior);.  pNew-
1cd0: 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69  >nLimit = p->nLi
1ce0: 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 66  mit;.  pNew->nOf
1cf0: 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65  fset = p->nOffse
1d00: 74 3b 0a 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 65  t;.  pNew->zSele
1d10: 63 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ct = 0;.  return
1d20: 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   pNew;.}.../*.**
1d30: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
1d40: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
1d50: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
1d60: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
1d70: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
1d80: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
1d90: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
1da0: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c  n list..*/.ExprL
1db0: 69 73 74 20 2a 73 71 6c 69 74 65 45 78 70 72 4c  ist *sqliteExprL
1dc0: 69 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69  istAppend(ExprLi
1dd0: 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20  st *pList, Expr 
1de0: 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70  *pExpr, Token *p
1df0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1e00: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1e10: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1e20: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
1e30: 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a  of(ExprList) );.
1e40: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1e50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e60: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
1e70: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e80: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
1e90: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
1ea0: 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   & 7)==0 ){.    
1eb0: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  int n = pList->n
1ec0: 45 78 70 72 20 2b 20 38 3b 0a 20 20 20 20 73 74  Expr + 8;.    st
1ed0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1ee0: 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20 73  em *a;.    a = s
1ef0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
1f00: 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28  st->a, n*sizeof(
1f10: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
1f20: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
1f30: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
1f40: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20  elete(pExpr);.  
1f50: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74      return pList
1f60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
1f70: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
1f80: 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61  if( pExpr || pNa
1f90: 6d 65 20 29 7b 0a 20 20 20 20 69 20 3d 20 70 4c  me ){.    i = pL
1fa0: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 3b 0a 20 20  ist->nExpr++;.  
1fb0: 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1fc0: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
1fd0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1fe0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  me = 0;.    if( 
1ff0: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  pName ){.      s
2000: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
2010: 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  &pList->a[i].zNa
2020: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  me, pName->z, pN
2030: 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ame->n, 0);.    
2040: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
2050: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
2060: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
2070: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
2080: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
2090: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
20a0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
20b0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
20c0: 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a  elete(ExprList *
20d0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
20e0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
20f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
2100: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
2110: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
2120: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
2130: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
2140: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  r);.    sqliteFr
2150: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
2160: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
2170: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
2180: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2190: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
21a0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
21b0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
21c0: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
21d0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
21e0: 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74  t.** and 0 if it
21f0: 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62   involves variab
2200: 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
2210: 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  teExprIsConstant
2220: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 73 77 69  (Expr *p){.  swi
2230: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
2240: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
2250: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
2260: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  :.    case TK_DO
2270: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
2280: 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  0;.    case TK_I
2290: 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
22a0: 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
22b0: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
22c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
22d0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
22e0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
22f0: 20 26 26 20 21 73 71 6c 69 74 65 45 78 70 72 49   && !sqliteExprI
2300: 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 65  sConstant(p->pLe
2310: 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ft) ) return 0;.
2320: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69        if( p->pRi
2330: 67 68 74 20 26 26 20 21 73 71 6c 69 74 65 45 78  ght && !sqliteEx
2340: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e  prIsConstant(p->
2350: 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e  pRight) ) return
2360: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
2370: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
2380: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
2390: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70   for(i=0; i<p->p
23a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
23b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
23c0: 20 21 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f   !sqliteExprIsCo
23d0: 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 69 73 74 2d  nstant(p->pList-
23e0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 72  >a[i].pExpr) ) r
23f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
2400: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2410: 20 72 65 74 75 72 6e 20 70 2d 3e 70 4c 65 66 74   return p->pLeft
2420: 21 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74  !=0 || p->pRight
2430: 21 3d 30 20 7c 7c 20 28 70 2d 3e 70 4c 69 73 74  !=0 || (p->pList
2440: 20 26 26 20 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45   && p->pList->nE
2450: 78 70 72 3e 30 29 3b 0a 20 20 20 20 7d 0a 20 20  xpr>0);.    }.  
2460: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2470: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20  ./*.** Walk the 
2480: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
2490: 61 6e 64 20 70 72 6f 63 65 73 73 20 6f 70 65 72  and process oper
24a0: 61 74 6f 72 73 20 6f 66 20 74 68 65 20 66 6f 72  ators of the for
24b0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 65  m:.**.**       e
24c0: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
24d0: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ..).**.** These 
24e0: 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 74  operators have t
24f0: 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 62  o be processed b
2500: 65 66 6f 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  efore column nam
2510: 65 73 20 61 72 65 0a 2a 2a 20 72 65 73 6f 6c 76  es are.** resolv
2520: 65 64 20 62 65 63 61 75 73 65 20 65 61 63 68 20  ed because each 
2530: 73 75 63 68 20 6f 70 65 72 61 74 6f 72 20 69 6e  such operator in
2540: 63 72 65 6d 65 6e 74 73 20 70 50 61 72 73 65 2d  crements pParse-
2550: 3e 6e 54 61 62 0a 2a 2a 20 74 6f 20 72 65 73 65  >nTab.** to rese
2560: 72 76 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  rve cursor numbe
2570: 72 73 20 66 6f 72 20 69 74 73 20 6f 77 6e 20 75  rs for its own u
2580: 73 65 2e 20 20 42 75 74 20 70 50 61 72 73 65 2d  se.  But pParse-
2590: 3e 6e 54 61 62 0a 2a 2a 20 6e 65 65 64 73 20 74  >nTab.** needs t
25a0: 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 6f 6e  o be constant on
25b0: 63 65 20 77 65 20 62 65 67 69 6e 20 72 65 73 6f  ce we begin reso
25c0: 6c 76 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  lving column nam
25d0: 65 73 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  es.  For.** that
25e0: 20 72 65 61 73 6f 6e 2c 20 74 68 69 73 20 70 72   reason, this pr
25f0: 6f 63 65 64 75 72 65 20 6e 65 65 64 73 20 74 6f  ocedure needs to
2600: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
2610: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ery expression.*
2620: 2a 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 45  * before sqliteE
2630: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 29 20  xprResolveIds() 
2640: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 79  is called on any
2650: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
2660: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65  ** Actually, the
2670: 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 49   processing of I
2680: 4e 2d 53 45 4c 45 43 54 20 69 73 20 6f 6e 6c 79  N-SELECT is only
2690: 20 73 74 61 72 74 65 64 20 62 79 20 74 68 69 73   started by this
26a0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  .** routine.  Th
26b0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
26c0: 61 74 65 73 20 61 20 63 75 72 73 6f 72 20 6e 75  ates a cursor nu
26d0: 6d 62 65 72 20 74 6f 20 74 68 65 20 49 4e 2d 53  mber to the IN-S
26e0: 45 4c 45 43 54 0a 2a 2a 20 61 6e 64 20 74 68 65  ELECT.** and the
26f0: 6e 20 6d 6f 76 65 73 20 6f 6e 2e 20 20 54 68 65  n moves on.  The
2700: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
2710: 20 69 73 20 64 6f 6e 65 20 62 79 20 0a 2a 2a 20   is done by .** 
2720: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
2730: 65 49 64 73 28 29 20 77 68 69 63 68 20 6d 75 73  eIds() which mus
2740: 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  t be called afte
2750: 72 77 61 72 64 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rwards..*/.void 
2760: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
2770: 65 49 6e 53 65 6c 65 63 74 28 50 61 72 73 65 20  eInSelect(Parse 
2780: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
2790: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
27a0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
27b0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
27c0: 3d 54 4b 5f 49 4e 20 26 26 20 70 45 78 70 72 2d  =TK_IN && pExpr-
27d0: 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 7b 0a 20  >pSelect!=0 ){. 
27e0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
27f0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2800: 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
2810: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
2820: 20 29 20 73 71 6c 69 74 65 45 78 70 72 52 65 73   ) sqliteExprRes
2830: 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70 50 61  olveInSelect(pPa
2840: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
2850: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  t);.    if( pExp
2860: 72 2d 3e 70 52 69 67 68 74 20 29 20 73 71 6c 69  r->pRight ) sqli
2870: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53  teExprResolveInS
2880: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
2890: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
28a0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69    if( pExpr->pLi
28b0: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
28c0: 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  i;.      ExprLis
28d0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
28e0: 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 66  ->pList;.      f
28f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
2900: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
2910: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
2920: 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28  ResolveInSelect(
2930: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
2940: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
2950: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
2960: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
2970: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
2980: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
2990: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
29a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
29b0: 6c 69 74 65 49 73 52 6f 77 69 64 28 63 6f 6e 73  liteIsRowid(cons
29c0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
29d0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
29e0: 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
29f0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
2a00: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
2a10: 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20  (z, "ROWID")==0 
2a20: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
2a30: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
2a40: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
2a50: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
2a60: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
2a70: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
2a80: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2a90: 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73  ree and resolves
2aa0: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a   references to.*
2ab0: 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e  * table columns.
2ac0: 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66    Nodes of the f
2ad0: 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20  orm ID.ID or ID 
2ae0: 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a  resolve into an.
2af0: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  ** index to the 
2b00: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62  table in the tab
2b10: 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f  le list and a co
2b20: 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68  lumn offset.  Th
2b30: 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64  e .** Expr.opcod
2b40: 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73  e for such nodes
2b50: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54   is changed to T
2b60: 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45  K_COLUMN.  The E
2b70: 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61  xpr.iTable.** va
2b80: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
2b90: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
2ba0: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
2bb0: 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a  ble in pTabList.
2bc0: 2a 2a 20 70 6c 75 73 20 74 68 65 20 70 50 61 72  ** plus the pPar
2bd0: 73 65 2d 3e 6e 54 61 62 20 76 61 6c 75 65 2e 20  se->nTab value. 
2be0: 20 54 68 69 73 20 76 61 6c 75 65 20 77 69 6c 6c   This value will
2bf0: 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f   ultimately beco
2c00: 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63  me the.** VDBE c
2c10: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2c20: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69   a cursor that i
2c30: 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20  s pointing into 
2c40: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a  the referenced.*
2c50: 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78  * table.  The Ex
2c60: 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  pr.iColumn value
2c70: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74   is changed to t
2c80: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
2c90: 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68  column .** of th
2ca0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
2cb0: 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  le.  The Expr.iC
2cc0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20  olumn value for 
2cd0: 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52  the special.** R
2ce0: 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d  OWID column is -
2cf0: 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20  1.  Any INTEGER 
2d00: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
2d10: 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73 20 61  mn is tried as a
2d20: 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52  n.** alias for R
2d30: 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  OWID..**.** We a
2d40: 6c 73 6f 20 63 68 65 63 6b 20 66 6f 72 20 69 6e  lso check for in
2d50: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 49  stances of the I
2d60: 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 4e 20  N operator.  IN 
2d70: 63 6f 6d 65 73 20 69 6e 20 74 77 6f 0a 2a 2a 20  comes in two.** 
2d80: 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  forms:.**.**    
2d90: 20 20 20 20 20 20 20 65 78 70 72 20 49 4e 20 28         expr IN (
2da0: 65 78 70 72 6c 69 73 74 29 0a 2a 2a 20 61 6e 64  exprlist).** and
2db0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78  .**           ex
2dc0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
2dd0: 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  .).**.** The fir
2de0: 73 74 20 66 6f 72 6d 20 69 73 20 68 61 6e 64 6c  st form is handl
2df0: 65 64 20 62 79 20 63 72 65 61 74 69 6e 67 20 61  ed by creating a
2e00: 20 73 65 74 20 68 6f 6c 64 69 6e 67 20 74 68 65   set holding the
2e10: 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 6f   list.** of allo
2e20: 77 65 64 20 76 61 6c 75 65 73 2e 20 20 54 68 65  wed values.  The
2e30: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 61 75   second form cau
2e40: 73 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 74  ses the SELECT t
2e50: 6f 20 67 65 6e 65 72 61 74 65 20 0a 2a 2a 20 61  o generate .** a
2e60: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2e70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2e80: 74 69 6e 65 20 61 6c 73 6f 20 6c 6f 6f 6b 73 20  tine also looks 
2e90: 66 6f 72 20 73 63 61 6c 61 72 20 53 45 4c 45 43  for scalar SELEC
2ea0: 54 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74  Ts that are part
2eb0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
2ec0: 6e 2e 0a 2a 2a 20 49 66 20 69 74 20 66 69 6e 64  n..** If it find
2ed0: 73 20 61 6e 79 2c 20 69 74 20 67 65 6e 65 72 61  s any, it genera
2ee0: 74 65 73 20 63 6f 64 65 20 74 6f 20 77 72 69 74  tes code to writ
2ef0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2f00: 68 61 74 20 73 65 6c 65 63 74 0a 2a 2a 20 69 6e  hat select.** in
2f10: 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  to a memory cell
2f20: 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f 77 6e 20  ..**.** Unknown 
2f30: 63 6f 6c 75 6d 6e 73 20 6f 72 20 74 61 62 6c 65  columns or table
2f40: 73 20 70 72 6f 76 6f 6b 65 20 61 6e 20 65 72 72  s provoke an err
2f50: 6f 72 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f  or.  The functio
2f60: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  n returns.** the
2f70: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
2f80: 73 20 73 65 65 6e 20 61 6e 64 20 6c 65 61 76 65  s seen and leave
2f90: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
2fa0: 67 65 20 6f 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge on pParse->zE
2fb0: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
2fc0: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
2fd0: 64 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ds(.  Parse *pPa
2fe0: 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
2ff0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
3000: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 61 62  /.  IdList *pTab
3010: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
3020: 66 20 74 61 62 6c 65 73 20 75 73 65 64 20 74 6f  f tables used to
3030: 20 72 65 73 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20   resolve column 
3040: 6e 61 6d 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  names */.  ExprL
3050: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 2f 2a  ist *pEList,  /*
3060: 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   List of express
3070: 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 72 65 73  ions used to res
3080: 6f 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20 20 45  olve "AS" */.  E
3090: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
30a0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
30b0: 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  ion to be analyz
30c0: 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ed. */.){.  if( 
30d0: 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 54 61 62  pExpr==0 || pTab
30e0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
30f0: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   0;.  switch( pE
3100: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
3110: 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66  * A lone identif
3120: 69 65 72 2e 20 20 54 72 79 20 61 6e 64 20 6d 61  ier.  Try and ma
3130: 74 63 68 20 69 74 20 61 73 20 66 6f 6c 6c 6f 77  tch it as follow
3140: 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
3150: 20 20 20 20 20 31 2e 20 20 54 6f 20 74 68 65 20       1.  To the 
3160: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
3170: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   of one of the t
3180: 61 62 6c 65 73 20 69 6e 20 70 54 61 62 4c 69 73  ables in pTabLis
3190: 74 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  t.    **.    ** 
31a0: 20 20 20 20 32 2e 20 20 54 6f 20 74 68 65 20 72      2.  To the r
31b0: 69 67 68 74 20 73 69 64 65 20 6f 66 20 61 6e 20  ight side of an 
31c0: 41 53 20 6b 65 79 77 6f 72 64 20 69 6e 20 74 68  AS keyword in th
31d0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 6f 66  e column list of
31e0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
31f0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
3200: 6e 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70 6c  nt.  (For exampl
3210: 65 2c 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  e, match against
3220: 20 27 78 27 20 69 6e 0a 20 20 20 20 2a 2a 20 20   'x' in.    **  
3230: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 61         "SELECT a
3240: 2b 62 20 41 53 20 27 78 27 20 46 52 4f 4d 20 74  +b AS 'x' FROM t
3250: 31 22 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  1".).    **.    
3260: 2a 2a 20 20 20 20 20 33 2e 20 20 4f 6e 65 20 6f  **     3.  One o
3270: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 6e 61  f the special na
3280: 6d 65 73 20 22 52 4f 57 49 44 22 2c 20 22 4f 49  mes "ROWID", "OI
3290: 44 22 2c 20 6f 72 20 22 5f 52 4f 57 49 44 5f 22  D", or "_ROWID_"
32a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
32b0: 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20  e TK_ID: {.     
32c0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20   int cnt = 0;   
32d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32e0: 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
32f0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
3300: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
3310: 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  er */.      char
3320: 20 2a 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72   *z;.      asser
3330: 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  t( pExpr->token.
3340: 7a 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73  z );.      z = s
3350: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78  qliteStrNDup(pEx
3360: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
3370: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
3380: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
3390: 65 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e(z);.      if( 
33a0: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  z==0 ) return 1;
33b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
33c0: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b  i<pTabList->nId;
33d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
33e0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 54 61  nt j;.        Ta
33f0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
3400: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b  List->a[i].pTab;
3410: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
3420: 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
3430: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
3440: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
3450: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
3460: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
3470: 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  p(pTab->aCol[j].
3480: 7a 4e 61 6d 65 2c 20 7a 29 3d 3d 30 20 29 7b 0a  zName, z)==0 ){.
3490: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b              cnt+
34a0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  +;.            p
34b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
34c0: 20 2b 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   + pParse->nTab;
34d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
34e0: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
34f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3500: 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74   /* Substitute t
3510: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
3520: 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52   for the INTEGER
3530: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a   PRIMARY KEY */.
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
3550: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
3560: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
3570: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
3580: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
3590: 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
35a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
35b0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
35c0: 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
35d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
35e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35f0: 20 63 6e 74 3d 3d 30 20 26 26 20 70 45 4c 69 73   cnt==0 && pELis
3600: 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t!=0 ){.        
3610: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
3620: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74  or(j=0; j<pEList
3630: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
3640: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
3650: 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  As = pEList->a[j
3660: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
3670: 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26     if( zAs!=0 &&
3680: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
3690: 41 73 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  As, z)==0 ){.   
36a0: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
36c0: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
36d0: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
36e0: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
36f0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
3700: 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20   = TK_AS;.      
3710: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
3720: 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
3730: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
3740: 66 74 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  ft = pEList->a[j
3750: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
3760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a     }.        } .
3770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3780: 28 20 63 6e 74 3d 3d 30 20 26 26 20 73 71 6c 69  ( cnt==0 && sqli
3790: 74 65 49 73 52 6f 77 69 64 28 7a 29 20 29 7b 0a  teIsRowid(z) ){.
37a0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
37b0: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
37c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
37d0: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
37e0: 62 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 20 3d  b;.        cnt =
37f0: 20 31 20 2b 20 28 70 54 61 62 4c 69 73 74 2d 3e   1 + (pTabList->
3800: 6e 49 64 3e 31 29 3b 0a 20 20 20 20 20 20 20 20  nId>1);.        
3810: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
3820: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  OLUMN;.      }. 
3830: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
3840: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e  z);.      if( cn
3850: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
3860: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
3870: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
3880: 67 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75  g, "no such colu
3890: 6d 6e 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20  mn: ", -1,  .   
38a0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
38b0: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
38c0: 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ken.n, 0);.     
38d0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
38e0: 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  +;.        retur
38f0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
3900: 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a 20 20   if( cnt>1 ){.  
3910: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
3920: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
3930: 7a 45 72 72 4d 73 67 2c 20 22 61 6d 62 69 67 75  zErrMsg, "ambigu
3940: 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ous column name:
3950: 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20 20   ", -1,  .      
3960: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
3970: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
3980: 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  .n, 0);.        
3990: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
39a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
39b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
39c0: 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 20 20  break; .    }.  
39d0: 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  .    /* A table 
39e0: 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  name and column 
39f0: 6e 61 6d 65 3a 20 20 49 44 2e 49 44 20 2a 2f 0a  name:  ID.ID */.
3a00: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
3a10: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74   {.      int cnt
3a20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
3a30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
3a40: 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
3a50: 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20  int cntTab = 0; 
3a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3a70: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74  er of matching t
3a80: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  ables */.      i
3a90: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
3aa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
3ab0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
3ac0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70   Expr *pLeft, *p
3ad0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 4c 65 66  Right;    /* Lef
3ae0: 74 20 61 6e 64 20 72 69 67 68 74 20 73 75 62 62  t and right subb
3af0: 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20 65  ranches of the e
3b00: 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  xpr */.      cha
3b10: 72 20 2a 7a 4c 65 66 74 2c 20 2a 7a 52 69 67 68  r *zLeft, *zRigh
3b20: 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
3b30: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 2a   an identifier *
3b40: 2f 0a 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d  /..      pLeft =
3b50: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
3b60: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
3b70: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
3b80: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
3b90: 20 26 26 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   && pLeft->op==T
3ba0: 4b 5f 49 44 20 26 26 20 70 4c 65 66 74 2d 3e 74  K_ID && pLeft->t
3bb0: 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20  oken.z );.      
3bc0: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 20 26  assert( pRight &
3bd0: 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  & pRight->op==TK
3be0: 5f 49 44 20 26 26 20 70 52 69 67 68 74 2d 3e 74  _ID && pRight->t
3bf0: 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20  oken.z );.      
3c00: 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 53 74  zLeft = sqliteSt
3c10: 72 4e 44 75 70 28 70 4c 65 66 74 2d 3e 74 6f 6b  rNDup(pLeft->tok
3c20: 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b  en.z, pLeft->tok
3c30: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7a 52 69  en.n);.      zRi
3c40: 67 68 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ght = sqliteStrN
3c50: 44 75 70 28 70 52 69 67 68 74 2d 3e 74 6f 6b 65  Dup(pRight->toke
3c60: 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e 74 6f 6b  n.z, pRight->tok
3c70: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  en.n);.      if(
3c80: 20 7a 4c 65 66 74 3d 3d 30 20 7c 7c 20 7a 52 69   zLeft==0 || zRi
3c90: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
3ca0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 65    sqliteFree(zLe
3cb0: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ft);.        sql
3cc0: 69 74 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b  iteFree(zRight);
3cd0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3ce0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3cf0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
3d00: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
3d10: 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67 68  iteDequote(zRigh
3d20: 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
3d30: 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20  >iTable = -1;.  
3d40: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
3d50: 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  TabList->nId; i+
3d60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
3d70: 6a 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  j;.        char 
3d80: 2a 7a 54 61 62 3b 0a 20 20 20 20 20 20 20 20 54  *zTab;.        T
3d90: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
3da0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
3db0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
3dc0: 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ab==0 ) continue
3dd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
3de0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
3df0: 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ias ){.         
3e00: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
3e10: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20  ->a[i].zAlias;. 
3e20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3e30: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
3e40: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
3e50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
3e60: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
3e70: 7a 54 61 62 2c 20 7a 4c 65 66 74 29 21 3d 30 20  zTab, zLeft)!=0 
3e80: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
3e90: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
3ea0: 61 62 2b 2b 29 20 29 20 70 45 78 70 72 2d 3e 69  ab++) ) pExpr->i
3eb0: 54 61 62 6c 65 20 3d 20 69 20 2b 20 70 50 61 72  Table = i + pPar
3ec0: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 20 20  se->nTab;.      
3ed0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
3ee0: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
3ef0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
3f00: 69 74 65 53 74 72 49 43 6d 70 28 70 54 61 62 2d  iteStrICmp(pTab-
3f10: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
3f20: 7a 52 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20  zRight)==0 ){.  
3f30: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
3f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
3f50: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 2b  pr->iTable = i +
3f60: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
3f70: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
3f80: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
3f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
3fa0: 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65  * Substitute the
3fb0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
3fc0: 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  or the INTEGER P
3fd0: 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20  RIMARY KEY */.  
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
3ff0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  r->iColumn = -1;
4000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
4010: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
4020: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
4030: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
4040: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
4050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4060: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d  }.      if( cnt=
4070: 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20  =0 && cntTab==1 
4080: 26 26 20 73 71 6c 69 74 65 49 73 52 6f 77 69 64  && sqliteIsRowid
4090: 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
40a0: 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20      cnt = 1;.   
40b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
40c0: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
40d0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  }.      sqliteFr
40e0: 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 20 20 20  ee(zLeft);.     
40f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67   sqliteFree(zRig
4100: 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ht);.      if( c
4110: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nt==0 ){.       
4120: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
4130: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
4140: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  sg, "no such col
4150: 75 6d 6e 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20  umn: ", -1,  .  
4160: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
4170: 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74  oken.z, pLeft->t
4180: 6f 6b 65 6e 2e 6e 2c 20 22 2e 22 2c 20 31 2c 20  oken.n, ".", 1, 
4190: 0a 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68  .          pRigh
41a0: 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67  t->token.z, pRig
41b0: 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b  ht->token.n, 0);
41c0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
41d0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
41e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
41f0: 20 7d 65 6c 73 65 20 69 66 28 20 63 6e 74 3e 31   }else if( cnt>1
4200: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4210: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
4220: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
4230: 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e  ambiguous column
4240: 20 6e 61 6d 65 3a 20 22 2c 20 2d 31 2c 20 20 0a   name: ", -1,  .
4250: 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d            pLeft-
4260: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d  >token.z, pLeft-
4270: 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 2e 22 2c 20 31  >token.n, ".", 1
4280: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 52 69 67  ,.          pRig
4290: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69  ht->token.z, pRi
42a0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29  ght->token.n, 0)
42b0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
42c0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
42d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
42e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
42f0: 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74  ExprDelete(pLeft
4300: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
4310: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20  pLeft = 0;.     
4320: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
4330: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  e(pRight);.     
4340: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
4350: 20 30 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   0;.      pExpr-
4360: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
4370: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4380: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
4390: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 56 64 62  _IN: {.      Vdb
43a0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74  e *v = sqliteGet
43b0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
43c0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
43d0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 69  eturn 1;.      i
43e0: 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
43f0: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
4400: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
4410: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  , pExpr->pLeft) 
4420: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4430: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
4440: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
4450: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
4460: 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
4470: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
4480: 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
4490: 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
44a0: 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
44b0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
44c0: 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
44d0: 20 61 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20   a temporary.   
44e0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20       ** table.  
44f0: 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
4500: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
4510: 72 79 20 74 61 62 6c 65 20 68 61 73 20 61 6c 72  ry table has alr
4520: 65 61 64 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  eady.        ** 
4530: 62 65 65 6e 20 70 75 74 20 69 6e 20 69 54 61 62  been put in iTab
4540: 6c 65 20 62 79 20 73 71 6c 69 74 65 45 78 70 72  le by sqliteExpr
4550: 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28  ResolveInSelect(
4560: 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
4570: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4580: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
4590: 54 65 6d 70 2c 20 70 45 78 70 72 2d 3e 69 54 61  Temp, pExpr->iTa
45a0: 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ble, 1);.       
45b0: 20 69 66 28 20 73 71 6c 69 74 65 53 65 6c 65 63   if( sqliteSelec
45c0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
45d0: 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 53 65  >pSelect, SRT_Se
45e0: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
45f0: 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ) );.      }else
4600: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73   if( pExpr->pLis
4610: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
4620: 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
4630: 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
4640: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
4650: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 73 65    ** Create a se
4660: 74 20 74 6f 20 70 75 74 20 74 68 65 20 65 78 70  t to put the exp
4670: 72 6c 69 73 74 20 76 61 6c 75 65 73 20 69 6e 2e  rlist values in.
4680: 20 20 54 68 65 20 53 65 74 20 69 64 20 69 73 20    The Set id is 
4690: 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a  stored.        *
46a0: 2a 20 69 6e 20 69 54 61 62 6c 65 2e 0a 20 20 20  * in iTable..   
46b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
46c0: 69 6e 74 20 69 2c 20 69 53 65 74 3b 0a 20 20 20  int i, iSet;.   
46d0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
46e0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
46f0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
4700: 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
4710: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
4720: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
4730: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
4740: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
4750: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
4760: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
4770: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
4780: 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
4790: 20 20 20 22 72 69 67 68 74 2d 68 61 6e 64 20 73     "right-hand s
47a0: 69 64 65 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ide of IN operat
47b0: 6f 72 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  or must be const
47c0: 61 6e 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ant", 0);.      
47d0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
47e0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  rr++;.          
47f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4810: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
4820: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
4830: 32 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  2, 0, 0) ){.    
4840: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
4850: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4870: 69 53 65 74 20 3d 20 70 45 78 70 72 2d 3e 69 54  iSet = pExpr->iT
4880: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
4890: 53 65 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66  Set++;.        f
48a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d  or(i=0; i<pExpr-
48b0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
48c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
48d0: 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72  xpr *pE2 = pExpr
48e0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
48f0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
4900: 77 69 74 63 68 28 20 70 45 32 2d 3e 6f 70 20 29  witch( pE2->op )
4910: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  {.            ca
4920: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
4930: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
4940: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
4950: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54        case TK_ST
4960: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 20 20  RING: {.        
4970: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
4980: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4990: 28 76 2c 20 4f 50 5f 53 65 74 49 6e 73 65 72 74  (v, OP_SetInsert
49a0: 2c 20 69 53 65 74 2c 20 30 29 3b 0a 20 20 20 20  , iSet, 0);.    
49b0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
49c0: 28 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  ( pE2->token.z )
49d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
49e0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
49f0: 50 33 28 76 2c 20 61 64 64 72 2c 20 70 45 32 2d  P3(v, addr, pE2-
4a00: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 32 2d 3e 74  >token.z, pE2->t
4a10: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20  oken.n);.       
4a20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
4a30: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
4a40: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  dr);.           
4a50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4a70: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
4a90: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
4aa0: 73 65 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20  se, pE2);.      
4ab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4ac0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
4ad0: 74 49 6e 73 65 72 74 2c 20 69 53 65 74 2c 20 30  tInsert, iSet, 0
4ae0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
4af0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4b10: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
4b20: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4b30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4b40: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
4b50: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20      /* This has 
4b60: 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53  to be a scalar S
4b70: 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65  ELECT.  Generate
4b80: 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
4b90: 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  .      ** value 
4ba0: 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69  of this select i
4bb0: 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  n a memory cell 
4bc0: 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e  and record the n
4bd0: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f  umber.      ** o
4be0: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
4bf0: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
4c00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
4c10: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50  pr->iColumn = pP
4c20: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
4c30: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 65      if( sqliteSe
4c40: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
4c50: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  pr->pSelect, SRT
4c60: 5f 4d 65 6d 2c 20 70 45 78 70 72 2d 3e 69 43 6f  _Mem, pExpr->iCo
4c70: 6c 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  lumn) ){.       
4c80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
4c90: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
4ca0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f      }..    /* Fo
4cb0: 72 20 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74  r all else, just
4cc0: 20 72 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c   recursively wal
4cd0: 6b 20 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20  k the tree */.  
4ce0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
4cf0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
4d00: 65 66 74 0a 20 20 20 20 20 20 26 26 20 73 71 6c  eft.      && sql
4d10: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
4d20: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
4d30: 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70  st, pEList, pExp
4d40: 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  r->pLeft) ){.   
4d50: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4d60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4d70: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 0a   pExpr->pRight .
4d80: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 45        && sqliteE
4d90: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
4da0: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
4db0: 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70  pEList, pExpr->p
4dc0: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
4dd0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4de0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
4df0: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
4e00: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
4e10: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
4e20: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
4e30: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
4e40: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
4e50: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
4e60: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
4e70: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
4e80: 50 61 72 73 65 2c 70 54 61 62 4c 69 73 74 2c 70  Parse,pTabList,p
4e90: 45 4c 69 73 74 2c 70 4c 69 73 74 2d 3e 61 5b 69  EList,pList->a[i
4ea0: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
4eb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
4ec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4ed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4ee0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4ef0: 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 20 30 20 2f  rn 0;.}..#if 0 /
4f00: 2a 20 4e 4f 54 20 55 53 45 44 20 2a 2f 0a 2f 2a  * NOT USED */./*
4f10: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 61 20 74 6f  .** Compare a to
4f20: 6b 65 6e 20 61 67 61 69 6e 73 74 20 61 20 73 74  ken against a st
4f30: 72 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 54 52  ring.  Return TR
4f40: 55 45 20 69 66 20 74 68 65 79 20 6d 61 74 63 68  UE if they match
4f50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4f60: 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6d 70 28 54  sqliteTokenCmp(T
4f70: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 63 6f  oken *pToken, co
4f80: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b  nst char *zStr){
4f90: 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65  .  int n = strle
4fa0: 6e 28 7a 53 74 72 29 3b 0a 20 20 69 66 28 20 6e  n(zStr);.  if( n
4fb0: 21 3d 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 72 65  !=pToken->n ) re
4fc0: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
4fd0: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
4fe0: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 7a 53 74 72 2c  pToken->z, zStr,
4ff0: 20 6e 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66   n)==0;.}.#endif
5000: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
5010: 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  a function name 
5020: 69 6e 74 6f 20 69 74 73 20 69 6e 74 65 67 65 72  into its integer
5030: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 52 65   identifier.  Re
5040: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 69 64 65 6e  turn the.** iden
5050: 74 69 66 69 65 72 2e 20 20 52 65 74 75 72 6e 20  tifier.  Return 
5060: 46 4e 5f 55 6e 6b 6e 6f 77 6e 20 69 66 20 74 68  FN_Unknown if th
5070: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
5080: 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2f 0a 69  is unknown..*/.i
5090: 6e 74 20 73 71 6c 69 74 65 46 75 6e 63 49 64 28  nt sqliteFuncId(
50a0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
50b0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
50c0: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
50d0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69  r *zName;.     i
50e0: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 69 6e 74  nt len;.     int
50f0: 20 69 64 3b 0a 20 20 7d 20 61 46 75 6e 63 5b 5d   id;.  } aFunc[]
5100: 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 63 6f 75   = {.     { "cou
5110: 6e 74 22 2c 20 20 35 2c 20 46 4e 5f 43 6f 75 6e  nt",  5, FN_Coun
5120: 74 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 69  t  },.     { "mi
5130: 6e 22 2c 20 20 20 20 33 2c 20 46 4e 5f 4d 69 6e  n",    3, FN_Min
5140: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d      },.     { "m
5150: 61 78 22 2c 20 20 20 20 33 2c 20 46 4e 5f 4d 61  ax",    3, FN_Ma
5160: 78 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  x    },.     { "
5170: 73 75 6d 22 2c 20 20 20 20 33 2c 20 46 4e 5f 53  sum",    3, FN_S
5180: 75 6d 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  um    },.     { 
5190: 22 61 76 67 22 2c 20 20 20 20 33 2c 20 46 4e 5f  "avg",    3, FN_
51a0: 41 76 67 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  Avg    },.     {
51b0: 20 22 6c 65 6e 67 74 68 22 2c 20 36 2c 20 46 4e   "length", 6, FN
51c0: 5f 4c 65 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20  _Length },.     
51d0: 7b 20 22 73 75 62 73 74 72 22 2c 20 36 2c 20 46  { "substr", 6, F
51e0: 4e 5f 53 75 62 73 74 72 20 7d 2c 0a 20 20 20 20  N_Substr },.    
51f0: 20 7b 20 22 61 62 73 22 2c 20 20 20 20 33 2c 20   { "abs",    3, 
5200: 46 4e 5f 41 62 73 20 20 20 20 7d 2c 0a 20 20 20  FN_Abs    },.   
5210: 20 20 7b 20 22 72 6f 75 6e 64 22 2c 20 20 35 2c    { "round",  5,
5220: 20 46 4e 5f 52 6f 75 6e 64 20 20 7d 2c 0a 20 20   FN_Round  },.  
5230: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  };.  int i;.  fo
5240: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
5250: 7a 65 28 61 46 75 6e 63 29 3b 20 69 2b 2b 29 7b  ze(aFunc); i++){
5260: 0a 20 20 20 20 69 66 28 20 61 46 75 6e 63 5b 69  .    if( aFunc[i
5270: 5d 2e 6c 65 6e 3d 3d 70 54 6f 6b 65 6e 2d 3e 6e  ].len==pToken->n
5280: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
5290: 53 74 72 4e 49 43 6d 70 28 70 54 6f 6b 65 6e 2d  StrNICmp(pToken-
52a0: 3e 7a 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a 4e 61  >z, aFunc[i].zNa
52b0: 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e 6c 65 6e  me, aFunc[i].len
52c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 72  )==0 ){.       r
52d0: 65 74 75 72 6e 20 61 46 75 6e 63 5b 69 5d 2e 69  eturn aFunc[i].i
52e0: 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  d;.    }.  }.  r
52f0: 65 74 75 72 6e 20 46 4e 5f 55 6e 6b 6e 6f 77 6e  eturn FN_Unknown
5300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72  ;.}../*.** Error
5310: 20 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74   check the funct
5320: 69 6f 6e 73 20 69 6e 20 61 6e 20 65 78 70 72 65  ions in an expre
5330: 73 73 69 6f 6e 2e 20 20 4d 61 6b 65 20 73 75 72  ssion.  Make sur
5340: 65 20 61 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f  e all.** functio
5350: 6e 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f  n names are reco
5360: 67 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66  gnized and all f
5370: 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 74 68  unctions have th
5380: 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6e 75 6d  e correct.** num
5390: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
53a0: 2e 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f  .  Leave an erro
53b0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
53c0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20  rse->zErrMsg.** 
53d0: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61  if anything is a
53e0: 6d 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68  miss.  Return th
53f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
5400: 72 73 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49 73  rs..**.** if pIs
5410: 41 67 67 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20  Agg is not null 
5420: 61 6e 64 20 74 68 69 73 20 65 78 70 72 65 73 73  and this express
5430: 69 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67  ion is an aggreg
5440: 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
5450: 28 6c 69 6b 65 20 63 6f 75 6e 74 28 2a 29 20 6f  (like count(*) o
5460: 72 20 6d 61 78 28 76 61 6c 75 65 29 29 20 74 68  r max(value)) th
5470: 65 6e 20 77 72 69 74 65 20 61 20 31 20 69 6e 74  en write a 1 int
5480: 6f 20 2a 70 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e  o *pIsAgg..*/.in
5490: 74 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  t sqliteExprChec
54a0: 6b 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  k(Parse *pParse,
54b0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
54c0: 74 20 61 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20  t allowAgg, int 
54d0: 2a 70 49 73 41 67 67 29 7b 0a 20 20 69 6e 74 20  *pIsAgg){.  int 
54e0: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  nErr = 0;.  if( 
54f0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
5500: 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  n 0;.  switch( p
5510: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
5520: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
5530: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  : {.      int id
5540: 20 3d 20 73 71 6c 69 74 65 46 75 6e 63 49 64 28   = sqliteFuncId(
5550: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
5560: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45        int n = pE
5570: 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78  xpr->pList ? pEx
5580: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
5590: 20 3a 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   : 0;.      int 
55a0: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
55b0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 6f 5f  ;.      int too_
55c0: 6d 61 6e 79 5f 61 72 67 73 20 3d 20 30 3b 0a 20  many_args = 0;. 
55d0: 20 20 20 20 20 69 6e 74 20 74 6f 6f 5f 66 65 77       int too_few
55e0: 5f 61 72 67 73 20 3d 20 30 3b 0a 20 20 20 20 20  _args = 0;.     
55f0: 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   int wrong_num_a
5600: 72 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rgs = 0;.      i
5610: 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20  nt is_agg = 0;. 
5620: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
5630: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
5640: 20 3d 20 69 64 3b 0a 20 20 20 20 20 20 73 77 69   = id;.      swi
5650: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 20  tch( id ){.     
5660: 20 20 20 63 61 73 65 20 46 4e 5f 55 6e 6b 6e 6f     case FN_Unkno
5670: 77 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  wn: {.          
5680: 55 73 65 72 46 75 6e 63 20 2a 70 55 73 65 72 20  UserFunc *pUser 
5690: 3d 20 73 71 6c 69 74 65 46 69 6e 64 55 73 65 72  = sqliteFindUser
56a0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
56b0: 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
56c0: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
56d0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
56e0: 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , n, 0);.       
56f0: 20 20 20 69 66 28 20 70 55 73 65 72 3d 3d 30 20     if( pUser==0 
5700: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
5710: 55 73 65 72 20 3d 20 73 71 6c 69 74 65 46 69 6e  User = sqliteFin
5720: 64 55 73 65 72 46 75 6e 63 74 69 6f 6e 28 70 50  dUserFunction(pP
5730: 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
5740: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
5750: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
5760: 74 6f 6b 65 6e 2e 6e 2c 20 2d 31 2c 20 30 29 3b  token.n, -1, 0);
5770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
5780: 20 70 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20   pUser==0 ){.   
5790: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75             no_su
57a0: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
57b0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72                wr
57d0: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31  ong_num_args = 1
57e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
57f0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
5800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 5f  .            is_
5810: 61 67 67 20 3d 20 70 55 73 65 72 2d 3e 78 46 75  agg = pUser->xFu
5820: 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  nc==0;.         
5830: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
5840: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5850: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 43 6f        case FN_Co
5860: 75 6e 74 3a 20 7b 20 0a 20 20 20 20 20 20 20 20  unt: { .        
5870: 20 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73 20    too_many_args 
5880: 3d 20 6e 3e 31 3b 0a 20 20 20 20 20 20 20 20 20  = n>1;.         
5890: 20 69 73 5f 61 67 67 20 3d 20 31 3b 0a 20 20 20   is_agg = 1;.   
58a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
58b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
58c0: 63 61 73 65 20 46 4e 5f 4d 61 78 3a 0a 20 20 20  case FN_Max:.   
58d0: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4d 69 6e       case FN_Min
58e0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 74 6f  : {.          to
58f0: 6f 5f 66 65 77 5f 61 72 67 73 20 3d 20 6e 3c 31  o_few_args = n<1
5900: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 73 5f 61  ;.          is_a
5910: 67 67 20 3d 20 6e 3d 3d 31 3b 0a 20 20 20 20 20  gg = n==1;.     
5920: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5930: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5940: 73 65 20 46 4e 5f 41 76 67 3a 0a 20 20 20 20 20  se FN_Avg:.     
5950: 20 20 20 63 61 73 65 20 46 4e 5f 53 75 6d 3a 20     case FN_Sum: 
5960: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f  {.          too_
5970: 6d 61 6e 79 5f 61 72 67 73 20 3d 20 6e 3e 31 3b  many_args = n>1;
5980: 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 66  .          too_f
5990: 65 77 5f 61 72 67 73 20 3d 20 6e 3c 31 3b 0a 20  ew_args = n<1;. 
59a0: 20 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20           is_agg 
59b0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
59c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
59d0: 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f          case FN_
59e0: 41 62 73 3a 0a 20 20 20 20 20 20 20 20 63 61 73  Abs:.        cas
59f0: 65 20 46 4e 5f 4c 65 6e 67 74 68 3a 20 7b 0a 20  e FN_Length: {. 
5a00: 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 66 65 77           too_few
5a10: 5f 61 72 67 73 20 3d 20 6e 3c 31 3b 0a 20 20 20  _args = n<1;.   
5a20: 20 20 20 20 20 20 20 74 6f 6f 5f 6d 61 6e 79 5f         too_many_
5a30: 61 72 67 73 20 3d 20 6e 3e 31 3b 0a 20 20 20 20  args = n>1;.    
5a40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5a50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
5a60: 61 73 65 20 46 4e 5f 52 6f 75 6e 64 3a 20 7b 0a  ase FN_Round: {.
5a70: 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 66 65            too_fe
5a80: 77 5f 61 72 67 73 20 3d 20 6e 3c 31 3b 0a 20 20  w_args = n<1;.  
5a90: 20 20 20 20 20 20 20 20 74 6f 6f 5f 6d 61 6e 79          too_many
5aa0: 5f 61 72 67 73 20 3d 20 6e 3e 32 3b 0a 20 20 20  _args = n>2;.   
5ab0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5ad0: 63 61 73 65 20 46 4e 5f 53 75 62 73 74 72 3a 20  case FN_Substr: 
5ae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f  {.          too_
5af0: 66 65 77 5f 61 72 67 73 20 3d 20 6e 3c 33 3b 0a  few_args = n<3;.
5b00: 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 6d 61            too_ma
5b10: 6e 79 5f 61 72 67 73 20 3d 20 6e 3e 33 3b 0a 20  ny_args = n>3;. 
5b20: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5b30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5b40: 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
5b50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5b60: 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 61  if( is_agg && !a
5b70: 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20  llowAgg ){.     
5b80: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
5b90: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
5ba0: 72 4d 73 67 2c 20 22 6d 69 73 75 73 65 20 6f 66  rMsg, "misuse of
5bb0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
5bc0: 69 6f 6e 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20  ion ", -1,.     
5bd0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
5be0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
5bf0: 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c 20 30  en.n, "()", 2, 0
5c00: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
5c10: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5c20: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
5c30: 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20     is_agg = 0;. 
5c40: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
5c50: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20  o_such_func ){. 
5c60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
5c70: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
5c80: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
5c90: 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 22 2c 20  ch function: ", 
5ca0: 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  -1,.           p
5cb0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
5cc0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30  Expr->token.n, 0
5cd0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
5ce0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5cf0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
5d00: 20 7d 65 6c 73 65 20 69 66 28 20 74 6f 6f 5f 6d   }else if( too_m
5d10: 61 6e 79 5f 61 72 67 73 20 29 7b 0a 20 20 20 20  any_args ){.    
5d20: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
5d30: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
5d40: 72 72 4d 73 67 2c 20 22 74 6f 6f 20 6d 61 6e 79  rrMsg, "too many
5d50: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
5d60: 6e 63 74 69 6f 6e 20 22 2c 2d 31 2c 0a 20 20 20  nction ",-1,.   
5d70: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
5d80: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
5d90: 6f 6b 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c  oken.n, "()", 2,
5da0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
5db0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
5dc0: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
5dd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 6f 6f     }else if( too
5de0: 5f 66 65 77 5f 61 72 67 73 20 29 7b 0a 20 20 20  _few_args ){.   
5df0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
5e00: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
5e10: 45 72 72 4d 73 67 2c 20 22 74 6f 6f 20 66 65 77  ErrMsg, "too few
5e20: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
5e30: 6e 63 74 69 6f 6e 20 22 2c 2d 31 2c 0a 20 20 20  nction ",-1,.   
5e40: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
5e50: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
5e60: 6f 6b 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c  oken.n, "()", 2,
5e70: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
5e80: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
5e90: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
5ea0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f     }else if( wro
5eb0: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20  ng_num_args ){. 
5ec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
5ed0: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
5ee0: 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20  >zErrMsg, .     
5ef0: 20 20 20 20 20 20 22 77 72 6f 6e 67 20 6e 75 6d        "wrong num
5f00: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
5f10: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 22 2c 2d   to function ",-
5f20: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 45  1,.           pE
5f30: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
5f40: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 28  xpr->token.n, "(
5f50: 29 22 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  )", 2, 0);.     
5f60: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5f70: 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  +;.        nErr+
5f80: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
5f90: 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 45   if( is_agg ) pE
5fa0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
5fb0: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20  _FUNCTION;.     
5fc0: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 70   if( is_agg && p
5fd0: 49 73 41 67 67 20 29 20 2a 70 49 73 41 67 67 20  IsAgg ) *pIsAgg 
5fe0: 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 1;.      for(i
5ff0: 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69  =0; nErr==0 && i
6000: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
6010: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45    nErr = sqliteE
6020: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
6030: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
6040: 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20  [i].pExpr,.     
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 41            allowA
6070: 67 67 20 26 26 20 21 69 73 5f 61 67 67 2c 20 70  gg && !is_agg, p
6080: 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a  IsAgg);.      }.
6090: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
60a0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
60b0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
60c0: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
60d0: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
60e0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
60f0: 66 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49  ft, allowAgg, pI
6100: 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sAgg);.      }. 
6110: 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30       if( nErr==0
6120: 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
6130: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72  t ){.        nEr
6140: 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 43 68  r = sqliteExprCh
6150: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70  eck(pParse, pExp
6160: 72 2d 3e 70 52 69 67 68 74 2c 20 61 6c 6c 6f 77  r->pRight, allow
6170: 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20  Agg, pIsAgg);.  
6180: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6190: 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72  nErr==0 && pExpr
61a0: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
61b0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
61c0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  ->pList->nExpr;.
61d0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
61e0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
61f0: 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20  nErr==0 && i<n; 
6200: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
6210: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70  Expr *pE2 = pExp
6220: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
6230: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
6240: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70  nErr = sqliteExp
6250: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
6260: 45 32 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49  E2, allowAgg, pI
6270: 73 41 67 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  sAgg);.        }
6280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6290: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
62a0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d    return nErr;.}
62b0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
62c0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
62d0: 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
62e0: 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
62f0: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
6300: 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65  and leave the re
6310: 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  sult on the top 
6320: 6f 66 20 73 74 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  of stack..*/.voi
6330: 64 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65  d sqliteExprCode
6340: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6350: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
6360: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
6370: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
6380: 70 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  p;.  if( v==0 ||
6390: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
63a0: 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  rn;.  switch( pE
63b0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
63c0: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20  ase TK_PLUS:    
63d0: 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20 20 20   op = OP_Add;   
63e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
63f0: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 20  se TK_MINUS:    
6400: 6f 70 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74  op = OP_Subtract
6410: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6420: 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 20 6f  e TK_STAR:     o
6430: 70 20 3d 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3b  p = OP_Multiply;
6440: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6450: 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 20 6f 70   TK_SLASH:    op
6460: 20 3d 20 4f 50 5f 44 69 76 69 64 65 3b 20 20 20   = OP_Divide;   
6470: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6480: 54 4b 5f 41 4e 44 3a 20 20 20 20 20 20 6f 70 20  TK_AND:      op 
6490: 3d 20 4f 50 5f 41 6e 64 3b 20 20 20 20 20 20 62  = OP_And;      b
64a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
64b0: 4b 5f 4f 52 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_OR:       op =
64c0: 20 4f 50 5f 4f 72 3b 20 20 20 20 20 20 20 62 72   OP_Or;       br
64d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
64e0: 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _LT:       op = 
64f0: 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Lt;       bre
6500: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
6510: 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LE:       op = O
6520: 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Le;       brea
6530: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
6540: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
6550: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
6560: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
6570: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
6580: 47 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Ge;       break;
6590: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
65a0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e         op = OP_N
65b0: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
65c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
65d0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
65e0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
65f0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a     case TK_LIKE:
6600: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 69 6b       op = OP_Lik
6610: 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e;     break;.  
6620: 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20    case TK_GLOB: 
6630: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 6c 6f 62      op = OP_Glob
6640: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
6650: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
6660: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c     op = OP_IsNul
6670: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
6680: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
6690: 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c    op = OP_NotNul
66a0: 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  l;  break;.    c
66b0: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20  ase TK_NOT:     
66c0: 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 3b 20 20 20   op = OP_Not;   
66d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
66e0: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 20  se TK_UMINUS:   
66f0: 6f 70 20 3d 20 4f 50 5f 4e 65 67 61 74 69 76 65  op = OP_Negative
6700: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
6710: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 20 6f  e TK_BITAND:   o
6720: 70 20 3d 20 4f 50 5f 42 69 74 41 6e 64 3b 20 20  p = OP_BitAnd;  
6730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6740: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 20 6f 70   TK_BITOR:    op
6750: 20 3d 20 4f 50 5f 42 69 74 4f 72 3b 20 20 20 20   = OP_BitOr;    
6760: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6770: 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 20 6f 70 20  TK_BITNOT:   op 
6780: 3d 20 4f 50 5f 42 69 74 4e 6f 74 3b 20 20 20 62  = OP_BitNot;   b
6790: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
67a0: 4b 5f 4c 53 48 49 46 54 3a 20 20 20 6f 70 20 3d  K_LSHIFT:   op =
67b0: 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3b 20 20   OP_ShiftLeft;  
67c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
67d0: 54 4b 5f 52 53 48 49 46 54 3a 20 20 20 6f 70 20  TK_RSHIFT:   op 
67e0: 3d 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3b  = OP_ShiftRight;
67f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6800: 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 20 6f 70   TK_REM:      op
6810: 20 3d 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3b   = OP_Remainder;
6820: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
6830: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
6840: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
6850: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
6860: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
6870: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
6880: 75 73 65 41 67 67 20 29 7b 0a 20 20 20 20 20 20  useAgg ){.      
6890: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
68a0: 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20  p(v, OP_AggGet, 
68b0: 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b  0, pExpr->iAgg);
68c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
68d0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
68e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
68f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6900: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70   OP_Column, pExp
6910: 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
6920: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
6930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6940: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6950: 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 70 45  (v, OP_Recno, pE
6960: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
6970: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6980: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6990: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
69a0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
69b0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
69c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
69d0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
69e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
69f0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b  Expr->token.z );
6a00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6a10: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
6a20: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
6a30: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
6a40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6a50: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
6a60: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
6a70: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
6a80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6a90: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
6aa0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6ab0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b  Expr->token.z );
6ac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6ad0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
6ae0: 72 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r, pExpr->token.
6af0: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
6b00: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
6b10: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
6b20: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
6b30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6b40: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
6b50: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6b60: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
6b70: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
6b80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6b90: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
6ba0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
6bb0: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
6bc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
6bd0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
6be0: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
6bf0: 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
6c00: 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
6c10: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
6c20: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
6c30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
6c40: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
6c50: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
6c60: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
6c70: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
6c80: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
6c90: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6ca0: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
6cb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6cc0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  }.    case TK_LS
6cd0: 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
6ce0: 4b 5f 52 53 48 49 46 54 3a 20 7b 0a 20 20 20 20  K_RSHIFT: {.    
6cf0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6d00: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
6d10: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
6d20: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
6d30: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
6d40: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
6d50: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
6d60: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
6d70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6d80: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
6d90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
6da0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
6db0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
6dc0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
6dd0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
6de0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
6df0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6e00: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32  (v, OP_Concat, 2
6e10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
6e20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6e30: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
6e40: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
6e50: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
6e60: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
6e70: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
6e80: 65 20 54 4b 5f 45 51 3a 20 0a 20 20 20 20 63 61  e TK_EQ: .    ca
6e90: 73 65 20 54 4b 5f 4c 49 4b 45 3a 20 0a 20 20 20  se TK_LIKE: .   
6ea0: 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b   case TK_GLOB: {
6eb0: 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b  .      int dest;
6ec0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6ed0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
6ee0: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
6ef0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
6f00: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
6f10: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
6f20: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
6f30: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
6f40: 67 68 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74  ght);.      dest
6f50: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72   = sqliteVdbeCur
6f60: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
6f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6f80: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
6f90: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
6fa0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6fb0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20   OP_AddImm, -1, 
6fc0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
6fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6fe0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
6ff0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
7000: 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ->pLeft );.     
7010: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
7020: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
7030: 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  || pExpr->pLeft-
7040: 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
7050: 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e  ){.        Token
7060: 20 2a 70 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c   *p = &pExpr->pL
7070: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
7080: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
7090: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e  liteMalloc( p->n
70a0: 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20   + 2 );.        
70b0: 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a  sprintf(z, "-%.*
70c0: 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b  s", p->n, p->z);
70d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
70e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
70f0: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
7100: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7110: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
7120: 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20  z, p->n+1);.    
7130: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
7140: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
7150: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7160: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
7170: 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20  into TK_NOT */. 
7180: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7190: 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
71a0: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
71b0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
71c0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
71d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
71e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
71f0: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
7200: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7210: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
7220: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
7230: 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
7240: 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  int dest;.      
7250: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7260: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
7270: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7280: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
7290: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
72a0: 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20 73  ;.      dest = s
72b0: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
72c0: 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20  Addr(v) + 2;.   
72d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
72e0: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73  Op(v, op, 0, des
72f0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
7300: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7310: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a  AddImm, -1, 0);.
7320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7330: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
7340: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
7350: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7360: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65  ddOp(v, OP_AggGe
7370: 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67  t, 0, pExpr->iAg
7380: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  g);.      if( pE
7390: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 46 4e  xpr->iColumn==FN
73a0: 5f 41 76 67 20 29 7b 0a 20 20 20 20 20 20 20 20  _Avg ){.        
73b0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
73c0: 69 41 67 67 43 6f 75 6e 74 3e 3d 30 20 26 26 20  iAggCount>=0 && 
73d0: 70 50 61 72 73 65 2d 3e 69 41 67 67 43 6f 75 6e  pParse->iAggCoun
73e0: 74 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29  t<pParse->nAgg )
73f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7400: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7410: 41 67 67 47 65 74 2c 20 30 2c 20 70 50 61 72 73  AggGet, 0, pPars
7420: 65 2d 3e 69 41 67 67 43 6f 75 6e 74 29 3b 0a 20  e->iAggCount);. 
7430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
7440: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 76  eAddOp(v, OP_Div
7450: 69 64 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ide, 0, 0);.    
7460: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7470: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7480: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
7490: 20 20 20 20 20 69 6e 74 20 69 64 20 3d 20 70 45       int id = pE
74a0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
74b0: 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20      int op;.    
74c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45    int i;.      E
74d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
74e0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
74f0: 20 20 20 20 20 73 77 69 74 63 68 28 20 69 64 20       switch( id 
7500: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
7510: 46 4e 5f 4d 69 6e 3a 20 0a 20 20 20 20 20 20 20  FN_Min: .       
7520: 20 63 61 73 65 20 46 4e 5f 4d 61 78 3a 20 7b 0a   case FN_Max: {.
7530: 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20 69            op = i
7540: 64 3d 3d 46 4e 5f 4d 69 6e 20 3f 20 4f 50 5f 4d  d==FN_Min ? OP_M
7550: 69 6e 20 3a 20 4f 50 5f 4d 61 78 3b 0a 20 20 20  in : OP_Max;.   
7560: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
7570: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
7580: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
7590: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
75a0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
75b0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
75c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
75d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
75e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
75f0: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
7600: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7620: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7630: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
7640: 65 20 46 4e 5f 41 62 73 3a 20 7b 0a 20 20 20 20  e FN_Abs: {.    
7650: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
7660: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
7670: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
7680: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7690: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
76a0: 5f 41 62 73 56 61 6c 75 65 2c 20 30 2c 20 30 29  _AbsValue, 0, 0)
76b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
76c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
76d0: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 52 6f 75       case FN_Rou
76e0: 6e 64 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  nd: {.          
76f0: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
7700: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==2 ){.         
7710: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
7720: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
7730: 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
7740: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7750: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
7760: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7770: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
7780: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7790: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
77a0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
77b0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
77c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
77d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
77e0: 50 5f 50 72 65 63 69 73 69 6f 6e 2c 20 30 2c 20  P_Precision, 0, 
77f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
7800: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
7810: 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4c         case FN_L
7820: 65 6e 67 74 68 3a 20 7b 0a 20 20 20 20 20 20 20  ength: {.       
7830: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
7840: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
7850: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
7860: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
7870: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
7880: 72 6c 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rlen, 0, 0);.   
7890: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
78a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
78b0: 63 61 73 65 20 46 4e 5f 53 75 62 73 74 72 3a 20  case FN_Substr: 
78c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
78d0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
78e0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
78f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
7900: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
7910: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
7920: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
7930: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
7940: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 75  beAddOp(v, OP_Su
7950: 62 73 74 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  bstr, 0, 0);.   
7960: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7980: 63 61 73 65 20 46 4e 5f 55 6e 6b 6e 6f 77 6e 3a  case FN_Unknown:
7990: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 55 73 65   {.          Use
79a0: 72 46 75 6e 63 20 2a 70 55 73 65 72 3b 0a 20 20  rFunc *pUser;.  
79b0: 20 20 20 20 20 20 20 20 70 55 73 65 72 20 3d 20          pUser = 
79c0: 73 71 6c 69 74 65 46 69 6e 64 55 73 65 72 46 75  sqliteFindUserFu
79d0: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
79e0: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
79f0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7a00: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
7a10: 74 6f 6b 65 6e 2e 6e 2c 20 70 4c 69 73 74 2d 3e  token.n, pList->
7a20: 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  nExpr, 0);.     
7a30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55 73       assert( pUs
7a40: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  er!=0 );.       
7a50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
7a60: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
7a70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
7a80: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
7a90: 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
7aa0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
7ab0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
7ac0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7ad0: 2c 20 4f 50 5f 55 73 65 72 46 75 6e 63 2c 20 70  , OP_UserFunc, p
7ae0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  List->nExpr, 0);
7af0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7b00: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7b10: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 55 73 65   -1, (char*)pUse
7b20: 72 2d 3e 78 46 75 6e 63 2c 20 50 33 5f 50 4f 49  r->xFunc, P3_POI
7b30: 4e 54 45 52 29 3b 0a 20 20 20 20 20 20 20 20 20  NTER);.         
7b40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7b50: 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  }.        defaul
7b60: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  t: {.          /
7b70: 2a 20 43 61 6e 27 74 20 68 61 70 70 65 6e 21 20  * Can't happen! 
7b80: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  */.          bre
7b90: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
7ba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7bb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7bc0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
7bd0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7be0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
7bf0: 61 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ad, pExpr->iColu
7c00: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  mn, 0);.      br
7c10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7c20: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
7c30: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
7c40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7c50: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
7c60: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
7c70: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
7c80: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
7c90: 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ft);.      addr 
7ca0: 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72  = sqliteVdbeCurr
7cb0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
7cc0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
7cd0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
7ce0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7cf0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
7d00: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72  pr->iTable, addr
7d10: 2b 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +2);.      }else
7d20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7d30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7d40: 53 65 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  SetFound, pExpr-
7d50: 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 32 29  >iTable, addr+2)
7d60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7d70: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7d80: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
7d90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
7da0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7db0: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
7dc0: 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20        int lbl = 
7dd0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
7de0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
7df0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7e00: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
7e10: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
7e20: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
7e30: 73 65 2c 20 70 45 78 70 72 2c 20 6c 62 6c 29 3b  se, pExpr, lbl);
7e40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7e50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
7e60: 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Imm, 1, 0);.    
7e70: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
7e80: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29  lveLabel(v, lbl)
7e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7ea0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7eb0: 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _AS: {.      sql
7ec0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
7ed0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
7ee0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7ef0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7f00: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  rn;.}../*.** Gen
7f10: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
7f20: 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
7f30: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
7f40: 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
7f50: 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
7f60: 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
7f70: 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
7f80: 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
7f90: 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
7fa0: 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
7fb0: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
7fc0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
7fd0: 65 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  eExprIfTrue(Pars
7fe0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
7ff0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
8000: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
8010: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
8020: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66  int op = 0;.  if
8030: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
8040: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
8050: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
8060: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
8070: 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LT:       op = O
8080: 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65 61  P_Lt;       brea
8090: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
80a0: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
80b0: 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Le;       break
80c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
80d0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
80e0: 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Gt;       break;
80f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
8100: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47         op = OP_G
8110: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
8120: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
8130: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65        op = OP_Ne
8140: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8150: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
8160: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b       op = OP_Eq;
8170: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8180: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 20    case TK_LIKE: 
8190: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 69 6b 65      op = OP_Like
81a0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
81b0: 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 20   case TK_GLOB:  
81c0: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 6c 6f 62 3b     op = OP_Glob;
81d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
81e0: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20  case TK_ISNULL: 
81f0: 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c    op = OP_IsNull
8200: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
8210: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
8220: 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c   op = OP_NotNull
8230: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  ;  break;.    de
8240: 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20  fault:  break;. 
8250: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78   }.  switch( pEx
8260: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
8270: 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
8280: 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
8290: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
82a0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
82b0: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
82c0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
82d0: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
82e0: 69 74 65 45 78 70 72 49 66 54 72 75 65 28 70 50  iteExprIfTrue(pP
82f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
8300: 67 68 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ght, dest);.    
8310: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
8320: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
8330: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8340: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8350: 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OR: {.      sqli
8360: 74 65 45 78 70 72 49 66 54 72 75 65 28 70 50 61  teExprIfTrue(pPa
8370: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
8380: 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
8390: 73 71 6c 69 74 65 45 78 70 72 49 66 54 72 75 65  sqliteExprIfTrue
83a0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
83b0: 70 52 69 67 68 74 2c 20 64 65 73 74 29 3b 0a 20  pRight, dest);. 
83c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
83d0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
83e0: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
83f0: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
8400: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
8410: 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
8420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8430: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
8440: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
8450: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
8460: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
8470: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
8480: 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20   case TK_EQ:.   
8490: 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20   case TK_LIKE:. 
84a0: 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a     case TK_GLOB:
84b0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
84c0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
84d0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
84e0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
84f0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
8500: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
8510: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8520: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74  p(v, op, 0, dest
8530: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8540: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8550: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
8560: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
8570: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
8580: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
8590: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
85a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
85b0: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73  Op(v, op, 0, des
85c0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
85d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
85e0: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73  TK_IN: {.      s
85f0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
8600: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
8610: 66 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ft);.      if( p
8620: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
8630: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
8640: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
8650: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
8660: 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ble, dest);.    
8670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8680: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8690: 28 76 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64 2c  (v, OP_SetFound,
86a0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
86b0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dest);.      }. 
86c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
86d0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
86e0: 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TWEEN: {.      i
86f0: 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 56  nt lbl = sqliteV
8700: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
8710: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
8720: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
8730: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8740: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8750: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
8760: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8770: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
8780: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
8790: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
87a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
87b0: 4f 70 28 76 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20  Op(v, OP_Lt, 0, 
87c0: 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lbl);.      sqli
87d0: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
87e0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
87f0: 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
8800: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8810: 64 4f 70 28 76 2c 20 4f 50 5f 4c 65 2c 20 30 2c  dOp(v, OP_Le, 0,
8820: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
8830: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8840: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
8850: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8860: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
8870: 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20  (v, lbl);.      
8880: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8890: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
88a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
88b0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
88c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
88d0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
88e0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
88f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8900: 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 64 65 73 74  , OP_If, 0, dest
8910: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8920: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
8930: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
8940: 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
8950: 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
8960: 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
8970: 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
8980: 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
8990: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
89a0: 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
89b0: 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
89c0: 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
89d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
89e0: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 76 6f 69 64  is true..*/.void
89f0: 20 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c   sqliteExprIfFal
8a00: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
8a10: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
8a20: 6e 74 20 64 65 73 74 29 7b 0a 20 20 56 64 62 65  nt dest){.  Vdbe
8a30: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
8a40: 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
8a50: 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  0;.  if( v==0 ||
8a60: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
8a70: 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  rn;.  switch( pE
8a80: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
8a90: 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20  ase TK_LT:      
8aa0: 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20   op = OP_Ge;    
8ab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8ac0: 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20  se TK_LE:       
8ad0: 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20  op = OP_Gt;     
8ae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8af0: 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f  e TK_GT:       o
8b00: 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20  p = OP_Le;      
8b10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8b20: 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f 70   TK_GE:       op
8b30: 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20   = OP_Lt;       
8b40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8b50: 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_NE:       op 
8b60: 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62  = OP_Eq;       b
8b70: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8b80: 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_EQ:       op =
8b90: 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20 62 72   OP_Ne;       br
8ba0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8bb0: 5f 4c 49 4b 45 3a 20 20 20 20 20 6f 70 20 3d 20  _LIKE:     op = 
8bc0: 4f 50 5f 4c 69 6b 65 3b 20 20 20 20 20 62 72 65  OP_Like;     bre
8bd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8be0: 47 4c 4f 42 3a 20 20 20 20 20 6f 70 20 3d 20 4f  GLOB:     op = O
8bf0: 50 5f 47 6c 6f 62 3b 20 20 20 20 20 62 72 65 61  P_Glob;     brea
8c00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
8c10: 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f 50  SNULL:   op = OP
8c20: 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61 6b  _NotNull;  break
8c30: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
8c40: 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f  TNULL:  op = OP_
8c50: 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b  IsNull;   break;
8c60: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 62  .    default:  b
8c70: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74  reak;.  }.  swit
8c80: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
8c90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
8ca0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
8cb0: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
8cc0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
8cd0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
8ce0: 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65  qliteExprIfFalse
8cf0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8d00: 70 52 69 67 68 74 2c 20 64 65 73 74 29 3b 0a 20  pRight, dest);. 
8d10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8d20: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
8d30: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
8d40: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
8d50: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
8d60: 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72 75   sqliteExprIfTru
8d70: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
8d80: 3e 70 4c 65 66 74 2c 20 64 32 29 3b 0a 20 20 20  >pLeft, d2);.   
8d90: 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 46     sqliteExprIfF
8da0: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
8db0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
8dc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8dd0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
8de0: 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
8df0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8e00: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
8e10: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
8e20: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
8e30: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 29  pr->pLeft, dest)
8e40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8e50: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
8e60: 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
8e70: 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
8e80: 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
8e90: 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
8ea0: 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
8eb0: 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _EQ: {.      sql
8ec0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
8ed0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
8ee0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
8ef0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
8f00: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
8f10: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8f20: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
8f30: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
8f40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8f50: 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20  se TK_LIKE:.    
8f60: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a  case TK_GLOB: {.
8f70: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
8f80: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
8f90: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
8fa0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
8fb0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8fc0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
8fd0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8fe0: 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a  , op, 1, dest);.
8ff0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9000: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
9010: 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
9020: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
9030: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
9040: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
9050: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
9060: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9070: 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74 29 3b  v, op, 0, dest);
9080: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9090: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
90a0: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  IN: {.      sqli
90b0: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
90c0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
90d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
90e0: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
90f0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9100: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46  AddOp(v, OP_NotF
9110: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
9120: 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ble, dest);.    
9130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9140: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9150: 28 76 2c 20 4f 50 5f 53 65 74 4e 6f 74 46 6f 75  (v, OP_SetNotFou
9160: 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
9170: 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  e, dest);.      
9180: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9190: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
91a0: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
91b0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
91c0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
91d0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
91e0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
91f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9200: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
9210: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
9220: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
9230: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
9240: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61 64  pExpr);.      ad
9250: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  dr = sqliteVdbeC
9260: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
9270: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9280: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30  ddOp(v, OP_Ge, 0
9290: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
92a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
92b0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
92c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
92d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
92e0: 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20  oto, 0, dest);. 
92f0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
9300: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9310: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
9320: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
9330: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9340: 4f 50 5f 47 74 2c 20 30 2c 20 64 65 73 74 29 3b  OP_Gt, 0, dest);
9350: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9360: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
9370: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
9380: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
9390: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
93a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
93b0: 20 4f 50 5f 4e 6f 74 2c 20 30 2c 20 30 29 3b 0a   OP_Not, 0, 0);.
93c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
93d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
93e0: 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
93f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
9400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64  .}../*.** Do a d
9410: 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  eep comparison o
9420: 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  f two expression
9430: 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20   trees.  Return 
9440: 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a  TRUE (non-zero).
9450: 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69  ** if they are i
9460: 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74  dentical and ret
9470: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
9480: 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20  y differ in any 
9490: 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  way..*/.int sqli
94a0: 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  teExprCompare(Ex
94b0: 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
94c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
94d0: 28 20 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( pA==0 ){.    r
94e0: 65 74 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d  eturn pB==0;.  }
94f0: 65 6c 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29  else if( pB==0 )
9500: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
9510: 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
9520: 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72  !=pB->op ) retur
9530: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
9540: 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  teExprCompare(pA
9550: 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65  ->pLeft, pB->pLe
9560: 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ft) ) return 0;.
9570: 20 20 69 66 28 20 21 73 71 6c 69 74 65 45 78 70    if( !sqliteExp
9580: 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
9590: 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29  ght, pB->pRight)
95a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
95b0: 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a  f( pA->pList ){.
95c0: 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73      if( pB->pLis
95d0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
95e0: 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  .    if( pA->pLi
95f0: 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70  st->nExpr!=pB->p
9600: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65  List->nExpr ) re
9610: 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28  turn 0;.    for(
9620: 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74  i=0; i<pA->pList
9630: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
9640: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
9650: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
9660: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
9670: 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b  r, pB->pList->a[
9680: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
9690: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
96a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
96b0: 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69  else if( pB->pLi
96c0: 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  st ){.    return
96d0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   0;.  }.  if( pA
96e0: 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d  ->pSelect || pB-
96f0: 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  >pSelect ) retur
9700: 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74  n 0;.  if( pA->t
9710: 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66  oken.z ){.    if
9720: 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ( pB->token.z==0
9730: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
9740: 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e   if( pB->token.n
9750: 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20  !=pA->token.n ) 
9760: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
9770: 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  ( sqliteStrNICmp
9780: 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42  (pA->token.z, pB
9790: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 41 2d 3e 74  ->token.z, pA->t
97a0: 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74  oken.n)!=0 ) ret
97b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
97c0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
97d0: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
97e0: 74 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  t to the pParse-
97f0: 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 6e  >aAgg[] array an
9800: 64 20 72 65 74 75 72 6e 20 69 74 73 20 69 6e 64  d return its ind
9810: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ex..*/.static in
9820: 74 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28  t appendAggInfo(
9830: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
9840: 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 6e    if( (pParse->n
9850: 41 67 67 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Agg & 0x7)==0 ){
9860: 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 70  .    int amt = p
9870: 50 61 72 73 65 2d 3e 6e 41 67 67 20 2b 20 38 3b  Parse->nAgg + 8;
9880: 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 61 41  .    AggExpr *aA
9890: 67 67 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  gg = sqliteReall
98a0: 6f 63 28 70 50 61 72 73 65 2d 3e 61 41 67 67 2c  oc(pParse->aAgg,
98b0: 20 61 6d 74 2a 73 69 7a 65 6f 66 28 70 50 61 72   amt*sizeof(pPar
98c0: 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20  se->aAgg[0]));. 
98d0: 20 20 20 69 66 28 20 61 41 67 67 3d 3d 30 20 29     if( aAgg==0 )
98e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
98f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
9900: 72 73 65 2d 3e 61 41 67 67 20 3d 20 61 41 67 67  rse->aAgg = aAgg
9910: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
9920: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 70 50 61  pParse->aAgg[pPa
9930: 72 73 65 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20 73  rse->nAgg], 0, s
9940: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41  izeof(pParse->aA
9950: 67 67 5b 30 5d 29 29 3b 0a 20 20 72 65 74 75 72  gg[0]));.  retur
9960: 6e 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 2b 2b  n pParse->nAgg++
9970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
9980: 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  ze the given exp
9990: 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
99a0: 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
99b0: 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
99c0: 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
99d0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
99e0: 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  ed to the pParse
99f0: 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a  ->aAgg[] array..
9a00: 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e  ** Make addition
9a10: 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  al entries to th
9a20: 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
9a30: 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73   array as necess
9a40: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
9a50: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
9a60: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
9a70: 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
9a80: 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
9a90: 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
9aa0: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
9ab0: 29 20 61 6e 64 20 73 71 6c 69 74 65 45 78 70 72  ) and sqliteExpr
9ac0: 43 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Check()..**.** I
9ad0: 66 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65  f errors are see
9ae0: 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  n, leave an erro
9af0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72  r message in zEr
9b00: 72 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a  rMsg and return.
9b10: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
9b20: 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
9b30: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
9b40: 65 41 67 67 72 65 67 61 74 65 73 28 50 61 72 73  eAggregates(Pars
9b50: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
9b60: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
9b70: 3b 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67  ;.  AggExpr *aAg
9b80: 67 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  g;.  int nErr = 
9b90: 30 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  0;..  if( pExpr=
9ba0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
9bb0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
9bc0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
9bd0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
9be0: 20 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d    aAgg = pParse-
9bf0: 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72  >aAgg;.      for
9c00: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
9c10: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
9c20: 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e      if( aAgg[i].
9c30: 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
9c40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 41  ;.        if( aA
9c50: 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 54 61  gg[i].pExpr->iTa
9c60: 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
9c70: 6c 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 61  le.         && a
9c80: 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43  Agg[i].pExpr->iC
9c90: 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
9ca0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
9cb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9cc0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9cd0: 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d    if( i>=pParse-
9ce0: 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  >nAgg ){.       
9cf0: 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e   i = appendAggIn
9d00: 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  fo(pParse);.    
9d10: 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65      if( i<0 ) re
9d20: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
9d30: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
9d40: 69 73 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  isAgg = 0;.     
9d50: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
9d60: 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  i].pExpr = pExpr
9d70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9d80: 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b  pExpr->iAgg = i;
9d90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9da0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9db0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
9dc0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
9dd0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 46 4e 5f 43 6f 75  >iColumn==FN_Cou
9de0: 6e 74 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f  nt || pExpr->iCo
9df0: 6c 75 6d 6e 3d 3d 46 4e 5f 41 76 67 20 29 7b 0a  lumn==FN_Avg ){.
9e00: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
9e10: 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74 3e 3d 30  se->iAggCount>=0
9e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20   ){.          i 
9e30: 3d 20 70 50 61 72 73 65 2d 3e 69 41 67 67 43 6f  = pParse->iAggCo
9e40: 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  unt;.        }el
9e50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20  se{.          i 
9e60: 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28  = appendAggInfo(
9e70: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
9e80: 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74     if( i<0 ) ret
9e90: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20  urn 1;.         
9ea0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
9eb0: 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  .isAgg = 1;.    
9ec0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
9ed0: 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 30 3b  gg[i].pExpr = 0;
9ee0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
9ef0: 65 2d 3e 69 41 67 67 43 6f 75 6e 74 20 3d 20 69  e->iAggCount = i
9f00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9f10: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
9f20: 43 6f 6c 75 6d 6e 3d 3d 46 4e 5f 43 6f 75 6e 74  Column==FN_Count
9f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
9f40: 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20  xpr->iAgg = i;. 
9f50: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9f70: 7d 0a 20 20 20 20 20 20 61 41 67 67 20 3d 20 70  }.      aAgg = p
9f80: 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20  Parse->aAgg;.   
9f90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
9fa0: 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
9fb0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  {.        if( !a
9fc0: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
9fd0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9fe0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
9ff0: 6f 6d 70 61 72 65 28 61 41 67 67 5b 69 5d 2e 70  ompare(aAgg[i].p
a000: 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a  Expr, pExpr) ){.
a010: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a020: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a030: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d   }.      if( i>=
a040: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a  pParse->nAgg ){.
a050: 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65          i = appe
a060: 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65  ndAggInfo(pParse
a070: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
a080: 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
a090: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
a0a0: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31  Agg[i].isAgg = 1
a0b0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
a0c0: 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20  ->aAgg[i].pExpr 
a0d0: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
a0e0: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
a0f0: 75 6d 6e 3d 3d 46 4e 5f 55 6e 6b 6e 6f 77 6e 20  umn==FN_Unknown 
a100: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
a110: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 55 73  rse->aAgg[i].pUs
a120: 65 72 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 55  er = sqliteFindU
a130: 73 65 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  serFunction(pPar
a140: 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
a150: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
a160: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
a170: 6e 2e 6e 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  n.n, pExpr->pLis
a180: 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  t->nExpr, 0);.  
a190: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a1a0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
a1b0: 41 67 67 5b 69 5d 2e 70 55 73 65 72 20 3d 20 30  Agg[i].pUser = 0
a1c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a1d0: 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d    }.      pExpr-
a1e0: 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
a1f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a200: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
a210: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
a220: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  eft ){.        n
a230: 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  Err = sqliteExpr
a240: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
a250: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  s(pParse, pExpr-
a260: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d  >pLeft);.      }
a270: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d  .      if( nErr=
a280: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
a290: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  ght ){.        n
a2a0: 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  Err = sqliteExpr
a2b0: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
a2c0: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  s(pParse, pExpr-
a2d0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
a2e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72  }.      if( nErr
a2f0: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  ==0 && pExpr->pL
a300: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ist ){.        i
a310: 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c  nt n = pExpr->pL
a320: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
a330: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
a340: 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72     for(i=0; nErr
a350: 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29  ==0 && i<n; i++)
a360: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72 72  {.          nErr
a370: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61   = sqliteExprAna
a380: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
a390: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
a3a0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
a3b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a3c0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
a3d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
a3e0: 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn nErr;.}../*.
a3f0: 2a 2a 20 4c 6f 63 61 74 65 20 61 20 75 73 65 72  ** Locate a user
a400: 20 66 75 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20   function given 
a410: 61 20 6e 61 6d 65 20 61 6e 64 20 61 20 6e 75 6d  a name and a num
a420: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
a430: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ..** Return a po
a440: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 55 73 65  inter to the Use
a450: 72 46 75 6e 63 20 73 74 72 75 63 74 75 72 65 20  rFunc structure 
a460: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 61  that defines tha
a470: 74 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  t.** function, o
a480: 72 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  r return NULL if
a490: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
a4a0: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a  es not exist..**
a4b0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 72 65 61 74  .** If the creat
a4c0: 65 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  eFlag argument i
a4d0: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 6e  s true, then a n
a4e0: 65 77 20 28 62 6c 61 6e 6b 29 20 55 73 65 72 46  ew (blank) UserF
a4f0: 75 6e 63 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  unc.** structure
a500: 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
a510: 6c 69 6b 65 64 20 69 6e 74 6f 20 74 68 65 20 22  liked into the "
a520: 64 62 22 20 73 74 72 75 63 74 75 72 65 20 69 66  db" structure if
a530: 20 61 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 69 6e   a.** no matchin
a540: 67 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 76 69  g function previ
a550: 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20 20  ously existed.  
a560: 57 68 65 6e 20 63 72 65 61 74 65 46 6c 61 67 20  When createFlag 
a570: 69 73 20 74 72 75 65 0a 2a 2a 20 61 6e 64 20 74  is true.** and t
a580: 68 65 20 6e 41 72 67 20 70 61 72 61 6d 65 74 65  he nArg paramete
a590: 72 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 6f 6e  r is -1, then on
a5a0: 6c 79 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  ly a function th
a5b0: 61 74 20 61 63 63 65 70 74 73 0a 2a 2a 20 61 6e  at accepts.** an
a5c0: 79 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  y number of argu
a5d0: 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 72 65  ments will be re
a5e0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
a5f0: 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 66   createFlag is f
a600: 61 6c 73 65 20 61 6e 64 20 6e 41 72 67 20 69 73  alse and nArg is
a610: 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 66 69   -1, then the fi
a620: 72 73 74 20 76 61 6c 69 64 0a 2a 2a 20 66 75 6e  rst valid.** fun
a630: 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 73 20 72  ction found is r
a640: 65 74 75 72 6e 65 64 2e 20 20 41 20 66 75 6e 63  eturned.  A func
a650: 74 69 6f 6e 20 69 73 20 76 61 6c 69 64 20 69 66  tion is valid if
a660: 20 65 69 74 68 65 72 20 78 46 75 6e 63 0a 2a 2a   either xFunc.**
a670: 20 6f 72 20 78 53 74 65 70 20 69 73 20 6e 6f 6e   or xStep is non
a680: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 55 73 65 72 46 75  -zero..*/.UserFu
a690: 6e 63 20 2a 73 71 6c 69 74 65 46 69 6e 64 55 73  nc *sqliteFindUs
a6a0: 65 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  erFunction(.  sq
a6b0: 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20 20  lite *db,       
a6c0: 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61   /* An open data
a6d0: 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
a6e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2f 2a 20  char *zName, /* 
a6f0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63  Name of the func
a700: 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e 75 6c 6c 2d  tion.  Not null-
a710: 74 65 72 6d 69 6e 61 74 65 64 20 2a 2f 0a 20 20  terminated */.  
a720: 69 6e 74 20 6e 4e 61 6d 65 2c 20 20 20 20 20 20  int nName,      
a730: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a740: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
a750: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  e name */.  int 
a760: 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 2f  nArg,          /
a770: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
a780: 6d 65 6e 74 73 2e 20 20 2d 31 20 6d 65 61 6e 73  ments.  -1 means
a790: 20 61 6e 79 20 6e 75 6d 62 65 72 20 2a 2f 0a 20   any number */. 
a7a0: 20 69 6e 74 20 63 72 65 61 74 65 46 6c 61 67 20   int createFlag 
a7b0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6e 65      /* Create ne
a7c0: 77 20 65 6e 74 72 79 20 69 66 20 74 72 75 65 20  w entry if true 
a7d0: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6f 74 68  and does not oth
a7e0: 65 72 77 69 73 65 20 65 78 69 73 74 20 2a 2f 0a  erwise exist */.
a7f0: 29 7b 0a 20 20 55 73 65 72 46 75 6e 63 20 2a 70  ){.  UserFunc *p
a800: 46 69 72 73 74 2c 20 2a 70 2c 20 2a 70 4d 61 79  First, *p, *pMay
a810: 62 65 3b 0a 20 20 70 46 69 72 73 74 20 3d 20 70  be;.  pFirst = p
a820: 20 3d 20 28 55 73 65 72 46 75 6e 63 2a 29 73 71   = (UserFunc*)sq
a830: 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62  liteHashFind(&db
a840: 2d 3e 75 73 65 72 46 75 6e 63 2c 20 7a 4e 61 6d  ->userFunc, zNam
a850: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 28  e, nName);.  if(
a860: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
a870: 3b 0a 20 20 69 66 28 20 21 63 72 65 61 74 65 46  ;.  if( !createF
a880: 6c 61 67 20 26 26 20 6e 41 72 67 3c 30 20 29 7b  lag && nArg<0 ){
a890: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26  .    while( p &&
a8a0: 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 26 26 20   p->xFunc==0 && 
a8b0: 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29 7b 20 70  p->xStep==0 ){ p
a8c0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20   = p->pNext; }. 
a8d0: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d     return p;.  }
a8e0: 0a 20 20 70 4d 61 79 62 65 20 3d 20 30 3b 0a 20  .  pMaybe = 0;. 
a8f0: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
a900: 6e 41 72 67 21 3d 6e 41 72 67 20 29 7b 0a 20 20  nArg!=nArg ){.  
a910: 20 20 69 66 28 20 70 2d 3e 6e 41 72 67 3c 30 20    if( p->nArg<0 
a920: 26 26 20 21 63 72 65 61 74 65 46 6c 61 67 20 26  && !createFlag &
a930: 26 20 28 70 2d 3e 78 46 75 6e 63 20 7c 7c 20 70  & (p->xFunc || p
a940: 2d 3e 78 53 74 65 70 29 20 29 20 70 4d 61 79 62  ->xStep) ) pMayb
a950: 65 20 3d 20 70 3b 0a 20 20 20 20 70 20 3d 20 70  e = p;.    p = p
a960: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
a970: 66 28 20 70 20 26 26 20 21 63 72 65 61 74 65 46  f( p && !createF
a980: 6c 61 67 20 26 26 20 70 2d 3e 78 46 75 6e 63 3d  lag && p->xFunc=
a990: 3d 30 20 26 26 20 70 2d 3e 78 53 74 65 70 3d 3d  =0 && p->xStep==
a9a0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a9b0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d  0;.  }.  if( p==
a9c0: 30 20 26 26 20 70 4d 61 79 62 65 20 29 7b 0a 20  0 && pMaybe ){. 
a9d0: 20 20 20 61 73 73 65 72 74 28 20 63 72 65 61 74     assert( creat
a9e0: 65 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  eFlag==0 );.    
a9f0: 72 65 74 75 72 6e 20 70 4d 61 79 62 65 3b 0a 20  return pMaybe;. 
aa00: 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20 26 26   }.  if( p==0 &&
aa10: 20 63 72 65 61 74 65 46 6c 61 67 20 29 7b 0a 20   createFlag ){. 
aa20: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c     p = sqliteMal
aa30: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
aa40: 29 3b 0a 20 20 20 20 70 2d 3e 6e 41 72 67 20 3d  );.    p->nArg =
aa50: 20 6e 41 72 67 3b 0a 20 20 20 20 70 2d 3e 70 4e   nArg;.    p->pN
aa60: 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
aa70: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65    sqliteHashInse
aa80: 72 74 28 26 64 62 2d 3e 75 73 65 72 46 75 6e 63  rt(&db->userFunc
aa90: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
aaa0: 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 20  (void*)p);.  }. 
aab0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a            return p;.}.