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

Artifact 4f9db24c4e90585fd046703d4f91c10b453867fa:


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 33 20 32 30 30 32 2f 30 32 2f 32 33 20 32  .43 2002/02/23 2
0220: 33 3a 34 35 3a 34 35 20 64 72 68 20 45 78 70 20  3:45:45 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 74 6f 20 74 68 61 74 0a 2a 2a 20 74 72  es to that.** tr
0d30: 61 6e 73 6c 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  anslation..**.**
0d40: 20 54 68 65 20 22 6f 66 66 73 65 74 22 20 70 61   The "offset" pa
0d50: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 64  rameter is the d
0d60: 69 73 74 61 6e 63 65 20 66 72 6f 6d 20 74 68 65  istance from the
0d70: 20 6f 72 69 67 69 6e 61 6c 20 69 6e 70 75 74 20   original input 
0d80: 62 75 66 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65  buffer.** to the
0d90: 20 70 65 72 73 69 73 74 65 6e 74 20 63 6f 70 79   persistent copy
0da0: 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
0db0: 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 77 61  s recursively wa
0dc0: 6c 6b 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a  lk the entire.**
0dd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
0de0: 20 61 6e 64 20 73 68 69 66 74 20 61 6c 6c 20 74   and shift all t
0df0: 6f 6b 65 6e 73 20 62 79 20 22 6f 66 66 73 65 74  okens by "offset
0e00: 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20  " amount..**.** 
0e10: 54 68 65 20 77 6f 72 6b 20 6f 66 20 66 69 67 75  The work of figu
0e20: 72 69 6e 67 20 6f 75 74 20 74 68 65 20 61 70 70  ring out the app
0e30: 72 6f 70 72 69 61 74 65 20 22 6f 66 66 73 65 74  ropriate "offset
0e40: 22 20 61 6e 64 20 6d 61 6b 69 6e 67 20 74 68 65  " and making the
0e50: 0a 2a 2a 20 70 72 65 73 69 73 74 65 6e 74 20 63  .** presistent c
0e60: 6f 70 79 20 6f 66 20 74 68 65 20 69 6e 70 75 74  opy of the input
0e70: 20 62 75 66 66 65 72 20 69 73 20 64 6f 6e 65 20   buffer is done 
0e80: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  by the calling r
0e90: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  outine..*/.void 
0ea0: 73 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53 74  sqliteExprMoveSt
0eb0: 72 69 6e 67 73 28 45 78 70 72 20 2a 70 2c 20 69  rings(Expr *p, i
0ec0: 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 69 66  nt offset){.  if
0ed0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
0ee0: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
0ef0: 7a 20 29 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b  z ) p->token.z +
0f00: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 69 66 28 20  = offset;.  if( 
0f10: 70 2d 3e 73 70 61 6e 2e 7a 20 29 20 70 2d 3e 73  p->span.z ) p->s
0f20: 70 61 6e 2e 7a 20 2b 3d 20 6f 66 66 73 65 74 3b  pan.z += offset;
0f30: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20  .  if( p->pLeft 
0f40: 29 20 73 71 6c 69 74 65 45 78 70 72 4d 6f 76 65  ) sqliteExprMove
0f50: 53 74 72 69 6e 67 73 28 70 2d 3e 70 4c 65 66 74  Strings(p->pLeft
0f60: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
0f70: 20 70 2d 3e 70 52 69 67 68 74 20 29 20 73 71 6c   p->pRight ) sql
0f80: 69 74 65 45 78 70 72 4d 6f 76 65 53 74 72 69 6e  iteExprMoveStrin
0f90: 67 73 28 70 2d 3e 70 52 69 67 68 74 2c 20 6f 66  gs(p->pRight, of
0fa0: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  fset);.  if( p->
0fb0: 70 4c 69 73 74 20 29 20 73 71 6c 69 74 65 45 78  pList ) sqliteEx
0fc0: 70 72 4c 69 73 74 4d 6f 76 65 53 74 72 69 6e 67  prListMoveString
0fd0: 73 28 70 2d 3e 70 4c 69 73 74 2c 20 6f 66 66 73  s(p->pList, offs
0fe0: 65 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  et);.  if( p->pS
0ff0: 65 6c 65 63 74 20 29 20 73 71 6c 69 74 65 53 65  elect ) sqliteSe
1000: 6c 65 63 74 4d 6f 76 65 53 74 72 69 6e 67 73 28  lectMoveStrings(
1010: 70 2d 3e 70 53 65 6c 65 63 74 2c 20 6f 66 66 73  p->pSelect, offs
1020: 65 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  et);.}.void sqli
1030: 74 65 45 78 70 72 4c 69 73 74 4d 6f 76 65 53 74  teExprListMoveSt
1040: 72 69 6e 67 73 28 45 78 70 72 4c 69 73 74 20 2a  rings(ExprList *
1050: 70 4c 69 73 74 2c 20 69 6e 74 20 6f 66 66 73 65  pList, int offse
1060: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
1070: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1080: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
1090: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
10a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
10b0: 65 45 78 70 72 4d 6f 76 65 53 74 72 69 6e 67 73  eExprMoveStrings
10c0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
10d0: 70 72 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 7d  pr, offset);.  }
10e0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 65  .}.void sqliteSe
10f0: 6c 65 63 74 4d 6f 76 65 53 74 72 69 6e 67 73 28  lectMoveStrings(
1100: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
1110: 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20   int offset){.  
1120: 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 29  if( pSelect==0 )
1130: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
1140: 65 45 78 70 72 4c 69 73 74 4d 6f 76 65 53 74 72  eExprListMoveStr
1150: 69 6e 67 73 28 70 53 65 6c 65 63 74 2d 3e 70 45  ings(pSelect->pE
1160: 4c 69 73 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20  List, offset);. 
1170: 20 73 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53   sqliteExprMoveS
1180: 74 72 69 6e 67 73 28 70 53 65 6c 65 63 74 2d 3e  trings(pSelect->
1190: 70 57 68 65 72 65 2c 20 6f 66 66 73 65 74 29 3b  pWhere, offset);
11a0: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73  .  sqliteExprLis
11b0: 74 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 53 65  tMoveStrings(pSe
11c0: 6c 65 63 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20  lect->pGroupBy, 
11d0: 6f 66 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74  offset);.  sqlit
11e0: 65 45 78 70 72 4d 6f 76 65 53 74 72 69 6e 67 73  eExprMoveStrings
11f0: 28 70 53 65 6c 65 63 74 2d 3e 70 48 61 76 69 6e  (pSelect->pHavin
1200: 67 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 73 71  g, offset);.  sq
1210: 6c 69 74 65 45 78 70 72 4c 69 73 74 4d 6f 76 65  liteExprListMove
1220: 53 74 72 69 6e 67 73 28 70 53 65 6c 65 63 74 2d  Strings(pSelect-
1230: 3e 70 4f 72 64 65 72 42 79 2c 20 6f 66 66 73 65  >pOrderBy, offse
1240: 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65  t);.  sqliteSele
1250: 63 74 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 53  ctMoveStrings(pS
1260: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 6f  elect->pPrior, o
1270: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
1280: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
1290: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
12a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
12b0: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
12c0: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
12d0: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
12e0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
12f0: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c  n list..*/.ExprL
1300: 69 73 74 20 2a 73 71 6c 69 74 65 45 78 70 72 4c  ist *sqliteExprL
1310: 69 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69  istAppend(ExprLi
1320: 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20  st *pList, Expr 
1330: 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70  *pExpr, Token *p
1340: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1350: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1360: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1370: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
1380: 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a  of(ExprList) );.
1390: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
13a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13b0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
13c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13d0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
13e0: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
13f0: 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   & 7)==0 ){.    
1400: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  int n = pList->n
1410: 45 78 70 72 20 2b 20 38 3b 0a 20 20 20 20 73 74  Expr + 8;.    st
1420: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1430: 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20 73  em *a;.    a = s
1440: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
1450: 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28  st->a, n*sizeof(
1460: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
1470: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
1480: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
1490: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20  elete(pExpr);.  
14a0: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74      return pList
14b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
14c0: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
14d0: 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61  if( pExpr || pNa
14e0: 6d 65 20 29 7b 0a 20 20 20 20 69 20 3d 20 70 4c  me ){.    i = pL
14f0: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 3b 0a 20 20  ist->nExpr++;.  
1500: 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1510: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
1520: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1530: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  me = 0;.    if( 
1540: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  pName ){.      s
1550: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
1560: 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  &pList->a[i].zNa
1570: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  me, pName->z, pN
1580: 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ame->n, 0);.    
1590: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
15a0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
15b0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
15c0: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
15d0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
15e0: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
15f0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
1600: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
1610: 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a  elete(ExprList *
1620: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1630: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1640: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1650: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1660: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
1670: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
1680: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1690: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  r);.    sqliteFr
16a0: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
16b0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
16c0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
16d0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
16e0: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
16f0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
1700: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
1710: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
1720: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
1730: 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74  t.** and 0 if it
1740: 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62   involves variab
1750: 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
1760: 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  teExprIsConstant
1770: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 73 77 69  (Expr *p){.  swi
1780: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
1790: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
17a0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
17b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  :.    case TK_DO
17c0: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
17d0: 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  0;.    case TK_I
17e0: 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
17f0: 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
1800: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1830: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
1840: 20 26 26 20 21 73 71 6c 69 74 65 45 78 70 72 49   && !sqliteExprI
1850: 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 65  sConstant(p->pLe
1860: 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ft) ) return 0;.
1870: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69        if( p->pRi
1880: 67 68 74 20 26 26 20 21 73 71 6c 69 74 65 45 78  ght && !sqliteEx
1890: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e  prIsConstant(p->
18a0: 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e  pRight) ) return
18b0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
18c0: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
18d0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
18e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70   for(i=0; i<p->p
18f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1900: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1910: 20 21 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f   !sqliteExprIsCo
1920: 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 69 73 74 2d  nstant(p->pList-
1930: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 72  >a[i].pExpr) ) r
1940: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
1950: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1960: 20 72 65 74 75 72 6e 20 70 2d 3e 70 4c 65 66 74   return p->pLeft
1970: 21 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74  !=0 || p->pRight
1980: 21 3d 30 20 7c 7c 20 28 70 2d 3e 70 4c 69 73 74  !=0 || (p->pList
1990: 20 26 26 20 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45   && p->pList->nE
19a0: 78 70 72 3e 30 29 3b 0a 20 20 20 20 7d 0a 20 20  xpr>0);.    }.  
19b0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
19c0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65 20  ./*.** Walk the 
19d0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
19e0: 61 6e 64 20 70 72 6f 63 65 73 73 20 6f 70 65 72  and process oper
19f0: 61 74 6f 72 73 20 6f 66 20 74 68 65 20 66 6f 72  ators of the for
1a00: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 65  m:.**.**       e
1a10: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
1a20: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ..).**.** These 
1a30: 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 74  operators have t
1a40: 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 62  o be processed b
1a50: 65 66 6f 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  efore column nam
1a60: 65 73 20 61 72 65 0a 2a 2a 20 72 65 73 6f 6c 76  es are.** resolv
1a70: 65 64 20 62 65 63 61 75 73 65 20 65 61 63 68 20  ed because each 
1a80: 73 75 63 68 20 6f 70 65 72 61 74 6f 72 20 69 6e  such operator in
1a90: 63 72 65 6d 65 6e 74 73 20 70 50 61 72 73 65 2d  crements pParse-
1aa0: 3e 6e 54 61 62 0a 2a 2a 20 74 6f 20 72 65 73 65  >nTab.** to rese
1ab0: 72 76 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  rve cursor numbe
1ac0: 72 73 20 66 6f 72 20 69 74 73 20 6f 77 6e 20 75  rs for its own u
1ad0: 73 65 2e 20 20 42 75 74 20 70 50 61 72 73 65 2d  se.  But pParse-
1ae0: 3e 6e 54 61 62 0a 2a 2a 20 6e 65 65 64 73 20 74  >nTab.** needs t
1af0: 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 6f 6e  o be constant on
1b00: 63 65 20 77 65 20 62 65 67 69 6e 20 72 65 73 6f  ce we begin reso
1b10: 6c 76 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  lving column nam
1b20: 65 73 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  es.  For.** that
1b30: 20 72 65 61 73 6f 6e 2c 20 74 68 69 73 20 70 72   reason, this pr
1b40: 6f 63 65 64 75 72 65 20 6e 65 65 64 73 20 74 6f  ocedure needs to
1b50: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
1b60: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ery expression.*
1b70: 2a 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 45  * before sqliteE
1b80: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 29 20  xprResolveIds() 
1b90: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 79  is called on any
1ba0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
1bb0: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65  ** Actually, the
1bc0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 49   processing of I
1bd0: 4e 2d 53 45 4c 45 43 54 20 69 73 20 6f 6e 6c 79  N-SELECT is only
1be0: 20 73 74 61 72 74 65 64 20 62 79 20 74 68 69 73   started by this
1bf0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  .** routine.  Th
1c00: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
1c10: 61 74 65 73 20 61 20 63 75 72 73 6f 72 20 6e 75  ates a cursor nu
1c20: 6d 62 65 72 20 74 6f 20 74 68 65 20 49 4e 2d 53  mber to the IN-S
1c30: 45 4c 45 43 54 0a 2a 2a 20 61 6e 64 20 74 68 65  ELECT.** and the
1c40: 6e 20 6d 6f 76 65 73 20 6f 6e 2e 20 20 54 68 65  n moves on.  The
1c50: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
1c60: 20 69 73 20 64 6f 6e 65 20 62 79 20 0a 2a 2a 20   is done by .** 
1c70: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
1c80: 65 49 64 73 28 29 20 77 68 69 63 68 20 6d 75 73  eIds() which mus
1c90: 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  t be called afte
1ca0: 72 77 61 72 64 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rwards..*/.void 
1cb0: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
1cc0: 65 49 6e 53 65 6c 65 63 74 28 50 61 72 73 65 20  eInSelect(Parse 
1cd0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1ce0: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
1cf0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
1d00: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
1d10: 3d 54 4b 5f 49 4e 20 26 26 20 70 45 78 70 72 2d  =TK_IN && pExpr-
1d20: 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 7b 0a 20  >pSelect!=0 ){. 
1d30: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1d40: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1d50: 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1d60: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
1d70: 20 29 20 73 71 6c 69 74 65 45 78 70 72 52 65 73   ) sqliteExprRes
1d80: 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70 50 61  olveInSelect(pPa
1d90: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1da0: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  t);.    if( pExp
1db0: 72 2d 3e 70 52 69 67 68 74 20 29 20 73 71 6c 69  r->pRight ) sqli
1dc0: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53  teExprResolveInS
1dd0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
1de0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1df0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69    if( pExpr->pLi
1e00: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
1e10: 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  i;.      ExprLis
1e20: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
1e30: 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 66  ->pList;.      f
1e40: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1e50: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1e60: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
1e70: 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28  ResolveInSelect(
1e80: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
1e90: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1ea0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
1eb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
1ec0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
1ed0: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
1ee0: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
1ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
1f00: 6c 69 74 65 49 73 52 6f 77 69 64 28 63 6f 6e 73  liteIsRowid(cons
1f10: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
1f20: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
1f30: 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
1f40: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1f50: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
1f60: 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20  (z, "ROWID")==0 
1f70: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1f80: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
1f90: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
1fa0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
1fb0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
1fc0: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
1fd0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
1fe0: 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73  ree and resolves
1ff0: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a   references to.*
2000: 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e  * table columns.
2010: 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66    Nodes of the f
2020: 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20  orm ID.ID or ID 
2030: 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a  resolve into an.
2040: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  ** index to the 
2050: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62  table in the tab
2060: 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f  le list and a co
2070: 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68  lumn offset.  Th
2080: 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64  e .** Expr.opcod
2090: 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73  e for such nodes
20a0: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54   is changed to T
20b0: 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45  K_COLUMN.  The E
20c0: 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61  xpr.iTable.** va
20d0: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
20e0: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
20f0: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
2100: 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a  ble in pTabList.
2110: 2a 2a 20 70 6c 75 73 20 74 68 65 20 70 50 61 72  ** plus the pPar
2120: 73 65 2d 3e 6e 54 61 62 20 76 61 6c 75 65 2e 20  se->nTab value. 
2130: 20 54 68 69 73 20 76 61 6c 75 65 20 77 69 6c 6c   This value will
2140: 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f   ultimately beco
2150: 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63  me the.** VDBE c
2160: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
2170: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69   a cursor that i
2180: 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20  s pointing into 
2190: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a  the referenced.*
21a0: 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78  * table.  The Ex
21b0: 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  pr.iColumn value
21c0: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74   is changed to t
21d0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
21e0: 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68  column .** of th
21f0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
2200: 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  le.  The Expr.iC
2210: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20  olumn value for 
2220: 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52  the special.** R
2230: 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d  OWID column is -
2240: 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20  1.  Any INTEGER 
2250: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
2260: 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73 20 61  mn is tried as a
2270: 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52  n.** alias for R
2280: 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  OWID..**.** We a
2290: 6c 73 6f 20 63 68 65 63 6b 20 66 6f 72 20 69 6e  lso check for in
22a0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 49  stances of the I
22b0: 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 4e 20  N operator.  IN 
22c0: 63 6f 6d 65 73 20 69 6e 20 74 77 6f 0a 2a 2a 20  comes in two.** 
22d0: 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  forms:.**.**    
22e0: 20 20 20 20 20 20 20 65 78 70 72 20 49 4e 20 28         expr IN (
22f0: 65 78 70 72 6c 69 73 74 29 0a 2a 2a 20 61 6e 64  exprlist).** and
2300: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78  .**           ex
2310: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
2320: 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  .).**.** The fir
2330: 73 74 20 66 6f 72 6d 20 69 73 20 68 61 6e 64 6c  st form is handl
2340: 65 64 20 62 79 20 63 72 65 61 74 69 6e 67 20 61  ed by creating a
2350: 20 73 65 74 20 68 6f 6c 64 69 6e 67 20 74 68 65   set holding the
2360: 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 6f   list.** of allo
2370: 77 65 64 20 76 61 6c 75 65 73 2e 20 20 54 68 65  wed values.  The
2380: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 61 75   second form cau
2390: 73 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 74  ses the SELECT t
23a0: 6f 20 67 65 6e 65 72 61 74 65 20 0a 2a 2a 20 61  o generate .** a
23b0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
23c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
23d0: 74 69 6e 65 20 61 6c 73 6f 20 6c 6f 6f 6b 73 20  tine also looks 
23e0: 66 6f 72 20 73 63 61 6c 61 72 20 53 45 4c 45 43  for scalar SELEC
23f0: 54 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74  Ts that are part
2400: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
2410: 6e 2e 0a 2a 2a 20 49 66 20 69 74 20 66 69 6e 64  n..** If it find
2420: 73 20 61 6e 79 2c 20 69 74 20 67 65 6e 65 72 61  s any, it genera
2430: 74 65 73 20 63 6f 64 65 20 74 6f 20 77 72 69 74  tes code to writ
2440: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2450: 68 61 74 20 73 65 6c 65 63 74 0a 2a 2a 20 69 6e  hat select.** in
2460: 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  to a memory cell
2470: 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f 77 6e 20  ..**.** Unknown 
2480: 63 6f 6c 75 6d 6e 73 20 6f 72 20 74 61 62 6c 65  columns or table
2490: 73 20 70 72 6f 76 6f 6b 65 20 61 6e 20 65 72 72  s provoke an err
24a0: 6f 72 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f  or.  The functio
24b0: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  n returns.** the
24c0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
24d0: 73 20 73 65 65 6e 20 61 6e 64 20 6c 65 61 76 65  s seen and leave
24e0: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
24f0: 67 65 20 6f 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge on pParse->zE
2500: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
2510: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
2520: 64 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ds(.  Parse *pPa
2530: 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
2540: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2550: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 61 62  /.  IdList *pTab
2560: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
2570: 66 20 74 61 62 6c 65 73 20 75 73 65 64 20 74 6f  f tables used to
2580: 20 72 65 73 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20   resolve column 
2590: 6e 61 6d 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  names */.  ExprL
25a0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 2f 2a  ist *pEList,  /*
25b0: 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   List of express
25c0: 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 72 65 73  ions used to res
25d0: 6f 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20 20 45  olve "AS" */.  E
25e0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
25f0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
2600: 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  ion to be analyz
2610: 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ed. */.){.  if( 
2620: 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 54 61 62  pExpr==0 || pTab
2630: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
2640: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   0;.  switch( pE
2650: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
2660: 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66  * A lone identif
2670: 69 65 72 2e 20 20 54 72 79 20 61 6e 64 20 6d 61  ier.  Try and ma
2680: 74 63 68 20 69 74 20 61 73 20 66 6f 6c 6c 6f 77  tch it as follow
2690: 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
26a0: 20 20 20 20 20 31 2e 20 20 54 6f 20 74 68 65 20       1.  To the 
26b0: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
26c0: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   of one of the t
26d0: 61 62 6c 65 73 20 69 6e 20 70 54 61 62 4c 69 73  ables in pTabLis
26e0: 74 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  t.    **.    ** 
26f0: 20 20 20 20 32 2e 20 20 54 6f 20 74 68 65 20 72      2.  To the r
2700: 69 67 68 74 20 73 69 64 65 20 6f 66 20 61 6e 20  ight side of an 
2710: 41 53 20 6b 65 79 77 6f 72 64 20 69 6e 20 74 68  AS keyword in th
2720: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 6f 66  e column list of
2730: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
2740: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2750: 6e 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70 6c  nt.  (For exampl
2760: 65 2c 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  e, match against
2770: 20 27 78 27 20 69 6e 0a 20 20 20 20 2a 2a 20 20   'x' in.    **  
2780: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 61         "SELECT a
2790: 2b 62 20 41 53 20 27 78 27 20 46 52 4f 4d 20 74  +b AS 'x' FROM t
27a0: 31 22 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  1".).    **.    
27b0: 2a 2a 20 20 20 20 20 33 2e 20 20 4f 6e 65 20 6f  **     3.  One o
27c0: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 6e 61  f the special na
27d0: 6d 65 73 20 22 52 4f 57 49 44 22 2c 20 22 4f 49  mes "ROWID", "OI
27e0: 44 22 2c 20 6f 72 20 22 5f 52 4f 57 49 44 5f 22  D", or "_ROWID_"
27f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
2800: 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20  e TK_ID: {.     
2810: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20   int cnt = 0;   
2820: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2830: 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
2840: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2850: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2860: 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  er */.      char
2870: 20 2a 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72   *z;.      asser
2880: 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  t( pExpr->token.
2890: 7a 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73  z );.      z = s
28a0: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78  qliteStrNDup(pEx
28b0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
28c0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
28d0: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
28e0: 65 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e(z);.      if( 
28f0: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  z==0 ) return 1;
2900: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2910: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b  i<pTabList->nId;
2920: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
2930: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 54 61  nt j;.        Ta
2940: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
2950: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b  List->a[i].pTab;
2960: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
2970: 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
2980: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
2990: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
29a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
29b0: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
29c0: 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  p(pTab->aCol[j].
29d0: 7a 4e 61 6d 65 2c 20 7a 29 3d 3d 30 20 29 7b 0a  zName, z)==0 ){.
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b              cnt+
29f0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  +;.            p
2a00: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
2a10: 20 2b 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   + pParse->nTab;
2a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2a30: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
2a40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a50: 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74   /* Substitute t
2a60: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
2a70: 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52   for the INTEGER
2a80: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a   PRIMARY KEY */.
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2aa0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
2ab0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
2ac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2ad0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
2ae0: 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
2af0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b00: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
2b10: 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
2b20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2b30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2b40: 20 63 6e 74 3d 3d 30 20 26 26 20 70 45 4c 69 73   cnt==0 && pELis
2b50: 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t!=0 ){.        
2b60: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
2b70: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74  or(j=0; j<pEList
2b80: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
2b90: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
2ba0: 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  As = pEList->a[j
2bb0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
2bc0: 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26     if( zAs!=0 &&
2bd0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
2be0: 41 73 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  As, z)==0 ){.   
2bf0: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2c10: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
2c20: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
2c30: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
2c40: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
2c50: 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20   = TK_AS;.      
2c60: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
2c70: 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
2c80: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
2c90: 66 74 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  ft = pEList->a[j
2ca0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
2cb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a     }.        } .
2cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2cd0: 28 20 63 6e 74 3d 3d 30 20 26 26 20 73 71 6c 69  ( cnt==0 && sqli
2ce0: 74 65 49 73 52 6f 77 69 64 28 7a 29 20 29 7b 0a  teIsRowid(z) ){.
2cf0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2d00: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
2d10: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
2d20: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
2d30: 62 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 20 3d  b;.        cnt =
2d40: 20 31 20 2b 20 28 70 54 61 62 4c 69 73 74 2d 3e   1 + (pTabList->
2d50: 6e 49 64 3e 31 29 3b 0a 20 20 20 20 20 20 20 20  nId>1);.        
2d60: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
2d70: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  OLUMN;.      }. 
2d80: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
2d90: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e  z);.      if( cn
2da0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2db0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
2dc0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
2dd0: 67 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75  g, "no such colu
2de0: 6d 6e 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20  mn: ", -1,  .   
2df0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
2e00: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
2e10: 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ken.n, 0);.     
2e20: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
2e30: 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  +;.        retur
2e40: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
2e50: 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a 20 20   if( cnt>1 ){.  
2e60: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
2e70: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
2e80: 7a 45 72 72 4d 73 67 2c 20 22 61 6d 62 69 67 75  zErrMsg, "ambigu
2e90: 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ous column name:
2ea0: 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20 20   ", -1,  .      
2eb0: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
2ec0: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
2ed0: 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  .n, 0);.        
2ee0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
2ef0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
2f00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f10: 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 20 20  break; .    }.  
2f20: 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  .    /* A table 
2f30: 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  name and column 
2f40: 6e 61 6d 65 3a 20 20 49 44 2e 49 44 20 2a 2f 0a  name:  ID.ID */.
2f50: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
2f60: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74   {.      int cnt
2f70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
2f90: 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
2fa0: 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20  int cntTab = 0; 
2fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2fc0: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74  er of matching t
2fd0: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  ables */.      i
2fe0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2ff0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
3000: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
3010: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70   Expr *pLeft, *p
3020: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 4c 65 66  Right;    /* Lef
3030: 74 20 61 6e 64 20 72 69 67 68 74 20 73 75 62 62  t and right subb
3040: 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20 65  ranches of the e
3050: 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  xpr */.      cha
3060: 72 20 2a 7a 4c 65 66 74 2c 20 2a 7a 52 69 67 68  r *zLeft, *zRigh
3070: 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
3080: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 2a   an identifier *
3090: 2f 0a 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d  /..      pLeft =
30a0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
30b0: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
30c0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
30d0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
30e0: 20 26 26 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   && pLeft->op==T
30f0: 4b 5f 49 44 20 26 26 20 70 4c 65 66 74 2d 3e 74  K_ID && pLeft->t
3100: 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20  oken.z );.      
3110: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 20 26  assert( pRight &
3120: 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  & pRight->op==TK
3130: 5f 49 44 20 26 26 20 70 52 69 67 68 74 2d 3e 74  _ID && pRight->t
3140: 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20  oken.z );.      
3150: 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 53 74  zLeft = sqliteSt
3160: 72 4e 44 75 70 28 70 4c 65 66 74 2d 3e 74 6f 6b  rNDup(pLeft->tok
3170: 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b  en.z, pLeft->tok
3180: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7a 52 69  en.n);.      zRi
3190: 67 68 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ght = sqliteStrN
31a0: 44 75 70 28 70 52 69 67 68 74 2d 3e 74 6f 6b 65  Dup(pRight->toke
31b0: 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e 74 6f 6b  n.z, pRight->tok
31c0: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  en.n);.      if(
31d0: 20 7a 4c 65 66 74 3d 3d 30 20 7c 7c 20 7a 52 69   zLeft==0 || zRi
31e0: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
31f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 65    sqliteFree(zLe
3200: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ft);.        sql
3210: 69 74 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b  iteFree(zRight);
3220: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3230: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3240: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
3250: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
3260: 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67 68  iteDequote(zRigh
3270: 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
3280: 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20  >iTable = -1;.  
3290: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
32a0: 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  TabList->nId; i+
32b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
32c0: 6a 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  j;.        char 
32d0: 2a 7a 54 61 62 3b 0a 20 20 20 20 20 20 20 20 54  *zTab;.        T
32e0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
32f0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
3300: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
3310: 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ab==0 ) continue
3320: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
3330: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
3340: 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ias ){.         
3350: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
3360: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20  ->a[i].zAlias;. 
3370: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3380: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
3390: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
33a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
33b0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
33c0: 7a 54 61 62 2c 20 7a 4c 65 66 74 29 21 3d 30 20  zTab, zLeft)!=0 
33d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
33e0: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
33f0: 61 62 2b 2b 29 20 29 20 70 45 78 70 72 2d 3e 69  ab++) ) pExpr->i
3400: 54 61 62 6c 65 20 3d 20 69 20 2b 20 70 50 61 72  Table = i + pPar
3410: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 20 20  se->nTab;.      
3420: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
3430: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
3440: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
3450: 69 74 65 53 74 72 49 43 6d 70 28 70 54 61 62 2d  iteStrICmp(pTab-
3460: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
3470: 7a 52 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20  zRight)==0 ){.  
3480: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
3490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
34a0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 2b  pr->iTable = i +
34b0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
34c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
34d0: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
34e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
34f0: 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65  * Substitute the
3500: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
3510: 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  or the INTEGER P
3520: 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20  RIMARY KEY */.  
3530: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
3540: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  r->iColumn = -1;
3550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
3560: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
3570: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
3580: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
3590: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
35a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d  }.      if( cnt=
35c0: 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20  =0 && cntTab==1 
35d0: 26 26 20 73 71 6c 69 74 65 49 73 52 6f 77 69 64  && sqliteIsRowid
35e0: 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
35f0: 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20      cnt = 1;.   
3600: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
3610: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
3620: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  }.      sqliteFr
3630: 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 20 20 20  ee(zLeft);.     
3640: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67   sqliteFree(zRig
3650: 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ht);.      if( c
3660: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nt==0 ){.       
3670: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
3680: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3690: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  sg, "no such col
36a0: 75 6d 6e 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20  umn: ", -1,  .  
36b0: 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74          pLeft->t
36c0: 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74  oken.z, pLeft->t
36d0: 6f 6b 65 6e 2e 6e 2c 20 22 2e 22 2c 20 31 2c 20  oken.n, ".", 1, 
36e0: 0a 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68  .          pRigh
36f0: 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67  t->token.z, pRig
3700: 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b  ht->token.n, 0);
3710: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
3720: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
3730: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
3740: 20 7d 65 6c 73 65 20 69 66 28 20 63 6e 74 3e 31   }else if( cnt>1
3750: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3760: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
3770: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
3780: 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e  ambiguous column
3790: 20 6e 61 6d 65 3a 20 22 2c 20 2d 31 2c 20 20 0a   name: ", -1,  .
37a0: 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d            pLeft-
37b0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d  >token.z, pLeft-
37c0: 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 2e 22 2c 20 31  >token.n, ".", 1
37d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 52 69 67  ,.          pRig
37e0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69  ht->token.z, pRi
37f0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29  ght->token.n, 0)
3800: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
3810: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
3820: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3830: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
3840: 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74  ExprDelete(pLeft
3850: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
3860: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20  pLeft = 0;.     
3870: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
3880: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  e(pRight);.     
3890: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
38a0: 20 30 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   0;.      pExpr-
38b0: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
38c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
38d0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
38e0: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 56 64 62  _IN: {.      Vdb
38f0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74  e *v = sqliteGet
3900: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
3910: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
3920: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 69  eturn 1;.      i
3930: 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  f( sqliteExprRes
3940: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
3950: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
3960: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  , pExpr->pLeft) 
3970: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3980: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
3990: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
39a0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
39b0: 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
39c0: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
39d0: 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
39e0: 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
39f0: 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
3a00: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
3a10: 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
3a20: 20 61 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20   a temporary.   
3a30: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20       ** table.  
3a40: 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
3a50: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
3a60: 72 79 20 74 61 62 6c 65 20 68 61 73 20 61 6c 72  ry table has alr
3a70: 65 61 64 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  eady.        ** 
3a80: 62 65 65 6e 20 70 75 74 20 69 6e 20 69 54 61 62  been put in iTab
3a90: 6c 65 20 62 79 20 73 71 6c 69 74 65 45 78 70 72  le by sqliteExpr
3aa0: 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28  ResolveInSelect(
3ab0: 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
3ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
3ad0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
3ae0: 54 65 6d 70 2c 20 70 45 78 70 72 2d 3e 69 54 61  Temp, pExpr->iTa
3af0: 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ble, 1);.       
3b00: 20 69 66 28 20 73 71 6c 69 74 65 53 65 6c 65 63   if( sqliteSelec
3b10: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
3b20: 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 53 65  >pSelect, SRT_Se
3b30: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
3b40: 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ) );.      }else
3b50: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73   if( pExpr->pLis
3b60: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
3b70: 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
3b80: 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
3b90: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
3ba0: 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 73 65    ** Create a se
3bb0: 74 20 74 6f 20 70 75 74 20 74 68 65 20 65 78 70  t to put the exp
3bc0: 72 6c 69 73 74 20 76 61 6c 75 65 73 20 69 6e 2e  rlist values in.
3bd0: 20 20 54 68 65 20 53 65 74 20 69 64 20 69 73 20    The Set id is 
3be0: 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a  stored.        *
3bf0: 2a 20 69 6e 20 69 54 61 62 6c 65 2e 0a 20 20 20  * in iTable..   
3c00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
3c10: 69 6e 74 20 69 2c 20 69 53 65 74 3b 0a 20 20 20  int i, iSet;.   
3c20: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
3c30: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
3c40: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
3c50: 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
3c60: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
3c70: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
3c80: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
3c90: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
3ca0: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
3cb0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
3cc0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
3cd0: 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
3ce0: 20 20 20 22 72 69 67 68 74 2d 68 61 6e 64 20 73     "right-hand s
3cf0: 69 64 65 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ide of IN operat
3d00: 6f 72 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  or must be const
3d10: 61 6e 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ant", 0);.      
3d20: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
3d30: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  rr++;.          
3d40: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3d60: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
3d70: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
3d80: 32 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  2, 0, 0) ){.    
3d90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
3da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3dc0: 69 53 65 74 20 3d 20 70 45 78 70 72 2d 3e 69 54  iSet = pExpr->iT
3dd0: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
3de0: 53 65 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66  Set++;.        f
3df0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d  or(i=0; i<pExpr-
3e00: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
3e10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
3e20: 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72  xpr *pE2 = pExpr
3e30: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
3e40: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
3e50: 77 69 74 63 68 28 20 70 45 32 2d 3e 6f 70 20 29  witch( pE2->op )
3e60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  {.            ca
3e70: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
3e80: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
3e90: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
3ea0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54        case TK_ST
3eb0: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 20 20  RING: {.        
3ec0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
3ed0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3ee0: 28 76 2c 20 4f 50 5f 53 65 74 49 6e 73 65 72 74  (v, OP_SetInsert
3ef0: 2c 20 69 53 65 74 2c 20 30 29 3b 0a 20 20 20 20  , iSet, 0);.    
3f00: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
3f10: 28 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  ( pE2->token.z )
3f20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3f30: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
3f40: 50 33 28 76 2c 20 61 64 64 72 2c 20 70 45 32 2d  P3(v, addr, pE2-
3f50: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 32 2d 3e 74  >token.z, pE2->t
3f60: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20  oken.n);.       
3f70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
3f80: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
3f90: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  dr);.           
3fa0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3fc0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
3fe0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
3ff0: 73 65 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20  se, pE2);.      
4000: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4010: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
4020: 74 49 6e 73 65 72 74 2c 20 69 53 65 74 2c 20 30  tInsert, iSet, 0
4030: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
4040: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4050: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4060: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
4070: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4080: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4090: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
40a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20      /* This has 
40b0: 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53  to be a scalar S
40c0: 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65  ELECT.  Generate
40d0: 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
40e0: 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  .      ** value 
40f0: 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69  of this select i
4100: 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  n a memory cell 
4110: 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e  and record the n
4120: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f  umber.      ** o
4130: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
4140: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
4150: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
4160: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50  pr->iColumn = pP
4170: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
4180: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 65      if( sqliteSe
4190: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
41a0: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  pr->pSelect, SRT
41b0: 5f 4d 65 6d 2c 20 70 45 78 70 72 2d 3e 69 43 6f  _Mem, pExpr->iCo
41c0: 6c 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  lumn) ){.       
41d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
41e0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
41f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f      }..    /* Fo
4200: 72 20 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74  r all else, just
4210: 20 72 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c   recursively wal
4220: 6b 20 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20  k the tree */.  
4230: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
4240: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
4250: 65 66 74 0a 20 20 20 20 20 20 26 26 20 73 71 6c  eft.      && sql
4260: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
4270: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
4280: 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70  st, pEList, pExp
4290: 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  r->pLeft) ){.   
42a0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
42b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
42c0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 0a   pExpr->pRight .
42d0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 45        && sqliteE
42e0: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
42f0: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
4300: 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70  pEList, pExpr->p
4310: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
4320: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4330: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
4340: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
4350: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
4360: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
4370: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
4380: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
4390: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
43a0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
43b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
43c0: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
43d0: 50 61 72 73 65 2c 70 54 61 62 4c 69 73 74 2c 70  Parse,pTabList,p
43e0: 45 4c 69 73 74 2c 70 4c 69 73 74 2d 3e 61 5b 69  EList,pList->a[i
43f0: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
4400: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
4410: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4430: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4440: 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 20 30 20 2f  rn 0;.}..#if 0 /
4450: 2a 20 4e 4f 54 20 55 53 45 44 20 2a 2f 0a 2f 2a  * NOT USED */./*
4460: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 61 20 74 6f  .** Compare a to
4470: 6b 65 6e 20 61 67 61 69 6e 73 74 20 61 20 73 74  ken against a st
4480: 72 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 54 52  ring.  Return TR
4490: 55 45 20 69 66 20 74 68 65 79 20 6d 61 74 63 68  UE if they match
44a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
44b0: 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6d 70 28 54  sqliteTokenCmp(T
44c0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 63 6f  oken *pToken, co
44d0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b  nst char *zStr){
44e0: 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65  .  int n = strle
44f0: 6e 28 7a 53 74 72 29 3b 0a 20 20 69 66 28 20 6e  n(zStr);.  if( n
4500: 21 3d 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 72 65  !=pToken->n ) re
4510: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
4520: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
4530: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 7a 53 74 72 2c  pToken->z, zStr,
4540: 20 6e 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66   n)==0;.}.#endif
4550: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
4560: 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  a function name 
4570: 69 6e 74 6f 20 69 74 73 20 69 6e 74 65 67 65 72  into its integer
4580: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 52 65   identifier.  Re
4590: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 69 64 65 6e  turn the.** iden
45a0: 74 69 66 69 65 72 2e 20 20 52 65 74 75 72 6e 20  tifier.  Return 
45b0: 46 4e 5f 55 6e 6b 6e 6f 77 6e 20 69 66 20 74 68  FN_Unknown if th
45c0: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
45d0: 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2f 0a 69  is unknown..*/.i
45e0: 6e 74 20 73 71 6c 69 74 65 46 75 6e 63 49 64 28  nt sqliteFuncId(
45f0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
4600: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
4610: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
4620: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69  r *zName;.     i
4630: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 69 6e 74  nt len;.     int
4640: 20 69 64 3b 0a 20 20 7d 20 61 46 75 6e 63 5b 5d   id;.  } aFunc[]
4650: 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 63 6f 75   = {.     { "cou
4660: 6e 74 22 2c 20 20 35 2c 20 46 4e 5f 43 6f 75 6e  nt",  5, FN_Coun
4670: 74 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 69  t  },.     { "mi
4680: 6e 22 2c 20 20 20 20 33 2c 20 46 4e 5f 4d 69 6e  n",    3, FN_Min
4690: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d      },.     { "m
46a0: 61 78 22 2c 20 20 20 20 33 2c 20 46 4e 5f 4d 61  ax",    3, FN_Ma
46b0: 78 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  x    },.     { "
46c0: 73 75 6d 22 2c 20 20 20 20 33 2c 20 46 4e 5f 53  sum",    3, FN_S
46d0: 75 6d 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  um    },.     { 
46e0: 22 61 76 67 22 2c 20 20 20 20 33 2c 20 46 4e 5f  "avg",    3, FN_
46f0: 41 76 67 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  Avg    },.     {
4700: 20 22 6c 65 6e 67 74 68 22 2c 20 36 2c 20 46 4e   "length", 6, FN
4710: 5f 4c 65 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20  _Length },.     
4720: 7b 20 22 73 75 62 73 74 72 22 2c 20 36 2c 20 46  { "substr", 6, F
4730: 4e 5f 53 75 62 73 74 72 20 7d 2c 0a 20 20 20 20  N_Substr },.    
4740: 20 7b 20 22 61 62 73 22 2c 20 20 20 20 33 2c 20   { "abs",    3, 
4750: 46 4e 5f 41 62 73 20 20 20 20 7d 2c 0a 20 20 20  FN_Abs    },.   
4760: 20 20 7b 20 22 72 6f 75 6e 64 22 2c 20 20 35 2c    { "round",  5,
4770: 20 46 4e 5f 52 6f 75 6e 64 20 20 7d 2c 0a 20 20   FN_Round  },.  
4780: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  };.  int i;.  fo
4790: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
47a0: 7a 65 28 61 46 75 6e 63 29 3b 20 69 2b 2b 29 7b  ze(aFunc); i++){
47b0: 0a 20 20 20 20 69 66 28 20 61 46 75 6e 63 5b 69  .    if( aFunc[i
47c0: 5d 2e 6c 65 6e 3d 3d 70 54 6f 6b 65 6e 2d 3e 6e  ].len==pToken->n
47d0: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
47e0: 53 74 72 4e 49 43 6d 70 28 70 54 6f 6b 65 6e 2d  StrNICmp(pToken-
47f0: 3e 7a 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a 4e 61  >z, aFunc[i].zNa
4800: 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e 6c 65 6e  me, aFunc[i].len
4810: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 72  )==0 ){.       r
4820: 65 74 75 72 6e 20 61 46 75 6e 63 5b 69 5d 2e 69  eturn aFunc[i].i
4830: 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  d;.    }.  }.  r
4840: 65 74 75 72 6e 20 46 4e 5f 55 6e 6b 6e 6f 77 6e  eturn FN_Unknown
4850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72  ;.}../*.** Error
4860: 20 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74   check the funct
4870: 69 6f 6e 73 20 69 6e 20 61 6e 20 65 78 70 72 65  ions in an expre
4880: 73 73 69 6f 6e 2e 20 20 4d 61 6b 65 20 73 75 72  ssion.  Make sur
4890: 65 20 61 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f  e all.** functio
48a0: 6e 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f  n names are reco
48b0: 67 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66  gnized and all f
48c0: 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 74 68  unctions have th
48d0: 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6e 75 6d  e correct.** num
48e0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
48f0: 2e 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f  .  Leave an erro
4900: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
4910: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20  rse->zErrMsg.** 
4920: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61  if anything is a
4930: 6d 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68  miss.  Return th
4940: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
4950: 72 73 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49 73  rs..**.** if pIs
4960: 41 67 67 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20  Agg is not null 
4970: 61 6e 64 20 74 68 69 73 20 65 78 70 72 65 73 73  and this express
4980: 69 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67  ion is an aggreg
4990: 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
49a0: 28 6c 69 6b 65 20 63 6f 75 6e 74 28 2a 29 20 6f  (like count(*) o
49b0: 72 20 6d 61 78 28 76 61 6c 75 65 29 29 20 74 68  r max(value)) th
49c0: 65 6e 20 77 72 69 74 65 20 61 20 31 20 69 6e 74  en write a 1 int
49d0: 6f 20 2a 70 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e  o *pIsAgg..*/.in
49e0: 74 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  t sqliteExprChec
49f0: 6b 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  k(Parse *pParse,
4a00: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
4a10: 74 20 61 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20  t allowAgg, int 
4a20: 2a 70 49 73 41 67 67 29 7b 0a 20 20 69 6e 74 20  *pIsAgg){.  int 
4a30: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  nErr = 0;.  if( 
4a40: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
4a50: 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  n 0;.  switch( p
4a60: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
4a70: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
4a80: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  : {.      int id
4a90: 20 3d 20 73 71 6c 69 74 65 46 75 6e 63 49 64 28   = sqliteFuncId(
4aa0: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
4ab0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45        int n = pE
4ac0: 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78  xpr->pList ? pEx
4ad0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
4ae0: 20 3a 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   : 0;.      int 
4af0: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
4b00: 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 6f 5f  ;.      int too_
4b10: 6d 61 6e 79 5f 61 72 67 73 20 3d 20 30 3b 0a 20  many_args = 0;. 
4b20: 20 20 20 20 20 69 6e 74 20 74 6f 6f 5f 66 65 77       int too_few
4b30: 5f 61 72 67 73 20 3d 20 30 3b 0a 20 20 20 20 20  _args = 0;.     
4b40: 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   int wrong_num_a
4b50: 72 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rgs = 0;.      i
4b60: 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20  nt is_agg = 0;. 
4b70: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
4b80: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
4b90: 20 3d 20 69 64 3b 0a 20 20 20 20 20 20 73 77 69   = id;.      swi
4ba0: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 20  tch( id ){.     
4bb0: 20 20 20 63 61 73 65 20 46 4e 5f 55 6e 6b 6e 6f     case FN_Unkno
4bc0: 77 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  wn: {.          
4bd0: 55 73 65 72 46 75 6e 63 20 2a 70 55 73 65 72 20  UserFunc *pUser 
4be0: 3d 20 73 71 6c 69 74 65 46 69 6e 64 55 73 65 72  = sqliteFindUser
4bf0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
4c00: 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
4c10: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
4c20: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
4c30: 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , n, 0);.       
4c40: 20 20 20 69 66 28 20 70 55 73 65 72 3d 3d 30 20     if( pUser==0 
4c50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
4c60: 55 73 65 72 20 3d 20 73 71 6c 69 74 65 46 69 6e  User = sqliteFin
4c70: 64 55 73 65 72 46 75 6e 63 74 69 6f 6e 28 70 50  dUserFunction(pP
4c80: 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
4c90: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
4ca0: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
4cb0: 74 6f 6b 65 6e 2e 6e 2c 20 2d 31 2c 20 30 29 3b  token.n, -1, 0);
4cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
4cd0: 20 70 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20   pUser==0 ){.   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75             no_su
4cf0: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
4d00: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72                wr
4d20: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31  ong_num_args = 1
4d30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
4d40: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
4d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 5f  .            is_
4d60: 61 67 67 20 3d 20 70 55 73 65 72 2d 3e 78 46 75  agg = pUser->xFu
4d70: 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  nc==0;.         
4d80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
4d90: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
4da0: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 43 6f        case FN_Co
4db0: 75 6e 74 3a 20 7b 20 0a 20 20 20 20 20 20 20 20  unt: { .        
4dc0: 20 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73 20    too_many_args 
4dd0: 3d 20 6e 3e 31 3b 0a 20 20 20 20 20 20 20 20 20  = n>1;.         
4de0: 20 69 73 5f 61 67 67 20 3d 20 31 3b 0a 20 20 20   is_agg = 1;.   
4df0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4e00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4e10: 63 61 73 65 20 46 4e 5f 4d 61 78 3a 0a 20 20 20  case FN_Max:.   
4e20: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4d 69 6e       case FN_Min
4e30: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 74 6f  : {.          to
4e40: 6f 5f 66 65 77 5f 61 72 67 73 20 3d 20 6e 3c 31  o_few_args = n<1
4e50: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 73 5f 61  ;.          is_a
4e60: 67 67 20 3d 20 6e 3d 3d 31 3b 0a 20 20 20 20 20  gg = n==1;.     
4e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4e80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
4e90: 73 65 20 46 4e 5f 41 76 67 3a 0a 20 20 20 20 20  se FN_Avg:.     
4ea0: 20 20 20 63 61 73 65 20 46 4e 5f 53 75 6d 3a 20     case FN_Sum: 
4eb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f  {.          too_
4ec0: 6d 61 6e 79 5f 61 72 67 73 20 3d 20 6e 3e 31 3b  many_args = n>1;
4ed0: 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 66  .          too_f
4ee0: 65 77 5f 61 72 67 73 20 3d 20 6e 3c 31 3b 0a 20  ew_args = n<1;. 
4ef0: 20 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20           is_agg 
4f00: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
4f10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
4f20: 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f          case FN_
4f30: 41 62 73 3a 0a 20 20 20 20 20 20 20 20 63 61 73  Abs:.        cas
4f40: 65 20 46 4e 5f 4c 65 6e 67 74 68 3a 20 7b 0a 20  e FN_Length: {. 
4f50: 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 66 65 77           too_few
4f60: 5f 61 72 67 73 20 3d 20 6e 3c 31 3b 0a 20 20 20  _args = n<1;.   
4f70: 20 20 20 20 20 20 20 74 6f 6f 5f 6d 61 6e 79 5f         too_many_
4f80: 61 72 67 73 20 3d 20 6e 3e 31 3b 0a 20 20 20 20  args = n>1;.    
4f90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4fa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
4fb0: 61 73 65 20 46 4e 5f 52 6f 75 6e 64 3a 20 7b 0a  ase FN_Round: {.
4fc0: 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 66 65            too_fe
4fd0: 77 5f 61 72 67 73 20 3d 20 6e 3c 31 3b 0a 20 20  w_args = n<1;.  
4fe0: 20 20 20 20 20 20 20 20 74 6f 6f 5f 6d 61 6e 79          too_many
4ff0: 5f 61 72 67 73 20 3d 20 6e 3e 32 3b 0a 20 20 20  _args = n>2;.   
5000: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5020: 63 61 73 65 20 46 4e 5f 53 75 62 73 74 72 3a 20  case FN_Substr: 
5030: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f  {.          too_
5040: 66 65 77 5f 61 72 67 73 20 3d 20 6e 3c 33 3b 0a  few_args = n<3;.
5050: 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 6d 61            too_ma
5060: 6e 79 5f 61 72 67 73 20 3d 20 6e 3e 33 3b 0a 20  ny_args = n>3;. 
5070: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5080: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5090: 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
50a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
50b0: 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 61  if( is_agg && !a
50c0: 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20  llowAgg ){.     
50d0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
50e0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
50f0: 72 4d 73 67 2c 20 22 6d 69 73 75 73 65 20 6f 66  rMsg, "misuse of
5100: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
5110: 69 6f 6e 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20  ion ", -1,.     
5120: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
5130: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
5140: 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c 20 30  en.n, "()", 2, 0
5150: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
5160: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5170: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
5180: 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20     is_agg = 0;. 
5190: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
51a0: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20  o_such_func ){. 
51b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
51c0: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
51d0: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
51e0: 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 22 2c 20  ch function: ", 
51f0: 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  -1,.           p
5200: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
5210: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30  Expr->token.n, 0
5220: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
5230: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5240: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
5250: 20 7d 65 6c 73 65 20 69 66 28 20 74 6f 6f 5f 6d   }else if( too_m
5260: 61 6e 79 5f 61 72 67 73 20 29 7b 0a 20 20 20 20  any_args ){.    
5270: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
5280: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
5290: 72 72 4d 73 67 2c 20 22 74 6f 6f 20 6d 61 6e 79  rrMsg, "too many
52a0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
52b0: 6e 63 74 69 6f 6e 20 22 2c 2d 31 2c 0a 20 20 20  nction ",-1,.   
52c0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
52d0: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
52e0: 6f 6b 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c  oken.n, "()", 2,
52f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
5300: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
5310: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
5320: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 6f 6f     }else if( too
5330: 5f 66 65 77 5f 61 72 67 73 20 29 7b 0a 20 20 20  _few_args ){.   
5340: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
5350: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
5360: 45 72 72 4d 73 67 2c 20 22 74 6f 6f 20 66 65 77  ErrMsg, "too few
5370: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
5380: 6e 63 74 69 6f 6e 20 22 2c 2d 31 2c 0a 20 20 20  nction ",-1,.   
5390: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
53a0: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
53b0: 6f 6b 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c  oken.n, "()", 2,
53c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
53d0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
53e0: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
53f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f     }else if( wro
5400: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20  ng_num_args ){. 
5410: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
5420: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
5430: 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20  >zErrMsg, .     
5440: 20 20 20 20 20 20 22 77 72 6f 6e 67 20 6e 75 6d        "wrong num
5450: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
5460: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 22 2c 2d   to function ",-
5470: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 45  1,.           pE
5480: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
5490: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 28  xpr->token.n, "(
54a0: 29 22 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  )", 2, 0);.     
54b0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
54c0: 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  +;.        nErr+
54d0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
54e0: 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 45   if( is_agg ) pE
54f0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
5500: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20  _FUNCTION;.     
5510: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 70   if( is_agg && p
5520: 49 73 41 67 67 20 29 20 2a 70 49 73 41 67 67 20  IsAgg ) *pIsAgg 
5530: 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 1;.      for(i
5540: 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69  =0; nErr==0 && i
5550: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
5560: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45    nErr = sqliteE
5570: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
5580: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
5590: 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20  [i].pExpr,.     
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 41            allowA
55c0: 67 67 20 26 26 20 21 69 73 5f 61 67 67 2c 20 70  gg && !is_agg, p
55d0: 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a  IsAgg);.      }.
55e0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
55f0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
5600: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
5610: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
5620: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
5630: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
5640: 66 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49  ft, allowAgg, pI
5650: 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sAgg);.      }. 
5660: 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30       if( nErr==0
5670: 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
5680: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72  t ){.        nEr
5690: 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 43 68  r = sqliteExprCh
56a0: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70  eck(pParse, pExp
56b0: 72 2d 3e 70 52 69 67 68 74 2c 20 61 6c 6c 6f 77  r->pRight, allow
56c0: 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20  Agg, pIsAgg);.  
56d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
56e0: 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72  nErr==0 && pExpr
56f0: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
5700: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
5710: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  ->pList->nExpr;.
5720: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
5730: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
5740: 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20  nErr==0 && i<n; 
5750: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
5760: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70  Expr *pE2 = pExp
5770: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
5780: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
5790: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70  nErr = sqliteExp
57a0: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
57b0: 45 32 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49  E2, allowAgg, pI
57c0: 73 41 67 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  sAgg);.        }
57d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
57e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
57f0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d    return nErr;.}
5800: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
5810: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
5820: 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
5830: 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
5840: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
5850: 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65  and leave the re
5860: 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  sult on the top 
5870: 6f 66 20 73 74 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  of stack..*/.voi
5880: 64 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65  d sqliteExprCode
5890: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
58a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
58b0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
58c0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
58d0: 70 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  p;.  if( v==0 ||
58e0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
58f0: 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  rn;.  switch( pE
5900: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
5910: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20  ase TK_PLUS:    
5920: 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20 20 20   op = OP_Add;   
5930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
5940: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 20  se TK_MINUS:    
5950: 6f 70 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74  op = OP_Subtract
5960: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5970: 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 20 6f  e TK_STAR:     o
5980: 70 20 3d 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3b  p = OP_Multiply;
5990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
59a0: 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 20 6f 70   TK_SLASH:    op
59b0: 20 3d 20 4f 50 5f 44 69 76 69 64 65 3b 20 20 20   = OP_Divide;   
59c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
59d0: 54 4b 5f 41 4e 44 3a 20 20 20 20 20 20 6f 70 20  TK_AND:      op 
59e0: 3d 20 4f 50 5f 41 6e 64 3b 20 20 20 20 20 20 62  = OP_And;      b
59f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
5a00: 4b 5f 4f 52 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_OR:       op =
5a10: 20 4f 50 5f 4f 72 3b 20 20 20 20 20 20 20 62 72   OP_Or;       br
5a20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
5a30: 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _LT:       op = 
5a40: 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Lt;       bre
5a50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
5a60: 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LE:       op = O
5a70: 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Le;       brea
5a80: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
5a90: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
5aa0: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
5ab0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
5ac0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
5ad0: 47 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Ge;       break;
5ae0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
5af0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e         op = OP_N
5b00: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
5b10: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
5b20: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
5b30: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
5b40: 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a     case TK_LIKE:
5b50: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 69 6b       op = OP_Lik
5b60: 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e;     break;.  
5b70: 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20    case TK_GLOB: 
5b80: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 6c 6f 62      op = OP_Glob
5b90: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
5ba0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
5bb0: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c     op = OP_IsNul
5bc0: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
5bd0: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
5be0: 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c    op = OP_NotNul
5bf0: 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  l;  break;.    c
5c00: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20  ase TK_NOT:     
5c10: 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 3b 20 20 20   op = OP_Not;   
5c20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
5c30: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 20  se TK_UMINUS:   
5c40: 6f 70 20 3d 20 4f 50 5f 4e 65 67 61 74 69 76 65  op = OP_Negative
5c50: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5c60: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 20 6f  e TK_BITAND:   o
5c70: 70 20 3d 20 4f 50 5f 42 69 74 41 6e 64 3b 20 20  p = OP_BitAnd;  
5c80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5c90: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 20 6f 70   TK_BITOR:    op
5ca0: 20 3d 20 4f 50 5f 42 69 74 4f 72 3b 20 20 20 20   = OP_BitOr;    
5cb0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5cc0: 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 20 6f 70 20  TK_BITNOT:   op 
5cd0: 3d 20 4f 50 5f 42 69 74 4e 6f 74 3b 20 20 20 62  = OP_BitNot;   b
5ce0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
5cf0: 4b 5f 4c 53 48 49 46 54 3a 20 20 20 6f 70 20 3d  K_LSHIFT:   op =
5d00: 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3b 20 20   OP_ShiftLeft;  
5d10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5d20: 54 4b 5f 52 53 48 49 46 54 3a 20 20 20 6f 70 20  TK_RSHIFT:   op 
5d30: 3d 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3b  = OP_ShiftRight;
5d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5d50: 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 20 6f 70   TK_REM:      op
5d60: 20 3d 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3b   = OP_Remainder;
5d70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
5d80: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
5d90: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
5da0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
5db0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
5dc0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
5dd0: 75 73 65 41 67 67 20 29 7b 0a 20 20 20 20 20 20  useAgg ){.      
5de0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5df0: 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20  p(v, OP_AggGet, 
5e00: 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b  0, pExpr->iAgg);
5e10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
5e20: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
5e30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
5e40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5e50: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70   OP_Column, pExp
5e60: 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
5e70: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
5e80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5e90: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5ea0: 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 70 45  (v, OP_Recno, pE
5eb0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
5ec0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5ed0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5ee0: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
5ef0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
5f00: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
5f10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5f20: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
5f30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5f40: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b  Expr->token.z );
5f50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
5f60: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
5f70: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
5f80: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
5f90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5fa0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
5fb0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
5fc0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
5fd0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5fe0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
5ff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
6000: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b  Expr->token.z );
6010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6020: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
6030: 72 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r, pExpr->token.
6040: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
6050: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
6060: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
6070: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
6080: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6090: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
60a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
60b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
60c0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
60d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
60e0: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
60f0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
6100: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
6110: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
6120: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
6130: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
6140: 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
6150: 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
6160: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
6170: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
6180: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
6190: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
61a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
61b0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
61c0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
61d0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
61e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
61f0: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
6200: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6210: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  }.    case TK_LS
6220: 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
6230: 4b 5f 52 53 48 49 46 54 3a 20 7b 0a 20 20 20 20  K_RSHIFT: {.    
6240: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6250: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
6260: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
6270: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
6280: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
6290: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
62a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
62b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
62c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
62d0: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
62e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
62f0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
6300: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
6310: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
6320: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
6330: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
6340: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6350: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32  (v, OP_Concat, 2
6360: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
6370: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6380: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
6390: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
63a0: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
63b0: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
63c0: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
63d0: 65 20 54 4b 5f 45 51 3a 20 0a 20 20 20 20 63 61  e TK_EQ: .    ca
63e0: 73 65 20 54 4b 5f 4c 49 4b 45 3a 20 0a 20 20 20  se TK_LIKE: .   
63f0: 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b   case TK_GLOB: {
6400: 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b  .      int dest;
6410: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6420: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
6430: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
6440: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
6450: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
6460: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
6470: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
6480: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
6490: 67 68 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74  ght);.      dest
64a0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72   = sqliteVdbeCur
64b0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
64c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
64d0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
64e0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
64f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6500: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20   OP_AddImm, -1, 
6510: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
6520: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6530: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
6540: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
6550: 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ->pLeft );.     
6560: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
6570: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
6580: 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  || pExpr->pLeft-
6590: 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
65a0: 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e  ){.        Token
65b0: 20 2a 70 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c   *p = &pExpr->pL
65c0: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
65d0: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
65e0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e  liteMalloc( p->n
65f0: 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20   + 2 );.        
6600: 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a  sprintf(z, "-%.*
6610: 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b  s", p->n, p->z);
6620: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
6630: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
6640: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
6650: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6660: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
6670: 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20  z, p->n+1);.    
6680: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
6690: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
66a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
66b0: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
66c0: 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20  into TK_NOT */. 
66d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
66e0: 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
66f0: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
6700: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6710: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
6720: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
6730: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6740: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
6750: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6760: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
6770: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
6780: 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
6790: 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  int dest;.      
67a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
67b0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
67c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
67d0: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
67e0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
67f0: 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20 73  ;.      dest = s
6800: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
6810: 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20  Addr(v) + 2;.   
6820: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6830: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73  Op(v, op, 0, des
6840: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
6850: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6860: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a  AddImm, -1, 0);.
6870: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6880: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
6890: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
68a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
68b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65  ddOp(v, OP_AggGe
68c0: 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67  t, 0, pExpr->iAg
68d0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  g);.      if( pE
68e0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 46 4e  xpr->iColumn==FN
68f0: 5f 41 76 67 20 29 7b 0a 20 20 20 20 20 20 20 20  _Avg ){.        
6900: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
6910: 69 41 67 67 43 6f 75 6e 74 3e 3d 30 20 26 26 20  iAggCount>=0 && 
6920: 70 50 61 72 73 65 2d 3e 69 41 67 67 43 6f 75 6e  pParse->iAggCoun
6930: 74 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29  t<pParse->nAgg )
6940: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6950: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6960: 41 67 67 47 65 74 2c 20 30 2c 20 70 50 61 72 73  AggGet, 0, pPars
6970: 65 2d 3e 69 41 67 67 43 6f 75 6e 74 29 3b 0a 20  e->iAggCount);. 
6980: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
6990: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 76  eAddOp(v, OP_Div
69a0: 69 64 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ide, 0, 0);.    
69b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
69c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
69d0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
69e0: 20 20 20 20 20 69 6e 74 20 69 64 20 3d 20 70 45       int id = pE
69f0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
6a00: 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20      int op;.    
6a10: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45    int i;.      E
6a20: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
6a30: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
6a40: 20 20 20 20 20 73 77 69 74 63 68 28 20 69 64 20       switch( id 
6a50: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
6a60: 46 4e 5f 4d 69 6e 3a 20 0a 20 20 20 20 20 20 20  FN_Min: .       
6a70: 20 63 61 73 65 20 46 4e 5f 4d 61 78 3a 20 7b 0a   case FN_Max: {.
6a80: 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20 69            op = i
6a90: 64 3d 3d 46 4e 5f 4d 69 6e 20 3f 20 4f 50 5f 4d  d==FN_Min ? OP_M
6aa0: 69 6e 20 3a 20 4f 50 5f 4d 61 78 3b 0a 20 20 20  in : OP_Max;.   
6ab0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
6ac0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
6ad0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
6ae0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6af0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
6b00: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
6b10: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
6b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6b30: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6b40: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6b60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6b70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6b80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
6b90: 65 20 46 4e 5f 41 62 73 3a 20 7b 0a 20 20 20 20  e FN_Abs: {.    
6ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
6bb0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
6bc0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
6bd0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6be0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6bf0: 5f 41 62 73 56 61 6c 75 65 2c 20 30 2c 20 30 29  _AbsValue, 0, 0)
6c00: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
6c10: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
6c20: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 52 6f 75       case FN_Rou
6c30: 6e 64 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  nd: {.          
6c40: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
6c50: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==2 ){.         
6c60: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
6c70: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
6c80: 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
6c90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6ca0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6cb0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6cc0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
6cd0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6ce0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
6cf0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
6d00: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
6d10: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
6d20: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6d30: 50 5f 50 72 65 63 69 73 69 6f 6e 2c 20 30 2c 20  P_Precision, 0, 
6d40: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
6d50: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
6d60: 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4c         case FN_L
6d70: 65 6e 67 74 68 3a 20 7b 0a 20 20 20 20 20 20 20  ength: {.       
6d80: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
6d90: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
6da0: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
6db0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
6dc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
6dd0: 72 6c 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  rlen, 0, 0);.   
6de0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6e00: 63 61 73 65 20 46 4e 5f 53 75 62 73 74 72 3a 20  case FN_Substr: 
6e10: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
6e20: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
6e30: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
6e40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
6e50: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
6e60: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
6e70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6e80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
6e90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 75  beAddOp(v, OP_Su
6ea0: 62 73 74 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  bstr, 0, 0);.   
6eb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6ed0: 63 61 73 65 20 46 4e 5f 55 6e 6b 6e 6f 77 6e 3a  case FN_Unknown:
6ee0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 55 73 65   {.          Use
6ef0: 72 46 75 6e 63 20 2a 70 55 73 65 72 3b 0a 20 20  rFunc *pUser;.  
6f00: 20 20 20 20 20 20 20 20 70 55 73 65 72 20 3d 20          pUser = 
6f10: 73 71 6c 69 74 65 46 69 6e 64 55 73 65 72 46 75  sqliteFindUserFu
6f20: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
6f30: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
6f40: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6f50: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
6f60: 74 6f 6b 65 6e 2e 6e 2c 20 70 4c 69 73 74 2d 3e  token.n, pList->
6f70: 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  nExpr, 0);.     
6f80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 55 73       assert( pUs
6f90: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  er!=0 );.       
6fa0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
6fb0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
6fc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
6fd0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
6fe0: 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
6ff0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
7000: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
7010: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7020: 2c 20 4f 50 5f 55 73 65 72 46 75 6e 63 2c 20 70  , OP_UserFunc, p
7030: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  List->nExpr, 0);
7040: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7050: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7060: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 55 73 65   -1, (char*)pUse
7070: 72 2d 3e 78 46 75 6e 63 2c 20 50 33 5f 50 4f 49  r->xFunc, P3_POI
7080: 4e 54 45 52 29 3b 0a 20 20 20 20 20 20 20 20 20  NTER);.         
7090: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
70a0: 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  }.        defaul
70b0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  t: {.          /
70c0: 2a 20 43 61 6e 27 74 20 68 61 70 70 65 6e 21 20  * Can't happen! 
70d0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  */.          bre
70e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
70f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7100: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7110: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
7120: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7130: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
7140: 61 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ad, pExpr->iColu
7150: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  mn, 0);.      br
7160: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7170: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
7180: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
7190: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
71a0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
71b0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
71c0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
71d0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
71e0: 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ft);.      addr 
71f0: 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72  = sqliteVdbeCurr
7200: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
7210: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
7220: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
7230: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7240: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
7250: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72  pr->iTable, addr
7260: 2b 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +2);.      }else
7270: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7280: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7290: 53 65 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  SetFound, pExpr-
72a0: 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 32 29  >iTable, addr+2)
72b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
72c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
72d0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
72e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
72f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7300: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
7310: 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20        int lbl = 
7320: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
7330: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
7340: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7350: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
7360: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
7370: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
7380: 73 65 2c 20 70 45 78 70 72 2c 20 6c 62 6c 29 3b  se, pExpr, lbl);
7390: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
73a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
73b0: 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Imm, 1, 0);.    
73c0: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
73d0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29  lveLabel(v, lbl)
73e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
73f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7400: 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _AS: {.      sql
7410: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
7420: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
7430: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7440: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7450: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  rn;.}../*.** Gen
7460: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
7470: 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
7480: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
7490: 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
74a0: 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
74b0: 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
74c0: 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
74d0: 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
74e0: 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
74f0: 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
7500: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
7510: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
7520: 65 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  eExprIfTrue(Pars
7530: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
7540: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
7550: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
7560: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
7570: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66  int op = 0;.  if
7580: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
7590: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
75a0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
75b0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
75c0: 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LT:       op = O
75d0: 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65 61  P_Lt;       brea
75e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
75f0: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
7600: 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Le;       break
7610: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
7620: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
7630: 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Gt;       break;
7640: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
7650: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47         op = OP_G
7660: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
7670: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
7680: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65        op = OP_Ne
7690: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
76a0: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
76b0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b       op = OP_Eq;
76c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
76d0: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 20    case TK_LIKE: 
76e0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 69 6b 65      op = OP_Like
76f0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
7700: 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 20   case TK_GLOB:  
7710: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 6c 6f 62 3b     op = OP_Glob;
7720: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7730: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20  case TK_ISNULL: 
7740: 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c    op = OP_IsNull
7750: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
7760: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
7770: 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c   op = OP_NotNull
7780: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  ;  break;.    de
7790: 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20  fault:  break;. 
77a0: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78   }.  switch( pEx
77b0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
77c0: 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
77d0: 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
77e0: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
77f0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
7800: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
7810: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
7820: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
7830: 69 74 65 45 78 70 72 49 66 54 72 75 65 28 70 50  iteExprIfTrue(pP
7840: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
7850: 67 68 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ght, dest);.    
7860: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
7870: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
7880: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7890: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
78a0: 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OR: {.      sqli
78b0: 74 65 45 78 70 72 49 66 54 72 75 65 28 70 50 61  teExprIfTrue(pPa
78c0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
78d0: 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
78e0: 73 71 6c 69 74 65 45 78 70 72 49 66 54 72 75 65  sqliteExprIfTrue
78f0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
7900: 70 52 69 67 68 74 2c 20 64 65 73 74 29 3b 0a 20  pRight, dest);. 
7910: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7920: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
7930: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
7940: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
7950: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
7960: 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
7970: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7980: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
7990: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
79a0: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
79b0: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
79c0: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
79d0: 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20   case TK_EQ:.   
79e0: 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20   case TK_LIKE:. 
79f0: 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a     case TK_GLOB:
7a00: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
7a10: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
7a20: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
7a30: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
7a40: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
7a50: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
7a60: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7a70: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74  p(v, op, 0, dest
7a80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7a90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
7aa0: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
7ab0: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
7ac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
7ad0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
7ae0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
7af0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7b00: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73  Op(v, op, 0, des
7b10: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
7b20: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7b30: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73  TK_IN: {.      s
7b40: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
7b50: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
7b60: 66 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ft);.      if( p
7b70: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
7b80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
7b90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
7ba0: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
7bb0: 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ble, dest);.    
7bc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7bd0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7be0: 28 76 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64 2c  (v, OP_SetFound,
7bf0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
7c00: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dest);.      }. 
7c10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7c20: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
7c30: 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TWEEN: {.      i
7c40: 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 56  nt lbl = sqliteV
7c50: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
7c60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
7c70: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
7c80: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
7c90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7ca0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
7cb0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
7cc0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
7cd0: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
7ce0: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
7cf0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7d00: 4f 70 28 76 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20  Op(v, OP_Lt, 0, 
7d10: 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lbl);.      sqli
7d20: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
7d30: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
7d40: 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
7d50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7d60: 64 4f 70 28 76 2c 20 4f 50 5f 4c 65 2c 20 30 2c  dOp(v, OP_Le, 0,
7d70: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
7d80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7d90: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
7da0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
7db0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
7dc0: 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20  (v, lbl);.      
7dd0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7de0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
7df0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7e00: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
7e10: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7e20: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
7e30: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
7e40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7e50: 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 64 65 73 74  , OP_If, 0, dest
7e60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7e70: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7e80: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
7e90: 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
7ea0: 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
7eb0: 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
7ec0: 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
7ed0: 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
7ee0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
7ef0: 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
7f00: 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
7f10: 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
7f20: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7f30: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 76 6f 69 64  is true..*/.void
7f40: 20 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c   sqliteExprIfFal
7f50: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
7f60: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
7f70: 6e 74 20 64 65 73 74 29 7b 0a 20 20 56 64 62 65  nt dest){.  Vdbe
7f80: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
7f90: 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
7fa0: 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  0;.  if( v==0 ||
7fb0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
7fc0: 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  rn;.  switch( pE
7fd0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
7fe0: 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20  ase TK_LT:      
7ff0: 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20   op = OP_Ge;    
8000: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8010: 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20  se TK_LE:       
8020: 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20  op = OP_Gt;     
8030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8040: 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f  e TK_GT:       o
8050: 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20  p = OP_Le;      
8060: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8070: 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f 70   TK_GE:       op
8080: 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20   = OP_Lt;       
8090: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
80a0: 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_NE:       op 
80b0: 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62  = OP_Eq;       b
80c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
80d0: 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_EQ:       op =
80e0: 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20 62 72   OP_Ne;       br
80f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8100: 5f 4c 49 4b 45 3a 20 20 20 20 20 6f 70 20 3d 20  _LIKE:     op = 
8110: 4f 50 5f 4c 69 6b 65 3b 20 20 20 20 20 62 72 65  OP_Like;     bre
8120: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8130: 47 4c 4f 42 3a 20 20 20 20 20 6f 70 20 3d 20 4f  GLOB:     op = O
8140: 50 5f 47 6c 6f 62 3b 20 20 20 20 20 62 72 65 61  P_Glob;     brea
8150: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
8160: 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f 50  SNULL:   op = OP
8170: 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61 6b  _NotNull;  break
8180: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
8190: 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f  TNULL:  op = OP_
81a0: 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b  IsNull;   break;
81b0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 62  .    default:  b
81c0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74  reak;.  }.  swit
81d0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
81e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
81f0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
8200: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
8210: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
8220: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
8230: 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65  qliteExprIfFalse
8240: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8250: 70 52 69 67 68 74 2c 20 64 65 73 74 29 3b 0a 20  pRight, dest);. 
8260: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8270: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
8280: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
8290: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
82a0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
82b0: 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72 75   sqliteExprIfTru
82c0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
82d0: 3e 70 4c 65 66 74 2c 20 64 32 29 3b 0a 20 20 20  >pLeft, d2);.   
82e0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 46     sqliteExprIfF
82f0: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
8300: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
8310: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8320: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
8330: 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
8340: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8350: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
8360: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
8370: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
8380: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 29  pr->pLeft, dest)
8390: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
83a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
83b0: 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
83c0: 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
83d0: 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
83e0: 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
83f0: 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
8400: 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _EQ: {.      sql
8410: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
8420: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
8430: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
8440: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
8450: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
8460: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8470: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
8480: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
8490: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
84a0: 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20  se TK_LIKE:.    
84b0: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a  case TK_GLOB: {.
84c0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
84d0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
84e0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
84f0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
8500: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8510: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
8520: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8530: 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a  , op, 1, dest);.
8540: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8550: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
8560: 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
8570: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
8580: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
8590: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
85a0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
85b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
85c0: 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74 29 3b  v, op, 0, dest);
85d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
85e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
85f0: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  IN: {.      sqli
8600: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
8610: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
8620: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
8630: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
8640: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8650: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46  AddOp(v, OP_NotF
8660: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
8670: 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ble, dest);.    
8680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8690: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
86a0: 28 76 2c 20 4f 50 5f 53 65 74 4e 6f 74 46 6f 75  (v, OP_SetNotFou
86b0: 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
86c0: 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  e, dest);.      
86d0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
86e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
86f0: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
8700: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
8710: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
8720: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8730: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
8740: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8750: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
8760: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
8770: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
8780: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
8790: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61 64  pExpr);.      ad
87a0: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  dr = sqliteVdbeC
87b0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
87c0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
87d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30  ddOp(v, OP_Ge, 0
87e0: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
87f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8800: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
8810: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8820: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
8830: 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20  oto, 0, dest);. 
8840: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
8850: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
8860: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
8870: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
8880: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8890: 4f 50 5f 47 74 2c 20 30 2c 20 64 65 73 74 29 3b  OP_Gt, 0, dest);
88a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
88b0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
88c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
88d0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
88e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
88f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8900: 20 4f 50 5f 4e 6f 74 2c 20 30 2c 20 30 29 3b 0a   OP_Not, 0, 0);.
8910: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8920: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
8930: 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
8940: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
8950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64  .}../*.** Do a d
8960: 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  eep comparison o
8970: 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  f two expression
8980: 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20   trees.  Return 
8990: 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a  TRUE (non-zero).
89a0: 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69  ** if they are i
89b0: 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74  dentical and ret
89c0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
89d0: 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20  y differ in any 
89e0: 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  way..*/.int sqli
89f0: 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  teExprCompare(Ex
8a00: 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
8a10: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
8a20: 28 20 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( pA==0 ){.    r
8a30: 65 74 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d  eturn pB==0;.  }
8a40: 65 6c 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29  else if( pB==0 )
8a50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8a60: 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
8a70: 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72  !=pB->op ) retur
8a80: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
8a90: 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  teExprCompare(pA
8aa0: 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65  ->pLeft, pB->pLe
8ab0: 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ft) ) return 0;.
8ac0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 45 78 70    if( !sqliteExp
8ad0: 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
8ae0: 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29  ght, pB->pRight)
8af0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
8b00: 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a  f( pA->pList ){.
8b10: 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73      if( pB->pLis
8b20: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
8b30: 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  .    if( pA->pLi
8b40: 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70  st->nExpr!=pB->p
8b50: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65  List->nExpr ) re
8b60: 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28  turn 0;.    for(
8b70: 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74  i=0; i<pA->pList
8b80: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
8b90: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
8ba0: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
8bb0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
8bc0: 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b  r, pB->pList->a[
8bd0: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
8be0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
8bf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8c00: 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69  else if( pB->pLi
8c10: 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  st ){.    return
8c20: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   0;.  }.  if( pA
8c30: 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d  ->pSelect || pB-
8c40: 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  >pSelect ) retur
8c50: 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74  n 0;.  if( pA->t
8c60: 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66  oken.z ){.    if
8c70: 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ( pB->token.z==0
8c80: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
8c90: 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e   if( pB->token.n
8ca0: 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20  !=pA->token.n ) 
8cb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
8cc0: 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  ( sqliteStrNICmp
8cd0: 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42  (pA->token.z, pB
8ce0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 41 2d 3e 74  ->token.z, pA->t
8cf0: 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74  oken.n)!=0 ) ret
8d00: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
8d10: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
8d20: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
8d30: 74 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  t to the pParse-
8d40: 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 6e  >aAgg[] array an
8d50: 64 20 72 65 74 75 72 6e 20 69 74 73 20 69 6e 64  d return its ind
8d60: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ex..*/.static in
8d70: 74 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28  t appendAggInfo(
8d80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
8d90: 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 6e    if( (pParse->n
8da0: 41 67 67 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Agg & 0x7)==0 ){
8db0: 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 70  .    int amt = p
8dc0: 50 61 72 73 65 2d 3e 6e 41 67 67 20 2b 20 38 3b  Parse->nAgg + 8;
8dd0: 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 61 41  .    AggExpr *aA
8de0: 67 67 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  gg = sqliteReall
8df0: 6f 63 28 70 50 61 72 73 65 2d 3e 61 41 67 67 2c  oc(pParse->aAgg,
8e00: 20 61 6d 74 2a 73 69 7a 65 6f 66 28 70 50 61 72   amt*sizeof(pPar
8e10: 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20  se->aAgg[0]));. 
8e20: 20 20 20 69 66 28 20 61 41 67 67 3d 3d 30 20 29     if( aAgg==0 )
8e30: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
8e40: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
8e50: 72 73 65 2d 3e 61 41 67 67 20 3d 20 61 41 67 67  rse->aAgg = aAgg
8e60: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
8e70: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 70 50 61  pParse->aAgg[pPa
8e80: 72 73 65 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20 73  rse->nAgg], 0, s
8e90: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41  izeof(pParse->aA
8ea0: 67 67 5b 30 5d 29 29 3b 0a 20 20 72 65 74 75 72  gg[0]));.  retur
8eb0: 6e 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 2b 2b  n pParse->nAgg++
8ec0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
8ed0: 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  ze the given exp
8ee0: 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
8ef0: 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
8f00: 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
8f10: 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
8f20: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
8f30: 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  ed to the pParse
8f40: 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a  ->aAgg[] array..
8f50: 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e  ** Make addition
8f60: 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  al entries to th
8f70: 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
8f80: 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73   array as necess
8f90: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
8fa0: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
8fb0: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
8fc0: 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
8fd0: 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
8fe0: 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
8ff0: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
9000: 29 20 61 6e 64 20 73 71 6c 69 74 65 45 78 70 72  ) and sqliteExpr
9010: 43 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Check()..**.** I
9020: 66 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65  f errors are see
9030: 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  n, leave an erro
9040: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72  r message in zEr
9050: 72 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a  rMsg and return.
9060: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
9070: 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
9080: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
9090: 65 41 67 67 72 65 67 61 74 65 73 28 50 61 72 73  eAggregates(Pars
90a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
90b0: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
90c0: 3b 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67  ;.  AggExpr *aAg
90d0: 67 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  g;.  int nErr = 
90e0: 30 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  0;..  if( pExpr=
90f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
9100: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
9110: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
9120: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
9130: 20 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d    aAgg = pParse-
9140: 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72  >aAgg;.      for
9150: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
9160: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
9170: 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e      if( aAgg[i].
9180: 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
9190: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 41  ;.        if( aA
91a0: 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 54 61  gg[i].pExpr->iTa
91b0: 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
91c0: 6c 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 61  le.         && a
91d0: 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43  Agg[i].pExpr->iC
91e0: 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
91f0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
9200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9210: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9220: 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d    if( i>=pParse-
9230: 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  >nAgg ){.       
9240: 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e   i = appendAggIn
9250: 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  fo(pParse);.    
9260: 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65      if( i<0 ) re
9270: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
9280: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
9290: 69 73 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  isAgg = 0;.     
92a0: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
92b0: 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  i].pExpr = pExpr
92c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
92d0: 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b  pExpr->iAgg = i;
92e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
92f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9300: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
9310: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
9320: 3e 69 43 6f 6c 75 6d 6e 3d 3d 46 4e 5f 43 6f 75  >iColumn==FN_Cou
9330: 6e 74 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f  nt || pExpr->iCo
9340: 6c 75 6d 6e 3d 3d 46 4e 5f 41 76 67 20 29 7b 0a  lumn==FN_Avg ){.
9350: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
9360: 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74 3e 3d 30  se->iAggCount>=0
9370: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20   ){.          i 
9380: 3d 20 70 50 61 72 73 65 2d 3e 69 41 67 67 43 6f  = pParse->iAggCo
9390: 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  unt;.        }el
93a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20  se{.          i 
93b0: 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28  = appendAggInfo(
93c0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
93d0: 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74     if( i<0 ) ret
93e0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20  urn 1;.         
93f0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
9400: 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  .isAgg = 1;.    
9410: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
9420: 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 30 3b  gg[i].pExpr = 0;
9430: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
9440: 65 2d 3e 69 41 67 67 43 6f 75 6e 74 20 3d 20 69  e->iAggCount = i
9450: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9460: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
9470: 43 6f 6c 75 6d 6e 3d 3d 46 4e 5f 43 6f 75 6e 74  Column==FN_Count
9480: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
9490: 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20  xpr->iAgg = i;. 
94a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
94b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
94c0: 7d 0a 20 20 20 20 20 20 61 41 67 67 20 3d 20 70  }.      aAgg = p
94d0: 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20  Parse->aAgg;.   
94e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
94f0: 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
9500: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  {.        if( !a
9510: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
9520: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9530: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
9540: 6f 6d 70 61 72 65 28 61 41 67 67 5b 69 5d 2e 70  ompare(aAgg[i].p
9550: 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a  Expr, pExpr) ){.
9560: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9570: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9580: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d   }.      if( i>=
9590: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a  pParse->nAgg ){.
95a0: 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65          i = appe
95b0: 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65  ndAggInfo(pParse
95c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
95d0: 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
95e0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
95f0: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31  Agg[i].isAgg = 1
9600: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
9610: 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20  ->aAgg[i].pExpr 
9620: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  = pExpr;.      }
9630: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41  .      pExpr->iA
9640: 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 62 72  gg = i;.      br
9650: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
9660: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
9670: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
9680: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72   ){.        nErr
9690: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61   = sqliteExprAna
96a0: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
96b0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
96c0: 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eft);.      }.  
96d0: 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20      if( nErr==0 
96e0: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
96f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72   ){.        nErr
9700: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61   = sqliteExprAna
9710: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
9720: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
9730: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ight);.      }. 
9740: 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30       if( nErr==0
9750: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   && pExpr->pList
9760: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
9770: 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  n = pExpr->pList
9780: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
9790: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
97a0: 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30  for(i=0; nErr==0
97b0: 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20   && i<n; i++){. 
97c0: 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20           nErr = 
97d0: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
97e0: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
97f0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
9800: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
9810: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9820: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9830: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9840: 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nErr;.}../*.** 
9850: 4c 6f 63 61 74 65 20 61 20 75 73 65 72 20 66 75  Locate a user fu
9860: 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20 61 20 6e  nction given a n
9870: 61 6d 65 20 61 6e 64 20 61 20 6e 75 6d 62 65 72  ame and a number
9880: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a   of arguments..*
9890: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
98a0: 65 72 20 74 6f 20 74 68 65 20 55 73 65 72 46 75  er to the UserFu
98b0: 6e 63 20 73 74 72 75 63 74 75 72 65 20 74 68 61  nc structure tha
98c0: 74 20 64 65 66 69 6e 65 73 20 74 68 61 74 0a 2a  t defines that.*
98d0: 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 72  * function, or r
98e0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
98f0: 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
9900: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  not exist..**.**
9910: 20 49 66 20 74 68 65 20 63 72 65 61 74 65 46 6c   If the createFl
9920: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  ag argument is t
9930: 72 75 65 2c 20 74 68 65 6e 20 61 20 6e 65 77 20  rue, then a new 
9940: 28 62 6c 61 6e 6b 29 20 55 73 65 72 46 75 6e 63  (blank) UserFunc
9950: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73  .** structure is
9960: 20 63 72 65 61 74 65 64 20 61 6e 64 20 6c 69 6b   created and lik
9970: 65 64 20 69 6e 74 6f 20 74 68 65 20 22 64 62 22  ed into the "db"
9980: 20 73 74 72 75 63 74 75 72 65 20 69 66 20 61 0a   structure if a.
9990: 2a 2a 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 66  ** no matching f
99a0: 75 6e 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73  unction previous
99b0: 6c 79 20 65 78 69 73 74 65 64 2e 20 20 57 68 65  ly existed.  Whe
99c0: 6e 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20  n createFlag is 
99d0: 74 72 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  true.** and the 
99e0: 6e 41 72 67 20 70 61 72 61 6d 65 74 65 72 20 69  nArg parameter i
99f0: 73 20 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  s -1, then only 
9a00: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
9a10: 61 63 63 65 70 74 73 0a 2a 2a 20 61 6e 79 20 6e  accepts.** any n
9a20: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
9a30: 74 73 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ts will be retur
9a40: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72  ned..**.** If cr
9a50: 65 61 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73  eateFlag is fals
9a60: 65 20 61 6e 64 20 6e 41 72 67 20 69 73 20 2d 31  e and nArg is -1
9a70: 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
9a80: 20 76 61 6c 69 64 0a 2a 2a 20 66 75 6e 63 74 69   valid.** functi
9a90: 6f 6e 20 66 6f 75 6e 64 20 69 73 20 72 65 74 75  on found is retu
9aa0: 72 6e 65 64 2e 20 20 41 20 66 75 6e 63 74 69 6f  rned.  A functio
9ab0: 6e 20 69 73 20 76 61 6c 69 64 20 69 66 20 65 69  n is valid if ei
9ac0: 74 68 65 72 20 78 46 75 6e 63 0a 2a 2a 20 6f 72  ther xFunc.** or
9ad0: 20 78 53 74 65 70 20 69 73 20 6e 6f 6e 2d 7a 65   xStep is non-ze
9ae0: 72 6f 2e 0a 2a 2f 0a 55 73 65 72 46 75 6e 63 20  ro..*/.UserFunc 
9af0: 2a 73 71 6c 69 74 65 46 69 6e 64 55 73 65 72 46  *sqliteFindUserF
9b00: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
9b10: 65 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a  e *db,        /*
9b20: 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   An open databas
9b30: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
9b40: 72 20 2a 7a 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d  r *zName, /* Nam
9b50: 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e of the functio
9b60: 6e 2e 20 20 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72  n.  Not null-ter
9b70: 6d 69 6e 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  minated */.  int
9b80: 20 6e 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20   nName,         
9b90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
9ba0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e  racters in the n
9bb0: 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ame */.  int nAr
9bc0: 67 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  g,          /* N
9bd0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
9be0: 74 73 2e 20 20 2d 31 20 6d 65 61 6e 73 20 61 6e  ts.  -1 means an
9bf0: 79 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  y number */.  in
9c00: 74 20 63 72 65 61 74 65 46 6c 61 67 20 20 20 20  t createFlag    
9c10: 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 65   /* Create new e
9c20: 6e 74 72 79 20 69 66 20 74 72 75 65 20 61 6e 64  ntry if true and
9c30: 20 64 6f 65 73 20 6e 6f 74 20 6f 74 68 65 72 77   does not otherw
9c40: 69 73 65 20 65 78 69 73 74 20 2a 2f 0a 29 7b 0a  ise exist */.){.
9c50: 20 20 55 73 65 72 46 75 6e 63 20 2a 70 46 69 72    UserFunc *pFir
9c60: 73 74 2c 20 2a 70 2c 20 2a 70 4d 61 79 62 65 3b  st, *p, *pMaybe;
9c70: 0a 20 20 70 46 69 72 73 74 20 3d 20 70 20 3d 20  .  pFirst = p = 
9c80: 28 55 73 65 72 46 75 6e 63 2a 29 73 71 6c 69 74  (UserFunc*)sqlit
9c90: 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 75  eHashFind(&db->u
9ca0: 73 65 72 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20  serFunc, zName, 
9cb0: 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 63  nName);.  if( !c
9cc0: 72 65 61 74 65 46 6c 61 67 20 26 26 20 6e 41 72  reateFlag && nAr
9cd0: 67 3c 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  g<0 ){.    while
9ce0: 28 20 70 20 26 26 20 70 2d 3e 78 46 75 6e 63 3d  ( p && p->xFunc=
9cf0: 3d 30 20 26 26 20 70 2d 3e 78 53 74 65 70 3d 3d  =0 && p->xStep==
9d00: 30 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  0 ){ p = p->pNex
9d10: 74 3b 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20  t; }.    return 
9d20: 70 3b 0a 20 20 7d 0a 20 20 70 4d 61 79 62 65 20  p;.  }.  pMaybe 
9d30: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  = 0;.  while( p 
9d40: 26 26 20 70 2d 3e 6e 41 72 67 21 3d 6e 41 72 67  && p->nArg!=nArg
9d50: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
9d60: 41 72 67 3c 30 20 26 26 20 21 63 72 65 61 74 65  Arg<0 && !create
9d70: 46 6c 61 67 20 26 26 20 28 70 2d 3e 78 46 75 6e  Flag && (p->xFun
9d80: 63 20 7c 7c 20 70 2d 3e 78 53 74 65 70 29 20 29  c || p->xStep) )
9d90: 20 70 4d 61 79 62 65 20 3d 20 70 3b 0a 20 20 20   pMaybe = p;.   
9da0: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
9db0: 20 7d 0a 20 20 69 66 28 20 70 20 26 26 20 21 63   }.  if( p && !c
9dc0: 72 65 61 74 65 46 6c 61 67 20 26 26 20 70 2d 3e  reateFlag && p->
9dd0: 78 46 75 6e 63 3d 3d 30 20 26 26 20 70 2d 3e 78  xFunc==0 && p->x
9de0: 53 74 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Step==0 ){.    r
9df0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
9e00: 66 28 20 70 3d 3d 30 20 26 26 20 70 4d 61 79 62  f( p==0 && pMayb
9e10: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
9e20: 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 29   createFlag==0 )
9e30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4d 61  ;.    return pMa
9e40: 79 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ybe;.  }.  if( p
9e50: 3d 3d 30 20 26 26 20 63 72 65 61 74 65 46 6c 61  ==0 && createFla
9e60: 67 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  g ){.    p = sql
9e70: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
9e80: 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 70 2d 3e  f(*p) );.    p->
9e90: 6e 41 72 67 20 3d 20 6e 41 72 67 3b 0a 20 20 20  nArg = nArg;.   
9ea0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 46 69 72   p->pNext = pFir
9eb0: 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61  st;.    sqliteHa
9ec0: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 75 73  shInsert(&db->us
9ed0: 65 72 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  erFunc, zName, n
9ee0: 4e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 70 29 3b  Name, (void*)p);
9ef0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
9f00: 0a 7d 0a                                         .}.