/ Hex Artifact Content
Login

Artifact 0752b45ac5913575c9dfb47ef2d5ac4705df7f3b:


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 35 36 20 32 30 30 32 2f 30 33 2f 31 33 20 31  .56 2002/03/13 1
0220: 38 3a 35 34 3a 30 37 20 64 72 68 20 45 78 70 20  8:54:07 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 70  turn;.  if( p->p
0870: 4c 65 66 74 20 29 20 73 71 6c 69 74 65 45 78 70  Left ) sqliteExp
0880: 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74  rDelete(p->pLeft
0890: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67  );.  if( p->pRig
08a0: 68 74 20 29 20 73 71 6c 69 74 65 45 78 70 72 44  ht ) sqliteExprD
08b0: 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29  elete(p->pRight)
08c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74  ;.  if( p->pList
08d0: 20 29 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   ) sqliteExprLis
08e0: 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74  tDelete(p->pList
08f0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  );.  if( p->pSel
0900: 65 63 74 20 29 20 73 71 6c 69 74 65 53 65 6c 65  ect ) sqliteSele
0910: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c  ctDelete(p->pSel
0920: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ect);.  sqliteFr
0930: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
0940: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
0950: 6f 75 70 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73  oup of functions
0960: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
0970: 6e 73 6c 61 74 65 20 74 68 65 20 73 74 72 69 6e  nslate the strin
0980: 67 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 6f 66  g.** pointers of
0990: 20 74 6f 6b 65 6e 73 20 69 6e 20 65 78 70 72 65   tokens in expre
09a0: 73 73 69 6f 6e 20 66 72 6f 6d 20 6f 6e 65 20 62  ssion from one b
09b0: 75 66 66 65 72 20 74 6f 20 61 6e 6f 74 68 65 72  uffer to another
09c0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
09d0: 2c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  , the Expr.token
09e0: 2e 7a 20 61 6e 64 20 45 78 70 72 2e 73 70 61 6e  .z and Expr.span
09f0: 2e 7a 20 66 69 65 6c 64 73 20 70 6f 69 6e 74 20  .z fields point 
0a00: 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 6f 72 69 67  into the.** orig
0a10: 69 6e 61 6c 20 69 6e 70 75 74 20 62 75 66 66 65  inal input buffe
0a20: 72 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74  r of an SQL stat
0a30: 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20  ement.  This is 
0a40: 75 73 75 61 6c 6c 79 20 4f 4b 0a 2a 2a 20 73 69  usually OK.** si
0a50: 6e 63 65 20 74 68 65 20 53 51 4c 20 73 74 61 74  nce the SQL stat
0a60: 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75 74 65  ement is execute
0a70: 64 20 61 6e 64 20 74 68 65 20 65 78 70 72 65 73  d and the expres
0a80: 73 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 0a  sion is deleted.
0a90: 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 69 6e  ** before the in
0aa0: 70 75 74 20 62 75 66 66 65 72 20 69 73 20 66 72  put buffer is fr
0ab0: 65 65 64 2e 20 20 4d 61 6b 69 6e 67 20 74 68 65  eed.  Making the
0ac0: 20 74 6f 6b 65 6e 73 20 70 6f 69 6e 74 20 74 6f   tokens point to
0ad0: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
0ae0: 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 73 61   input buffer sa
0af0: 76 65 73 20 6d 61 6e 79 20 63 61 6c 6c 73 20 74  ves many calls t
0b00: 6f 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 74  o malloc() and t
0b10: 68 75 73 20 68 65 6c 70 73 0a 2a 2a 20 74 68 65  hus helps.** the
0b20: 20 6c 69 62 72 61 72 79 20 74 6f 20 72 75 6e 20   library to run 
0b30: 66 61 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 42  faster. .**.** B
0b40: 75 74 20 73 6f 6d 65 74 69 6d 65 73 20 77 65 20  ut sometimes we 
0b50: 6e 65 65 64 20 61 6e 20 65 78 70 72 65 73 73 69  need an expressi
0b60: 6f 6e 20 74 6f 20 70 65 72 73 69 73 74 20 70 61  on to persist pa
0b70: 73 74 20 74 68 65 20 74 69 6d 65 20 77 68 65 6e  st the time when
0b80: 0a 2a 2a 20 74 68 65 20 69 6e 70 75 74 20 62 75  .** the input bu
0b90: 66 66 65 72 20 69 73 20 66 72 65 65 64 2e 20 20  ffer is freed.  
0ba0: 28 45 78 61 6d 70 6c 65 3a 20 54 68 65 20 53 45  (Example: The SE
0bb0: 4c 45 43 54 20 63 6c 61 75 73 65 20 6f 66 20 61  LECT clause of a
0bc0: 0a 2a 2a 20 43 52 45 41 54 45 20 56 49 45 57 20  .** CREATE VIEW 
0bd0: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69  statement contai
0be0: 6e 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ns expressions t
0bf0: 68 61 74 20 6d 75 73 74 20 70 65 72 73 69 73 74  hat must persist
0c00: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 69 66 65   for.** the life
0c10: 20 6f 66 20 74 68 65 20 76 69 65 77 2e 29 20 20   of the view.)  
0c20: 57 68 65 6e 20 74 68 61 74 20 68 61 70 70 65 6e  When that happen
0c30: 73 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  s we have to mak
0c40: 65 20 61 0a 2a 2a 20 70 65 72 73 69 73 74 65 6e  e a.** persisten
0c50: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 6e  t copy of the in
0c60: 70 75 74 20 62 75 66 66 65 72 20 61 6e 64 20 74  put buffer and t
0c70: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 45 78 70  ranslate the Exp
0c80: 72 2e 74 6f 6b 65 6e 2e 7a 0a 2a 2a 20 61 6e 64  r.token.z.** and
0c90: 20 45 78 70 72 2e 73 70 61 6e 2e 7a 20 66 69 65   Expr.span.z fie
0ca0: 6c 64 73 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  lds to point to 
0cb0: 74 68 65 20 63 6f 70 79 20 72 61 74 68 65 72 20  the copy rather 
0cc0: 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6f 72 69  than the .** ori
0cd0: 67 69 6e 61 6c 20 69 6e 70 75 74 20 62 75 66 66  ginal input buff
0ce0: 65 72 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  er.  The followi
0cf0: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
0d00: 69 6e 65 73 20 68 61 6e 64 6c 65 20 74 68 61 74  ines handle that
0d10: 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e  .** translation.
0d20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6f 66 66 73  .**.** The "offs
0d30: 65 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  et" parameter is
0d40: 20 74 68 65 20 64 69 73 74 61 6e 63 65 20 66 72   the distance fr
0d50: 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  om the original 
0d60: 69 6e 70 75 74 20 62 75 66 66 65 72 0a 2a 2a 20  input buffer.** 
0d70: 74 6f 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  to the persisten
0d80: 74 20 63 6f 70 79 2e 20 20 54 68 65 73 65 20 72  t copy.  These r
0d90: 6f 75 74 69 6e 65 73 20 72 65 63 75 72 73 69 76  outines recursiv
0da0: 65 6c 79 20 77 61 6c 6b 20 74 68 65 20 65 6e 74  ely walk the ent
0db0: 69 72 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ire.** expressio
0dc0: 6e 20 74 72 65 65 20 61 6e 64 20 73 68 69 66 74  n tree and shift
0dd0: 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 62 79 20 22   all tokens by "
0de0: 6f 66 66 73 65 74 22 20 61 6d 6f 75 6e 74 2e 0a  offset" amount..
0df0: 2a 2a 0a 2a 2a 20 54 68 65 20 77 6f 72 6b 20 6f  **.** The work o
0e00: 66 20 66 69 67 75 72 69 6e 67 20 6f 75 74 20 74  f figuring out t
0e10: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 22  he appropriate "
0e20: 6f 66 66 73 65 74 22 20 61 6e 64 20 6d 61 6b 69  offset" and maki
0e30: 6e 67 20 74 68 65 0a 2a 2a 20 70 72 65 73 69 73  ng the.** presis
0e40: 74 65 6e 74 20 63 6f 70 79 20 6f 66 20 74 68 65  tent copy of the
0e50: 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73   input buffer is
0e60: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
0e70: 6c 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  ling routine..*/
0e80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
0e90: 4d 6f 76 65 53 74 72 69 6e 67 73 28 45 78 70 72  MoveStrings(Expr
0ea0: 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29   *p, int offset)
0eb0: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
0ec0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
0ed0: 74 6f 6b 65 6e 2e 7a 20 29 20 70 2d 3e 74 6f 6b  token.z ) p->tok
0ee0: 65 6e 2e 7a 20 2b 3d 20 6f 66 66 73 65 74 3b 0a  en.z += offset;.
0ef0: 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20    if( p->span.z 
0f00: 29 20 70 2d 3e 73 70 61 6e 2e 7a 20 2b 3d 20 6f  ) p->span.z += o
0f10: 66 66 73 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  ffset;.  if( p->
0f20: 70 4c 65 66 74 20 29 20 73 71 6c 69 74 65 45 78  pLeft ) sqliteEx
0f30: 70 72 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 2d  prMoveStrings(p-
0f40: 3e 70 4c 65 66 74 2c 20 6f 66 66 73 65 74 29 3b  >pLeft, offset);
0f50: 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74  .  if( p->pRight
0f60: 20 29 20 73 71 6c 69 74 65 45 78 70 72 4d 6f 76   ) sqliteExprMov
0f70: 65 53 74 72 69 6e 67 73 28 70 2d 3e 70 52 69 67  eStrings(p->pRig
0f80: 68 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  ht, offset);.  i
0f90: 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 20 73 71  f( p->pList ) sq
0fa0: 6c 69 74 65 45 78 70 72 4c 69 73 74 4d 6f 76 65  liteExprListMove
0fb0: 53 74 72 69 6e 67 73 28 70 2d 3e 70 4c 69 73 74  Strings(p->pList
0fc0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
0fd0: 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 20 73 71   p->pSelect ) sq
0fe0: 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76 65 53 74  liteSelectMoveSt
0ff0: 72 69 6e 67 73 28 70 2d 3e 70 53 65 6c 65 63 74  rings(p->pSelect
1000: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 76 6f 69  , offset);.}.voi
1010: 64 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  d sqliteExprList
1020: 4d 6f 76 65 53 74 72 69 6e 67 73 28 45 78 70 72  MoveStrings(Expr
1030: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74  List *pList, int
1040: 20 6f 66 66 73 65 74 29 7b 0a 20 20 69 6e 74 20   offset){.  int 
1050: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1060: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1070: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1080: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1090: 20 73 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53   sqliteExprMoveS
10a0: 74 72 69 6e 67 73 28 70 4c 69 73 74 2d 3e 61 5b  trings(pList->a[
10b0: 69 5d 2e 70 45 78 70 72 2c 20 6f 66 66 73 65 74  i].pExpr, offset
10c0: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
10d0: 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76 65 53 74  liteSelectMoveSt
10e0: 72 69 6e 67 73 28 53 65 6c 65 63 74 20 2a 70 53  rings(Select *pS
10f0: 65 6c 65 63 74 2c 20 69 6e 74 20 6f 66 66 73 65  elect, int offse
1100: 74 29 7b 0a 20 20 69 66 28 20 70 53 65 6c 65 63  t){.  if( pSelec
1110: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1120: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 4d   sqliteExprListM
1130: 6f 76 65 53 74 72 69 6e 67 73 28 70 53 65 6c 65  oveStrings(pSele
1140: 63 74 2d 3e 70 45 4c 69 73 74 2c 20 6f 66 66 73  ct->pEList, offs
1150: 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  et);.  sqliteExp
1160: 72 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 53 65  rMoveStrings(pSe
1170: 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 6f 66  lect->pWhere, of
1180: 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 45  fset);.  sqliteE
1190: 78 70 72 4c 69 73 74 4d 6f 76 65 53 74 72 69 6e  xprListMoveStrin
11a0: 67 73 28 70 53 65 6c 65 63 74 2d 3e 70 47 72 6f  gs(pSelect->pGro
11b0: 75 70 42 79 2c 20 6f 66 66 73 65 74 29 3b 0a 20  upBy, offset);. 
11c0: 20 73 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53   sqliteExprMoveS
11d0: 74 72 69 6e 67 73 28 70 53 65 6c 65 63 74 2d 3e  trings(pSelect->
11e0: 70 48 61 76 69 6e 67 2c 20 6f 66 66 73 65 74 29  pHaving, offset)
11f0: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69  ;.  sqliteExprLi
1200: 73 74 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 53  stMoveStrings(pS
1210: 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 2c  elect->pOrderBy,
1220: 20 6f 66 66 73 65 74 29 3b 0a 20 20 73 71 6c 69   offset);.  sqli
1230: 74 65 53 65 6c 65 63 74 4d 6f 76 65 53 74 72 69  teSelectMoveStri
1240: 6e 67 73 28 70 53 65 6c 65 63 74 2d 3e 70 50 72  ngs(pSelect->pPr
1250: 69 6f 72 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  ior, offset);.}.
1260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1270: 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f  wing group of ro
1280: 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70  utines make deep
1290: 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65   copies of expre
12a0: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65  ssions,.** expre
12b0: 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20  ssion lists, ID 
12c0: 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63  lists, and selec
12d0: 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  t statements.  T
12e0: 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a  he copies can.**
12f0: 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20   be deleted (by 
1300: 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20  being passed to 
1310: 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65  their respective
1320: 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75   ...Delete() rou
1330: 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75  tines).** withou
1340: 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20  t effecting the 
1350: 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a  originals..**.**
1360: 20 4e 6f 74 65 2c 20 68 6f 77 65 76 65 72 2c 20   Note, however, 
1370: 74 68 61 74 20 74 68 65 20 45 78 70 72 2e 74 6f  that the Expr.to
1380: 6b 65 6e 2e 7a 20 61 6e 64 20 45 78 70 72 2e 73  ken.z and Expr.s
1390: 70 61 6e 2e 7a 20 66 69 65 6c 64 73 20 70 6f 69  pan.z fields poi
13a0: 6e 74 20 74 6f 0a 2a 2a 20 73 74 72 69 6e 67 20  nt to.** string 
13b0: 73 70 61 63 65 20 74 68 61 74 20 69 73 20 61 6c  space that is al
13c0: 6c 6f 63 61 74 65 64 20 73 65 70 61 72 61 74 65  located separate
13d0: 6c 79 20 66 72 6f 6d 20 74 68 65 20 65 78 70 72  ly from the expr
13e0: 65 73 73 69 6f 6e 20 74 72 65 65 0a 2a 2a 20 69  ession tree.** i
13f0: 74 73 65 6c 66 2e 20 20 54 68 65 73 65 20 72 6f  tself.  These ro
1400: 75 74 69 6e 65 73 20 64 6f 20 4e 4f 54 20 64 75  utines do NOT du
1410: 70 6c 69 63 61 74 65 20 74 68 61 74 20 73 74 72  plicate that str
1420: 69 6e 67 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  ing space..**.**
1430: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1440: 6c 69 73 74 20 61 6e 64 20 49 44 20 6c 69 73 74  list and ID list
1450: 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74   return by sqlit
1460: 65 45 78 70 72 4c 69 73 74 44 75 70 28 29 20 61  eExprListDup() a
1470: 6e 64 20 0a 2a 2a 20 73 71 6c 69 74 65 49 64 4c  nd .** sqliteIdL
1480: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
1490: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
14a0: 6e 64 65 64 20 62 79 20 73 75 62 73 65 71 75 65  nded by subseque
14b0: 6e 74 20 63 61 6c 6c 73 0a 2a 2a 20 74 6f 20 73  nt calls.** to s
14c0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
14d0: 65 6e 64 28 29 20 6f 72 20 73 71 6c 69 74 65 49  end() or sqliteI
14e0: 64 4c 69 73 74 41 70 70 65 6e 64 28 29 2e 0a 2a  dListAppend()..*
14f0: 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20  *.** Any tables 
1500: 74 68 61 74 20 74 68 65 20 49 44 20 6c 69 73 74  that the ID list
1510: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1520: 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
1530: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
1540: 69 74 65 45 78 70 72 44 75 70 28 45 78 70 72 20  iteExprDup(Expr 
1550: 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  *p){.  Expr *pNe
1560: 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  w;.  if( p==0 ) 
1570: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
1580: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1590: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
15a0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
15b0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
15c0: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  >op = p->op;.  p
15d0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
15e0: 69 74 65 45 78 70 72 44 75 70 28 70 2d 3e 70 4c  iteExprDup(p->pL
15f0: 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  eft);.  pNew->pR
1600: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70  ight = sqliteExp
1610: 72 44 75 70 28 70 2d 3e 70 52 69 67 68 74 29 3b  rDup(p->pRight);
1620: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d  .  pNew->pList =
1630: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
1640: 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  up(p->pList);.  
1650: 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pNew->iTable = p
1660: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 70 4e 65 77  ->iTable;.  pNew
1670: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 69  ->iColumn = p->i
1680: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4e 65 77 2d 3e  Column;.  pNew->
1690: 69 41 67 67 20 3d 20 70 2d 3e 69 41 67 67 3b 0a  iAgg = p->iAgg;.
16a0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
16b0: 70 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 70 4e 65 77  p->token;.  pNew
16c0: 2d 3e 73 70 61 6e 20 3d 20 70 2d 3e 73 70 61 6e  ->span = p->span
16d0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63  ;.  pNew->pSelec
16e0: 74 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  t = sqliteSelect
16f0: 44 75 70 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b  Dup(p->pSelect);
1700: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
1710: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
1720: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 45 78  teExprListDup(Ex
1730: 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45 78  prList *p){.  Ex
1740: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
1750: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
1760: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1770: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
1780: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
1790: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
17a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17b0: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
17c0: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77  p->nExpr;.  pNew
17d0: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ->a = sqliteMall
17e0: 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a  oc( p->nExpr*siz
17f0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
1800: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
1810: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1820: 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 70 45 78 70   pNew->a[i].pExp
1830: 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  r = sqliteExprDu
1840: 70 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  p(p->a[i].pExpr)
1850: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d  ;.    pNew->a[i]
1860: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  .zName = sqliteS
1870: 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e  trDup(p->a[i].zN
1880: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ame);.    pNew->
1890: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[i].sortOrder =
18a0: 20 70 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64   p->a[i].sortOrd
18b0: 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  er;.    pNew->a[
18c0: 69 5d 2e 69 73 41 67 67 20 3d 20 70 2d 3e 61 5b  i].isAgg = p->a[
18d0: 69 5d 2e 69 73 41 67 67 3b 0a 20 20 20 20 70 4e  i].isAgg;.    pN
18e0: 65 77 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  ew->a[i].done = 
18f0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1900: 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a  pNew;.}.IdList *
1910: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 75 70 28  sqliteIdListDup(
1920: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
1930: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
1940: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
1950: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
1960: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
1970: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
1980: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
1990: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
19a0: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e  pNew->nId = p->n
19b0: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
19c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d  sqliteMalloc( p-
19d0: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
19e0: 5b 30 5d 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  [0]) );.  for(i=
19f0: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
1a00: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69  ){.    pNew->a[i
1a10: 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
1a20: 53 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a  StrDup(p->a[i].z
1a30: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Name);.    pNew-
1a40: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 20 3d 20 73  >a[i].zAlias = s
1a50: 71 6c 69 74 65 53 74 72 44 75 70 28 70 2d 3e 61  qliteStrDup(p->a
1a60: 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  [i].zAlias);.   
1a70: 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 69 64 78 20   pNew->a[i].idx 
1a80: 3d 20 70 2d 3e 61 5b 69 5d 2e 69 64 78 3b 0a 20  = p->a[i].idx;. 
1a90: 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 70 54     pNew->a[i].pT
1aa0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  ab = 0;.    pNew
1ab0: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[i].pSelect =
1ac0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70   sqliteSelectDup
1ad0: 28 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  (p->a[i].pSelect
1ae0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1af0: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
1b00: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28  sqliteSelectDup(
1b10: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65  Select *p){.  Se
1b20: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66  lect *pNew;.  if
1b30: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
1b40: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
1b50: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
1b60: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  (*p) );.  if( pN
1b70: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
1b80: 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74  ;.  pNew->isDist
1b90: 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
1ba0: 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45  inct;.  pNew->pE
1bb0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70  List = sqliteExp
1bc0: 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 45 4c 69  rListDup(p->pELi
1bd0: 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  st);.  pNew->pSr
1be0: 63 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74  c = sqliteIdList
1bf0: 44 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20  Dup(p->pSrc);.  
1c00: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73  pNew->pWhere = s
1c10: 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 2d 3e  qliteExprDup(p->
1c20: 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65 77 2d  pWhere);.  pNew-
1c30: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
1c40: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  teExprListDup(p-
1c50: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e  >pGroupBy);.  pN
1c60: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
1c70: 6c 69 74 65 45 78 70 72 44 75 70 28 70 2d 3e 70  liteExprDup(p->p
1c80: 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d  Having);.  pNew-
1c90: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
1ca0: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  teExprListDup(p-
1cb0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e  >pOrderBy);.  pN
1cc0: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
1cd0: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
1ce0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70   sqliteSelectDup
1cf0: 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70  (p->pPrior);.  p
1d00: 4e 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d  New->nLimit = p-
1d10: 3e 6e 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d  >nLimit;.  pNew-
1d20: 3e 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f  >nOffset = p->nO
1d30: 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 7a  ffset;.  pNew->z
1d40: 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 72 65  Select = 0;.  re
1d50: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f  turn pNew;.}.../
1d60: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
1d70: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
1d80: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
1d90: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
1da0: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
1db0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
1dc0: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
1dd0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45  ssion list..*/.E
1de0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 45  xprList *sqliteE
1df0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45 78  xprListAppend(Ex
1e00: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 45  prList *pList, E
1e10: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
1e20: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
1e30: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1e40: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
1e50: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1e60: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
1e70: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1e80: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
1e90: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
1ea0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
1eb0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
1ec0: 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e  .  if( (pList->n
1ed0: 45 78 70 72 20 26 20 37 29 3d 3d 30 20 29 7b 0a  Expr & 7)==0 ){.
1ee0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73      int n = pLis
1ef0: 74 2d 3e 6e 45 78 70 72 20 2b 20 38 3b 0a 20 20  t->nExpr + 8;.  
1f00: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1f10: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61  t_item *a;.    a
1f20: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
1f30: 28 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a  (pList->a, n*siz
1f40: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
1f50: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
1f60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
1f70: 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29  xprDelete(pExpr)
1f80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1f90: 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  List;.    }.    
1fa0: 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
1fb0: 7d 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c  }.  if( pExpr ||
1fc0: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 20   pName ){.    i 
1fd0: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  = pList->nExpr++
1fe0: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  ;.    pList->a[i
1ff0: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
2000: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  .    pList->a[i]
2010: 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
2020: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
2030: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
2040: 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d  ing(&pList->a[i]
2050: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a  .zName, pName->z
2060: 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a  , pName->n, 0);.
2070: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
2080: 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ote(pList->a[i].
2090: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
20a0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
20b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
20c0: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
20d0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
20e0: 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 4c  void sqliteExprL
20f0: 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69  istDelete(ExprLi
2100: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
2110: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
2120: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2130: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
2140: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
2150: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
2160: 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ete(pList->a[i].
2170: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
2180: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
2190: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
21a0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
21b0: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
21c0: 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
21d0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
21e0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
21f0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
2200: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
2210: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
2220: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
2230: 72 69 61 62 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  riables..*/.int 
2240: 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73  sqliteExprIsCons
2250: 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20  tant(Expr *p){. 
2260: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
2270: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  {.    case TK_ID
2280: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
2290: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
22a0: 4b 5f 44 4f 54 3a 0a 20 20 20 20 20 20 72 65 74  K_DOT:.      ret
22b0: 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20  urn 0;.    case 
22c0: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
22d0: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
22e0: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
22f0: 47 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  G:.      return 
2300: 31 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  1;.    default: 
2310: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
2320: 4c 65 66 74 20 26 26 20 21 73 71 6c 69 74 65 45  Left && !sqliteE
2330: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d  xprIsConstant(p-
2340: 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e  >pLeft) ) return
2350: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
2360: 3e 70 52 69 67 68 74 20 26 26 20 21 73 71 6c 69  >pRight && !sqli
2370: 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  teExprIsConstant
2380: 28 70 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65  (p->pRight) ) re
2390: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66  turn 0;.      if
23a0: 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  ( p->pList ){.  
23b0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
23c0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
23d0: 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  p->pList->nExpr;
23e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
23f0: 20 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72   if( !sqliteExpr
2400: 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c  IsConstant(p->pL
2410: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
2420: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
2430: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2440: 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 70       return p->p
2450: 4c 65 66 74 21 3d 30 20 7c 7c 20 70 2d 3e 70 52  Left!=0 || p->pR
2460: 69 67 68 74 21 3d 30 20 7c 7c 20 28 70 2d 3e 70  ight!=0 || (p->p
2470: 4c 69 73 74 20 26 26 20 70 2d 3e 70 4c 69 73 74  List && p->pList
2480: 2d 3e 6e 45 78 70 72 3e 30 29 3b 0a 20 20 20 20  ->nExpr>0);.    
2490: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
24a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24b0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
24c0: 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20  ven string is a 
24d0: 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61  row-id column na
24e0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
24f0: 74 20 73 71 6c 69 74 65 49 73 52 6f 77 69 64 28  t sqliteIsRowid(
2500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
2510: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
2520: 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
2530: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
2540: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
2550: 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29  ICmp(z, "ROWID")
2560: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
2570: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
2580: 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
2590: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
25a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
25b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
25c0: 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69  alks an expressi
25d0: 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f  on tree and reso
25e0: 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20  lves references 
25f0: 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75  to.** table colu
2600: 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74  mns.  Nodes of t
2610: 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72  he form ID.ID or
2620: 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f   ID resolve into
2630: 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20   an.** index to 
2640: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  the table in the
2650: 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20   table list and 
2660: 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e  a column offset.
2670: 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f    The .** Expr.o
2680: 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e  pcode for such n
2690: 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64 20  odes is changed 
26a0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54  to TK_COLUMN.  T
26b0: 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a  he Expr.iTable.*
26c0: 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  * value is chang
26d0: 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ed to the index 
26e0: 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
26f0: 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  d table in pTabL
2700: 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20  ist.** plus the 
2710: 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54  "base" value.  T
2720: 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77 69  he base value wi
2730: 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65  ll ultimately be
2740: 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45  come the.** VDBE
2750: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
2760: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
2770: 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
2780: 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  o the referenced
2790: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20  .** table.  The 
27a0: 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c  Expr.iColumn val
27b0: 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ue is changed to
27c0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
27d0: 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20  e column .** of 
27e0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
27f0: 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e  able.  The Expr.
2800: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f  iColumn value fo
2810: 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  r the special.**
2820: 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73   ROWID column is
2830: 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45   -1.  Any INTEGE
2840: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
2850: 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73  lumn is tried as
2860: 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72   an.** alias for
2870: 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 57 65   ROWID..**.** We
2880: 20 61 6c 73 6f 20 63 68 65 63 6b 20 66 6f 72 20   also check for 
2890: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
28a0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
28b0: 4e 20 63 6f 6d 65 73 20 69 6e 20 74 77 6f 0a 2a  N comes in two.*
28c0: 2a 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20  * forms:.**.**  
28d0: 20 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e           expr IN
28e0: 20 28 65 78 70 72 6c 69 73 74 29 0a 2a 2a 20 61   (exprlist).** a
28f0: 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
2900: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
2910: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ...).**.** The f
2920: 69 72 73 74 20 66 6f 72 6d 20 69 73 20 68 61 6e  irst form is han
2930: 64 6c 65 64 20 62 79 20 63 72 65 61 74 69 6e 67  dled by creating
2940: 20 61 20 73 65 74 20 68 6f 6c 64 69 6e 67 20 74   a set holding t
2950: 68 65 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c  he list.** of al
2960: 6c 6f 77 65 64 20 76 61 6c 75 65 73 2e 20 20 54  lowed values.  T
2970: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63  he second form c
2980: 61 75 73 65 73 20 74 68 65 20 53 45 4c 45 43 54  auses the SELECT
2990: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 0a 2a 2a   to generate .**
29a0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
29b0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
29c0: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6c 6f 6f 6b  outine also look
29d0: 73 20 66 6f 72 20 73 63 61 6c 61 72 20 53 45 4c  s for scalar SEL
29e0: 45 43 54 73 20 74 68 61 74 20 61 72 65 20 70 61  ECTs that are pa
29f0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
2a00: 69 6f 6e 2e 0a 2a 2a 20 49 66 20 69 74 20 66 69  ion..** If it fi
2a10: 6e 64 73 20 61 6e 79 2c 20 69 74 20 67 65 6e 65  nds any, it gene
2a20: 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 77 72  rates code to wr
2a30: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ite the value of
2a40: 20 74 68 61 74 20 73 65 6c 65 63 74 0a 2a 2a 20   that select.** 
2a50: 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65  into a memory ce
2a60: 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f 77  ll..**.** Unknow
2a70: 6e 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 74 61 62  n columns or tab
2a80: 6c 65 73 20 70 72 6f 76 6f 6b 65 20 61 6e 20 65  les provoke an e
2a90: 72 72 6f 72 2e 20 20 54 68 65 20 66 75 6e 63 74  rror.  The funct
2aa0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  ion returns.** t
2ab0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2ac0: 6f 72 73 20 73 65 65 6e 20 61 6e 64 20 6c 65 61  ors seen and lea
2ad0: 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ves an error mes
2ae0: 73 61 67 65 20 6f 6e 20 70 50 61 72 73 65 2d 3e  sage on pParse->
2af0: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
2b00: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
2b10: 65 49 64 73 28 0a 20 20 50 61 72 73 65 20 2a 70  eIds(.  Parse *p
2b20: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
2b30: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
2b40: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20   */.  int base, 
2b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45           /* VDBE
2b60: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
2b70: 6f 72 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  or first entry i
2b80: 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
2b90: 49 64 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  IdList *pTabList
2ba0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
2bb0: 62 6c 65 73 20 75 73 65 64 20 74 6f 20 72 65 73  bles used to res
2bc0: 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  olve column name
2bd0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
2be0: 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  *pEList,  /* Lis
2bf0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
2c00: 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65   used to resolve
2c10: 20 22 41 53 22 20 2a 2f 0a 20 20 45 78 70 72 20   "AS" */.  Expr 
2c20: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 2f 2a  *pExpr        /*
2c30: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
2c40: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20  to be analyzed. 
2c50: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70  */.){.  if( pExp
2c60: 72 3d 3d 30 20 7c 7c 20 70 54 61 62 4c 69 73 74  r==0 || pTabList
2c70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2c80: 20 20 61 73 73 65 72 74 28 20 62 61 73 65 2b 70    assert( base+p
2c90: 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3c 3d 70 50  TabList->nId<=pP
2ca0: 61 72 73 65 2d 3e 6e 54 61 62 20 29 3b 0a 20 20  arse->nTab );.  
2cb0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
2cc0: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6c 6f  p ){.    /* A lo
2cd0: 6e 65 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ne identifier.  
2ce0: 54 72 79 20 61 6e 64 20 6d 61 74 63 68 20 69 74  Try and match it
2cf0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
2d00: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 31   **.    **     1
2d10: 2e 20 20 54 6f 20 74 68 65 20 6e 61 6d 65 20 6f  .  To the name o
2d20: 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 6e  f a column of on
2d30: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
2d40: 69 6e 20 70 54 61 62 4c 69 73 74 0a 20 20 20 20  in pTabList.    
2d50: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 32 2e  **.    **     2.
2d60: 20 20 54 6f 20 74 68 65 20 72 69 67 68 74 20 73    To the right s
2d70: 69 64 65 20 6f 66 20 61 6e 20 41 53 20 6b 65 79  ide of an AS key
2d80: 77 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  word in the colu
2d90: 6d 6e 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 2a  mn list of.    *
2da0: 2a 20 20 20 20 20 20 20 20 20 61 20 53 45 4c 45  *         a SELE
2db0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 28  CT statement.  (
2dc0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 6d 61 74  For example, mat
2dd0: 63 68 20 61 67 61 69 6e 73 74 20 27 78 27 20 69  ch against 'x' i
2de0: 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
2df0: 20 22 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20   "SELECT a+b AS 
2e00: 27 78 27 20 46 52 4f 4d 20 74 31 22 2e 29 0a 20  'x' FROM t1".). 
2e10: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
2e20: 20 33 2e 20 20 4f 6e 65 20 6f 66 20 74 68 65 20   3.  One of the 
2e30: 73 70 65 63 69 61 6c 20 6e 61 6d 65 73 20 22 52  special names "R
2e40: 4f 57 49 44 22 2c 20 22 4f 49 44 22 2c 20 6f 72  OWID", "OID", or
2e50: 20 22 5f 52 4f 57 49 44 5f 22 2e 0a 20 20 20 20   "_ROWID_"..    
2e60: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
2e70: 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  D: {.      int c
2e80: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  nt = 0;      /* 
2e90: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 65  Number of matche
2ea0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
2eb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2ec0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2ed0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20        char *z;. 
2ee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
2ef0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20  pr->token.z );. 
2f00: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53       z = sqliteS
2f10: 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e 74 6f  trNDup(pExpr->to
2f20: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
2f30: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71  ken.n);.      sq
2f40: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 29 3b 0a  liteDequote(z);.
2f50: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
2f60: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2f70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
2f80: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
2f90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
2fa0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
2fb0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
2fc0: 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[i].pTab;.     
2fd0: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
2fe0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ff0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
3000: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  >nCol>0 );.     
3010: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
3020: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
3030: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
3040: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 54 61 62  liteStrICmp(pTab
3050: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
3060: 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   z)==0 ){.      
3070: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
3080: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
3090: 69 54 61 62 6c 65 20 3d 20 69 20 2b 20 62 61 73  iTable = i + bas
30a0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
30b0: 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  f( j==pTab->iPKe
30c0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
30d0: 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
30e0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
30f0: 65 72 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  er for the INTEG
3100: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
3110: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
3120: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
3130: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
3140: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3150: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
3160: 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
3170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3180: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
3190: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
31a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31c0: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 70 45 4c  f( cnt==0 && pEL
31d0: 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist!=0 ){.      
31e0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
31f0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69   for(j=0; j<pELi
3200: 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  st->nExpr; j++){
3210: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
3220: 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  *zAs = pEList->a
3230: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
3240: 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20       if( zAs!=0 
3250: 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  && sqliteStrICmp
3260: 28 7a 41 73 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20  (zAs, z)==0 ){. 
3270: 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
3280: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
3290: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
32a0: 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
32b0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
32c0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
32d0: 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20  op = TK_AS;.    
32e0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
32f0: 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
3300: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
3310: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70  Left = sqliteExp
3320: 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a  rDup(pEList->a[j
3330: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
3340: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
3350: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3360: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 73 71 6c  f( cnt==0 && sql
3370: 69 74 65 49 73 52 6f 77 69 64 28 7a 29 20 29 7b  iteIsRowid(z) ){
3380: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
3390: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
33a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
33b0: 62 6c 65 20 3d 20 62 61 73 65 3b 0a 20 20 20 20  ble = base;.    
33c0: 20 20 20 20 63 6e 74 20 3d 20 31 20 2b 20 28 70      cnt = 1 + (p
33d0: 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3e 31 29 3b  TabList->nId>1);
33e0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
33f0: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
3400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
3410: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
3420: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b     if( cnt==0 ){
3430: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
3440: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
3450: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
3460: 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 22 2c 20  such column: ", 
3470: 2d 31 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20  -1,  .          
3480: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
3490: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pExpr->token.n, 
34a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
34b0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
34c0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
34d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6e      }else if( cn
34e0: 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  t>1 ){.        s
34f0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
3500: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
3510: 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c  , "ambiguous col
3520: 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 2d 31 2c  umn name: ", -1,
3530: 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78    .          pEx
3540: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
3550: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b  pr->token.n, 0);
3560: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
3570: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
3580: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
3590: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20   }.      break; 
35a0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
35b0: 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   A table name an
35c0: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20  d column name:  
35d0: 49 44 2e 49 44 20 2a 2f 0a 20 20 20 20 63 61 73  ID.ID */.    cas
35e0: 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20  e TK_DOT: {.    
35f0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20    int cnt = 0;  
3600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3610: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 65 73 20  mber of matches 
3620: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  */.      int cnt
3630: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
3640: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
3650: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 73 20 2a  atching tables *
3660: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3680: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
3690: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
36a0: 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 20  pLeft, *pRight; 
36b0: 20 20 20 2f 2a 20 4c 65 66 74 20 61 6e 64 20 72     /* Left and r
36c0: 69 67 68 74 20 73 75 62 62 72 61 6e 63 68 65 73  ight subbranches
36d0: 20 6f 66 20 74 68 65 20 65 78 70 72 20 2a 2f 0a   of the expr */.
36e0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4c 65 66        char *zLef
36f0: 74 2c 20 2a 7a 52 69 67 68 74 3b 20 20 20 20 2f  t, *zRight;    /
3700: 2a 20 54 65 78 74 20 6f 66 20 61 6e 20 69 64 65  * Text of an ide
3710: 6e 74 69 66 69 65 72 20 2a 2f 0a 0a 20 20 20 20  ntifier */..    
3720: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
3730: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52  >pLeft;.      pR
3740: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
3750: 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
3760: 72 74 28 20 70 4c 65 66 74 20 26 26 20 70 4c 65  rt( pLeft && pLe
3770: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 26 26  ft->op==TK_ID &&
3780: 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20   pLeft->token.z 
3790: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
37a0: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
37b0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 26 26 20  t->op==TK_ID && 
37c0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20  pRight->token.z 
37d0: 29 3b 0a 20 20 20 20 20 20 7a 4c 65 66 74 20 3d  );.      zLeft =
37e0: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
37f0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Left->token.z, p
3800: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Left->token.n);.
3810: 20 20 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73        zRight = s
3820: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 52 69  qliteStrNDup(pRi
3830: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52  ght->token.z, pR
3840: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  ight->token.n);.
3850: 20 20 20 20 20 20 69 66 28 20 7a 4c 65 66 74 3d        if( zLeft=
3860: 3d 30 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 20  =0 || zRight==0 
3870: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3880: 65 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20  eFree(zLeft);.  
3890: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
38a0: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
38b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
38c0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
38d0: 44 65 71 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a  Dequote(zLeft);.
38e0: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
38f0: 6f 74 65 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  ote(zRight);.   
3900: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
3910: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 66 6f 72   = -1;.      for
3920: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
3930: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
3940: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
3950: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a      char *zTab;.
3960: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
3970: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
3980: 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[i].pTab;.     
3990: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
39a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
39b0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
39c0: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  >nCol>0 );.     
39d0: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
39e0: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 20 29 7b 0a  >a[i].zAlias ){.
39f0: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d            zTab =
3a00: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
3a10: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
3a20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3a30: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
3a40: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
3a50: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 3d         if( zTab=
3a60: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 53 74 72 49  =0 || sqliteStrI
3a70: 43 6d 70 28 7a 54 61 62 2c 20 7a 4c 65 66 74 29  Cmp(zTab, zLeft)
3a80: 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
3a90: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28          if( 0==(
3aa0: 63 6e 74 54 61 62 2b 2b 29 20 29 20 70 45 78 70  cntTab++) ) pExp
3ab0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 2b 20  r->iTable = i + 
3ac0: 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  base;.        fo
3ad0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
3ae0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
3af0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
3b00: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
3b10: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 52 69 67  l[j].zName, zRig
3b20: 68 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ht)==0 ){.      
3b30: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
3b40: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
3b50: 69 54 61 62 6c 65 20 3d 20 69 20 2b 20 62 61 73  iTable = i + bas
3b60: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
3b70: 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  f( j==pTab->iPKe
3b80: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
3b90: 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
3ba0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
3bb0: 65 72 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  er for the INTEG
3bc0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
3bd0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
3be0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
3bf0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
3c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3c10: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
3c20: 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
3c30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3c40: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
3c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
3c60: 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62  cnt==0 && cntTab
3c70: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 49 73 52  ==1 && sqliteIsR
3c80: 6f 77 69 64 28 7a 52 69 67 68 74 29 20 29 7b 0a  owid(zRight) ){.
3c90: 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b          cnt = 1;
3ca0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
3cb0: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
3cc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
3cd0: 74 65 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20  teFree(zLeft);. 
3ce0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
3cf0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69  zRight);.      i
3d00: 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  f( cnt==0 ){.   
3d10: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
3d20: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
3d30: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
3d40: 20 63 6f 6c 75 6d 6e 3a 20 22 2c 20 2d 31 2c 20   column: ", -1, 
3d50: 20 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 66   .          pLef
3d60: 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66  t->token.z, pLef
3d70: 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 2e 22 2c  t->token.n, ".",
3d80: 20 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70   1, .          p
3d90: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  Right->token.z, 
3da0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c  pRight->token.n,
3db0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
3dc0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
3dd0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3de0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
3df0: 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  nt>1 ){.        
3e00: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
3e10: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
3e20: 67 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f  g, "ambiguous co
3e30: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 2d 31  lumn name: ", -1
3e40: 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4c  ,  .          pL
3e50: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c  eft->token.z, pL
3e60: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 2e  eft->token.n, ".
3e70: 22 2c 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ", 1,.          
3e80: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c  pRight->token.z,
3e90: 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e   pRight->token.n
3ea0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
3eb0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
3ec0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3ed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
3ee0: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
3ef0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 45 78  Left);.      pEx
3f00: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr->pLeft = 0;. 
3f10: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
3f20: 65 6c 65 74 65 28 70 52 69 67 68 74 29 3b 0a 20  elete(pRight);. 
3f30: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
3f40: 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 45  ht = 0;.      pE
3f50: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
3f60: 55 4d 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  UMN;.      break
3f70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
3f80: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
3f90: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
3fa0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
3fb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30  ;.      if( v==0
3fc0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
3fd0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
3fe0: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
3ff0: 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69  se, base, pTabLi
4000: 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70  st, pEList, pExp
4010: 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  r->pLeft) ){.   
4020: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4040: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
4050: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
4060: 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
4070: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
4080: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
4090: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
40a0: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
40b0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
40c0: 65 6c 65 63 74 20 69 6e 74 6f 20 61 20 74 65 6d  elect into a tem
40d0: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
40e0: 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 75  * table.  The cu
40f0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
4100: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
4110: 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  le has already. 
4120: 20 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 70         ** been p
4130: 75 74 20 69 6e 20 69 54 61 62 6c 65 20 62 79 20  ut in iTable by 
4140: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
4150: 65 49 6e 53 65 6c 65 63 74 28 29 2e 0a 20 20 20  eInSelect()..   
4160: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
4170: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
4180: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
4190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
41a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
41b0: 65 6e 54 65 6d 70 2c 20 70 45 78 70 72 2d 3e 69  enTemp, pExpr->i
41c0: 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20  Table, 1);.     
41d0: 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28     sqliteSelect(
41e0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
41f0: 53 65 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c  Select, SRT_Set,
4200: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
4210: 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65  0,0,0);.      }e
4220: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
4230: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
4240: 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65  /* Case 2:     e
4250: 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
4260: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
4270: 20 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61       ** Create a
4280: 20 73 65 74 20 74 6f 20 70 75 74 20 74 68 65 20   set to put the 
4290: 65 78 70 72 6c 69 73 74 20 76 61 6c 75 65 73 20  exprlist values 
42a0: 69 6e 2e 20 20 54 68 65 20 53 65 74 20 69 64 20  in.  The Set id 
42b0: 69 73 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20  is stored.      
42c0: 20 20 2a 2a 20 69 6e 20 69 54 61 62 6c 65 2e 0a    ** in iTable..
42d0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
42e0: 20 20 20 69 6e 74 20 69 2c 20 69 53 65 74 3b 0a     int i, iSet;.
42f0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
4300: 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   i<pExpr->pList-
4310: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4320: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
4330: 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  2 = pExpr->pList
4340: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
4350: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
4360: 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  iteExprIsConstan
4370: 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
4380: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
4390: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
43a0: 45 72 72 4d 73 67 2c 0a 20 20 20 20 20 20 20 20  ErrMsg,.        
43b0: 20 20 20 20 20 20 22 72 69 67 68 74 2d 68 61 6e        "right-han
43c0: 64 20 73 69 64 65 20 6f 66 20 49 4e 20 6f 70 65  d side of IN ope
43d0: 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 63 6f  rator must be co
43e0: 6e 73 74 61 6e 74 22 2c 20 30 29 3b 0a 20 20 20  nstant", 0);.   
43f0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
4400: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
4410: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4420: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4430: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
4440: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
4450: 20 70 45 32 2c 20 30 2c 20 30 29 20 29 7b 0a 20   pE2, 0, 0) ){. 
4460: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
4470: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 1;.          }
4480: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4490: 20 20 20 69 53 65 74 20 3d 20 70 45 78 70 72 2d     iSet = pExpr-
44a0: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
44b0: 2d 3e 6e 53 65 74 2b 2b 3b 0a 20 20 20 20 20 20  ->nSet++;.      
44c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78    for(i=0; i<pEx
44d0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
44e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
44f0: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45    Expr *pE2 = pE
4500: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  xpr->pList->a[i]
4510: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
4520: 20 20 73 77 69 74 63 68 28 20 70 45 32 2d 3e 6f    switch( pE2->o
4530: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
4540: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
4550: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
4560: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
4570: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
4580: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
4590: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64           int add
45a0: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
45b0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 49 6e 73  dOp(v, OP_SetIns
45c0: 65 72 74 2c 20 69 53 65 74 2c 20 30 29 3b 0a 20  ert, iSet, 0);. 
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
45e0: 65 72 74 28 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e  ert( pE2->token.
45f0: 7a 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  z );.           
4600: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
4610: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
4620: 45 32 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 32  E2->token.z, pE2
4630: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
4640: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4650: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
4660: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20   addr);.        
4670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4680: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4690: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
46a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
46b0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
46c0: 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20 20 20  Parse, pE2);.   
46d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
46e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
46f0: 5f 53 65 74 49 6e 73 65 72 74 2c 20 69 53 65 74  _SetInsert, iSet
4700: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
4710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4720: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4730: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
4740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
4750: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
4760: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
4770: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68  .      /* This h
4780: 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  as to be a scala
4790: 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72  r SELECT.  Gener
47a0: 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
47b0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  the.      ** val
47c0: 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63  ue of this selec
47d0: 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65  t in a memory ce
47e0: 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ll and record th
47f0: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
4800: 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  * of the memory 
4810: 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e  cell in iColumn.
4820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4830: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
4840: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
4850: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
4860: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
4870: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
4880: 53 52 54 5f 4d 65 6d 2c 20 70 45 78 70 72 2d 3e  SRT_Mem, pExpr->
4890: 69 43 6f 6c 75 6d 6e 2c 30 2c 30 2c 30 29 20 29  iColumn,0,0,0) )
48a0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
48b0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
48c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
48d0: 20 20 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 65      /* For all e
48e0: 6c 73 65 2c 20 6a 75 73 74 20 72 65 63 75 72 73  lse, just recurs
48f0: 69 76 65 6c 79 20 77 61 6c 6b 20 74 68 65 20 74  ively walk the t
4900: 72 65 65 20 2a 2f 0a 20 20 20 20 64 65 66 61 75  ree */.    defau
4910: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  lt: {.      if( 
4920: 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a 20 20 20  pExpr->pLeft.   
4930: 20 20 20 26 26 20 73 71 6c 69 74 65 45 78 70 72     && sqliteExpr
4940: 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
4950: 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73  e, base, pTabLis
4960: 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72  t, pEList, pExpr
4970: 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  ->pLeft) ){.    
4980: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4990: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
49a0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 0a 20  pExpr->pRight . 
49b0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 45 78       && sqliteEx
49c0: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
49d0: 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c  rse, base, pTabL
49e0: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78  ist, pEList, pEx
49f0: 70 72 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a 20  pr->pRight) ){. 
4a00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
4a10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4a20: 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20  f( pExpr->pList 
4a30: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
4a40: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
4a50: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
4a60: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
4a70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
4a80: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
4a90: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
4aa0: 2a 70 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 61  *pArg = pList->a
4ab0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
4ac0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
4ad0: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
4ae0: 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62  arse, base, pTab
4af0: 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 41  List, pEList, pA
4b00: 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rg) ){.         
4b10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
4b20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4b30: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
4b40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4b50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20  .}../*.** Error 
4b60: 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69  check the functi
4b70: 6f 6e 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73  ons in an expres
4b80: 73 69 6f 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65  sion.  Make sure
4b90: 20 61 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   all.** function
4ba0: 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67   names are recog
4bb0: 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75  nized and all fu
4bc0: 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 74 68 65  nctions have the
4bd0: 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62   correct.** numb
4be0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
4bf0: 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72    Leave an error
4c00: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
4c10: 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69  se->zErrMsg.** i
4c20: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d  f anything is am
4c30: 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  iss.  Return the
4c40: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
4c50: 73 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41  s..**.** if pIsA
4c60: 67 67 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61  gg is not null a
4c70: 6e 64 20 74 68 69 73 20 65 78 70 72 65 73 73 69  nd this expressi
4c80: 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  on is an aggrega
4c90: 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28  te function.** (
4ca0: 6c 69 6b 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72  like count(*) or
4cb0: 20 6d 61 78 28 76 61 6c 75 65 29 29 20 74 68 65   max(value)) the
4cc0: 6e 20 77 72 69 74 65 20 61 20 31 20 69 6e 74 6f  n write a 1 into
4cd0: 20 2a 70 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74   *pIsAgg..*/.int
4ce0: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
4cf0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4d00: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
4d10: 20 61 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20 2a   allowAgg, int *
4d20: 70 49 73 41 67 67 29 7b 0a 20 20 69 6e 74 20 6e  pIsAgg){.  int n
4d30: 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Err = 0;.  if( p
4d40: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
4d50: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   0;.  switch( pE
4d60: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
4d70: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
4d80: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d   {.      int n =
4d90: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20   pExpr->pList ? 
4da0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
4db0: 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 69  xpr : 0;.      i
4dc0: 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  nt no_such_func 
4dd0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 77  = 0;.      int w
4de0: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
4df0: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f  0;.      int is_
4e00: 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  agg = 0;.      i
4e10: 6e 74 20 69 3b 0a 20 20 20 20 20 20 46 75 6e 63  nt i;.      Func
4e20: 44 65 66 20 2a 70 44 65 66 3b 0a 0a 20 20 20 20  Def *pDef;..    
4e30: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 46    pDef = sqliteF
4e40: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
4e50: 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
4e60: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
4e70: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
4e80: 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   n, 0);.      if
4e90: 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
4ea0: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
4eb0: 74 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  teFindFunction(p
4ec0: 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
4ed0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
4ee0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
4ef0: 65 6e 2e 6e 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  en.n, -1, 0);.  
4f00: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
4f10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  0 ){.          n
4f20: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b  o_such_func = 1;
4f30: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
4f40: 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f            wrong_
4f50: 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20  num_args = 1;.  
4f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
4f70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f  lse{.        is_
4f80: 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e  agg = pDef->xFun
4f90: 63 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  c==0;.      }.  
4fa0: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 26      if( is_agg &
4fb0: 26 20 21 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20  & !allowAgg ){. 
4fc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
4fd0: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
4fe0: 3e 7a 45 72 72 4d 73 67 2c 20 22 6d 69 73 75 73  >zErrMsg, "misus
4ff0: 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
5000: 75 6e 63 74 69 6f 6e 20 22 2c 20 2d 31 2c 0a 20  unction ", -1,. 
5010: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
5020: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
5030: 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 28 29 22 2c 20  >token.n, "()", 
5040: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  2, 0);.        p
5050: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
5060: 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20         nErr++;. 
5070: 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20         is_agg = 
5080: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
5090: 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  f( no_such_func 
50a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
50b0: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
50c0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e  rse->zErrMsg, "n
50d0: 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a  o such function:
50e0: 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20   ", -1,.        
50f0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
5100: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
5110: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  n, 0);.        p
5120: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
5130: 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20         nErr++;. 
5140: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77       }else if( w
5150: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b  rong_num_args ){
5160: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
5170: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
5180: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20  e->zErrMsg, .   
5190: 20 20 20 20 20 20 20 20 22 77 72 6f 6e 67 20 6e          "wrong n
51a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
51b0: 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 22  ts to function "
51c0: 2c 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,-1,.           
51d0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
51e0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pExpr->token.n, 
51f0: 22 28 29 22 2c 20 32 2c 20 30 29 3b 0a 20 20 20  "()", 2, 0);.   
5200: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
5210: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72  r++;.        nEr
5220: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
5230: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
5240: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
5250: 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20  GG_FUNCTION;.   
5260: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 26 26     if( is_agg &&
5270: 20 70 49 73 41 67 67 20 29 20 2a 70 49 73 41 67   pIsAgg ) *pIsAg
5280: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  g = 1;.      for
5290: 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26  (i=0; nErr==0 &&
52a0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
52b0: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
52c0: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
52d0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
52e0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20  >a[i].pExpr,.   
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5300: 20 20 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f              allo
5310: 77 41 67 67 20 26 26 20 21 69 73 5f 61 67 67 2c  wAgg && !is_agg,
5320: 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20   pIsAgg);.      
5330: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  }.    }.    defa
5340: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ult: {.      if(
5350: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
5360: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
5370: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
5380: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
5390: 4c 65 66 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20  Left, allowAgg, 
53a0: 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d  pIsAgg);.      }
53b0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d  .      if( nErr=
53c0: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
53d0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  ght ){.        n
53e0: 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  Err = sqliteExpr
53f0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
5400: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 6c 6c  xpr->pRight, all
5410: 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a  owAgg, pIsAgg);.
5420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5430: 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78  ( nErr==0 && pEx
5440: 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pr->pList ){.   
5450: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78       int n = pEx
5460: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
5470: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  ;.        int i;
5480: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
5490: 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e  ; nErr==0 && i<n
54a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
54b0: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45    Expr *pE2 = pE
54c0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  xpr->pList->a[i]
54d0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
54e0: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45    nErr = sqliteE
54f0: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
5500: 20 70 45 32 2c 20 61 6c 6c 6f 77 41 67 67 2c 20   pE2, allowAgg, 
5510: 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 20  pIsAgg);.       
5520: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5530: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5540: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
5550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
5560: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
5570: 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
5580: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
5590: 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
55a0: 6e 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20  n and leave the 
55b0: 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f  result on the to
55c0: 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a 2f 0a 76  p of stack..*/.v
55d0: 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 43 6f  oid sqliteExprCo
55e0: 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
55f0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
5600: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5610: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
5620: 20 6f 70 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20   op;.  if( v==0 
5630: 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  || pExpr==0 ) re
5640: 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20  turn;.  switch( 
5650: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
5660: 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20   case TK_PLUS:  
5670: 20 20 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20     op = OP_Add; 
5680: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5690: 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20  case TK_MINUS:  
56a0: 20 20 6f 70 20 3d 20 4f 50 5f 53 75 62 74 72 61    op = OP_Subtra
56b0: 63 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ct; break;.    c
56c0: 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20  ase TK_STAR:    
56d0: 20 6f 70 20 3d 20 4f 50 5f 4d 75 6c 74 69 70 6c   op = OP_Multipl
56e0: 79 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  y; break;.    ca
56f0: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 20  se TK_SLASH:    
5700: 6f 70 20 3d 20 4f 50 5f 44 69 76 69 64 65 3b 20  op = OP_Divide; 
5710: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5720: 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 20 6f  e TK_AND:      o
5730: 70 20 3d 20 4f 50 5f 41 6e 64 3b 20 20 20 20 20  p = OP_And;     
5740: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5750: 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 20 6f 70   TK_OR:       op
5760: 20 3d 20 4f 50 5f 4f 72 3b 20 20 20 20 20 20 20   = OP_Or;       
5770: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5780: 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20  TK_LT:       op 
5790: 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62  = OP_Lt;       b
57a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
57b0: 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_LE:       op =
57c0: 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72   OP_Le;       br
57d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
57e0: 5f 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _GT:       op = 
57f0: 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Gt;       bre
5800: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
5810: 47 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  GE:       op = O
5820: 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ge;       brea
5830: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
5840: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
5850: 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Ne;       break
5860: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
5870: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
5880: 45 71 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Eq;       break;
5890: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b  .    case TK_LIK
58a0: 45 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c  E:     op = OP_L
58b0: 69 6b 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ike;     break;.
58c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42      case TK_GLOB
58d0: 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 6c  :     op = OP_Gl
58e0: 6f 62 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ob;     break;. 
58f0: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
5900: 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e  L:   op = OP_IsN
5910: 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ull;   break;.  
5920: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
5930: 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  L:  op = OP_NotN
5940: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
5950: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
5960: 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 3b 20     op = OP_Not; 
5970: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5980: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
5990: 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 67 61 74 69    op = OP_Negati
59a0: 76 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ve; break;.    c
59b0: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
59c0: 20 6f 70 20 3d 20 4f 50 5f 42 69 74 41 6e 64 3b   op = OP_BitAnd;
59d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
59e0: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 20  se TK_BITOR:    
59f0: 6f 70 20 3d 20 4f 50 5f 42 69 74 4f 72 3b 20 20  op = OP_BitOr;  
5a00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5a10: 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 20 6f  e TK_BITNOT:   o
5a20: 70 20 3d 20 4f 50 5f 42 69 74 4e 6f 74 3b 20 20  p = OP_BitNot;  
5a30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5a40: 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 20 6f 70   TK_LSHIFT:   op
5a50: 20 3d 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3b   = OP_ShiftLeft;
5a60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5a70: 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 20 6f  e TK_RSHIFT:   o
5a80: 70 20 3d 20 4f 50 5f 53 68 69 66 74 52 69 67 68  p = OP_ShiftRigh
5a90: 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  t; break;.    ca
5aa0: 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 20  se TK_REM:      
5ab0: 6f 70 20 3d 20 4f 50 5f 52 65 6d 61 69 6e 64 65  op = OP_Remainde
5ac0: 72 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  r;  break;.    d
5ad0: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
5ae0: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78   }.  switch( pEx
5af0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
5b00: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
5b10: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
5b20: 2d 3e 75 73 65 41 67 67 20 29 7b 0a 20 20 20 20  ->useAgg ){.    
5b30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5b40: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74  dOp(v, OP_AggGet
5b50: 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67  , 0, pExpr->iAgg
5b60: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
5b70: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
5b80: 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
5b90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5ba0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45  v, OP_Column, pE
5bb0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
5bc0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
5bd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5be0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5bf0: 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20  Op(v, OP_Recno, 
5c00: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
5c10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5c20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5c30: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
5c40: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
5c50: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5c60: 5f 49 6e 74 65 67 65 72 2c 20 61 74 6f 69 28 70  _Integer, atoi(p
5c70: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 2c 20  Expr->token.z), 
5c80: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
5c90: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
5ca0: 2d 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  -1, pExpr->token
5cb0: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
5cc0: 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .n);.      break
5cd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
5ce0: 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
5cf0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5d00: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
5d10: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73   0, 0);.      as
5d20: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
5d30: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 73 71  en.z );.      sq
5d40: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
5d50: 28 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e 74  (v, -1, pExpr->t
5d60: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
5d70: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62  oken.n);.      b
5d80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5d90: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
5da0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
5db0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
5dc0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
5dd0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73   0, 0);.      as
5de0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
5df0: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 73 71  en.z );.      sq
5e00: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
5e10: 28 76 2c 20 61 64 64 72 2c 20 70 45 78 70 72 2d  (v, addr, pExpr-
5e20: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
5e30: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
5e40: 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f   sqliteVdbeDequo
5e50: 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20  teP3(v, addr);. 
5e60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5e70: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
5e80: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
5e90: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5ea0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
5eb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5ec0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
5ed0: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
5ee0: 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
5ef0: 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
5f00: 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
5f10: 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
5f20: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
5f30: 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
5f40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
5f50: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
5f60: 53 4c 41 53 48 3a 20 7b 0a 20 20 20 20 20 20 73  SLASH: {.      s
5f70: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
5f80: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
5f90: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
5fa0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
5fb0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
5fc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
5fd0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
5fe0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
5ff0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6000: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
6010: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
6020: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
6030: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
6040: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
6050: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
6060: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
6070: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
6080: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6090: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
60a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
60b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
60c0: 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 73  ONCAT: {.      s
60d0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
60e0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
60f0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
6100: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
6110: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
6120: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6130: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
6140: 6e 63 61 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20  ncat, 2, 0);.   
6150: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6160: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
6170: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
6180: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
6190: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
61a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
61b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
61c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b  .    case TK_LIK
61d0: 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  E: .    case TK_
61e0: 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  GLOB: {.      in
61f0: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 73 71  t dest;.      sq
6200: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6210: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
6220: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
6230: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
6240: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
6250: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
6260: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
6270: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
6280: 20 20 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65     dest = sqlite
6290: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
62a0: 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71  v) + 2;.      sq
62b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
62c0: 20 6f 70 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20   op, 0, dest);. 
62d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
62e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
62f0: 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  m, -1, 0);.     
6300: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6310: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
6320: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
6330: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
6340: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
6350: 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
6360: 5f 46 4c 4f 41 54 20 7c 7c 20 70 45 78 70 72 2d  _FLOAT || pExpr-
6370: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
6380: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
6390: 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 45    Token *p = &pE
63a0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  xpr->pLeft->toke
63b0: 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  n;.        char 
63c0: 2a 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  *z = sqliteMallo
63d0: 63 28 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20  c( p->n + 2 );. 
63e0: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
63f0: 2c 20 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c  , "-%.*s", p->n,
6400: 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20   p->z);.        
6410: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
6420: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
6430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
6440: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6450: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 61 74 6f   OP_Integer, ato
6460: 69 28 7a 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  i(z), 0);.      
6470: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6480: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6490: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
64a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
64b0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
64c0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
64d0: 2d 31 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a  -1, z, p->n+1);.
64e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
64f0: 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 62  ee(z);.        b
6500: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
6510: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
6520: 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20  ugh into TK_NOT 
6530: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
6540: 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
6550: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
6560: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
6570: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
6580: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
6590: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
65a0: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
65b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
65c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
65d0: 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
65e0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
65f0: 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20 20      int dest;.  
6600: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6610: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
6620: 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 1, 0);.      
6630: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
6640: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
6650: 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74  eft);.      dest
6660: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72   = sqliteVdbeCur
6670: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
6680: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6690: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
66a0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
66b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
66c0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20   OP_AddImm, -1, 
66d0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
66e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
66f0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
6700: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   {.      sqliteV
6710: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
6720: 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72 2d  ggGet, 0, pExpr-
6730: 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 62 72  >iAgg);.      br
6740: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6750: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
6760: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a   {.      int i;.
6770: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
6780: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
6790: 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  List;.      int 
67a0: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20  nExpr = pList ? 
67b0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
67c0: 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  ;.      FuncDef 
67d0: 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 70 44 65  *pDef;.      pDe
67e0: 66 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 46 75  f = sqliteFindFu
67f0: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
6800: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
6810: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6820: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
6830: 74 6f 6b 65 6e 2e 6e 2c 20 6e 45 78 70 72 2c 20  token.n, nExpr, 
6840: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
6850: 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20  ( pDef!=0 );.   
6860: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
6870: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
6880: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
6890: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
68a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
68b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
68c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
68d0: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 6e 45 78 70  P_Function, nExp
68e0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
68f0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6900: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 44  v, -1, (char*)pD
6910: 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b  ef, P3_POINTER);
6920: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6930: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
6940: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
6950: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6960: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
6970: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30  Expr->iColumn, 0
6980: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6990: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
69a0: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
69b0: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73 71  t addr;.      sq
69c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
69d0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
69e0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
69f0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
6a00: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
6a10: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
6a20: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
6a30: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  dr(v);.      if(
6a40: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
6a50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6a60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6a70: 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
6a80: 54 61 62 6c 65 2c 20 61 64 64 72 2b 32 29 3b 0a  Table, addr+2);.
6a90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6aa0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6ab0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 46 6f  ddOp(v, OP_SetFo
6ac0: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
6ad0: 6c 65 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20  le, addr+2);.   
6ae0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
6af0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6b00: 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b  _AddImm, -1, 0);
6b10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6b20: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
6b30: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
6b40: 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74   int lbl = sqlit
6b50: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
6b60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6b70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6b80: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
6b90: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
6ba0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
6bb0: 45 78 70 72 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  Expr, lbl);.    
6bc0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6bd0: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
6be0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
6bf0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
6c00: 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20  bel(v, lbl);.   
6c10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6c20: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20      case TK_AS: 
6c30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
6c40: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
6c50: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
6c60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6c70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
6c80: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
6c90: 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
6ca0: 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
6cb0: 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
6cc0: 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
6cd0: 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
6ce0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6cf0: 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
6d00: 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
6d10: 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
6d20: 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
6d30: 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f  ion is false..*/
6d40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
6d50: 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
6d60: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
6d70: 72 2c 20 69 6e 74 20 64 65 73 74 29 7b 0a 20 20  r, int dest){.  
6d80: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
6d90: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
6da0: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d  p = 0;.  if( v==
6db0: 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
6dc0: 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68  return;.  switch
6dd0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
6de0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
6df0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b       op = OP_Lt;
6e00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6e10: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
6e20: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20      op = OP_Le; 
6e30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6e40: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
6e50: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20     op = OP_Gt;  
6e60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6e70: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
6e80: 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20    op = OP_Ge;   
6e90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
6ea0: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
6eb0: 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20   op = OP_Ne;    
6ec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
6ed0: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20  se TK_EQ:       
6ee0: 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20  op = OP_Eq;     
6ef0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6f00: 65 20 54 4b 5f 4c 49 4b 45 3a 20 20 20 20 20 6f  e TK_LIKE:     o
6f10: 70 20 3d 20 4f 50 5f 4c 69 6b 65 3b 20 20 20 20  p = OP_Like;    
6f20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6f30: 20 54 4b 5f 47 4c 4f 42 3a 20 20 20 20 20 6f 70   TK_GLOB:     op
6f40: 20 3d 20 4f 50 5f 47 6c 6f 62 3b 20 20 20 20 20   = OP_Glob;     
6f50: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6f60: 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20  TK_ISNULL:   op 
6f70: 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62  = OP_IsNull;   b
6f80: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
6f90: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d  K_NOTNULL:  op =
6fa0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72   OP_NotNull;  br
6fb0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
6fc0: 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  :  break;.  }.  
6fd0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
6fe0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
6ff0: 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
7000: 74 20 64 32 20 3d 20 73 71 6c 69 74 65 56 64 62  t d2 = sqliteVdb
7010: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
7020: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
7030: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
7040: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 29  Expr->pLeft, d2)
7050: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
7060: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
7070: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
7080: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
7090: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
70a0: 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
70b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
70c0: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
70d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
70e0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
70f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
7100: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
7110: 65 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  eExprIfTrue(pPar
7120: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
7130: 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
7140: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7150: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
7160: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
7170: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
7180: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
7190: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
71a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
71b0: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
71c0: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
71d0: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
71e0: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
71f0: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
7200: 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65   TK_EQ:.    case
7210: 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63 61   TK_LIKE:.    ca
7220: 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20 20  se TK_GLOB: {.  
7230: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
7240: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
7250: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
7260: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
7270: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
7280: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ight);.      sql
7290: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
72a0: 6f 70 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  op, 0, dest);.  
72b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
72c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
72d0: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
72e0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
72f0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
7300: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
7310: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
7320: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7330: 20 6f 70 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20   op, 0, dest);. 
7340: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7350: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
7360: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7370: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
7380: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
7390: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
73a0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
73b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
73c0: 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  dOp(v, OP_Found,
73d0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
73e0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
73f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
7400: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7410: 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_SetFound, pExp
7420: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29  r->iTable, dest)
7430: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7440: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7450: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
7460: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62  : {.      int lb
7470: 6c 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  l = sqliteVdbeMa
7480: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
7490: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
74a0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
74b0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
74c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
74d0: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
74e0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
74f0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
7500: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
7510: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
7520: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7530: 20 4f 50 5f 4c 74 2c 20 30 2c 20 6c 62 6c 29 3b   OP_Lt, 0, lbl);
7540: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
7550: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
7560: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
7570: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  .pExpr);.      s
7580: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7590: 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 64 65 73 74  , OP_Le, 0, dest
75a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
75b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
75c0: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
75d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
75e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
75f0: 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  bl);.      sqlit
7600: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7610: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
7620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7630: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
7640: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
7650: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
7660: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7670: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7680: 49 66 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  If, 0, dest);.  
7690: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
76a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
76b0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
76c0: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
76d0: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
76e0: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
76f0: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
7700: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
7710: 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
7720: 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
7730: 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
7740: 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
7750: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
7760: 75 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ue..*/.void sqli
7770: 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  teExprIfFalse(Pa
7780: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
7790: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
77a0: 73 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  st){.  Vdbe *v =
77b0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
77c0: 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
77d0: 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
77e0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
77f0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
7800: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
7810: 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_LT:       op =
7820: 20 4f 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72   OP_Ge;       br
7830: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7840: 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _LE:       op = 
7850: 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Gt;       bre
7860: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7870: 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  GT:       op = O
7880: 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Le;       brea
7890: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
78a0: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
78b0: 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Lt;       break
78c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  ;.    case TK_NE
78d0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
78e0: 45 71 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Eq;       break;
78f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
7900: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e         op = OP_N
7910: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
7920: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45      case TK_LIKE
7930: 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 69  :     op = OP_Li
7940: 6b 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ke;     break;. 
7950: 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a     case TK_GLOB:
7960: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 6c 6f       op = OP_Glo
7970: 62 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  b;     break;.  
7980: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
7990: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  :   op = OP_NotN
79a0: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
79b0: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
79c0: 3a 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c  :  op = OP_IsNul
79d0: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
79e0: 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b  default:  break;
79f0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
7a00: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
7a10: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
7a20: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
7a30: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
7a40: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
7a50: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
7a60: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
7a70: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
7a80: 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
7a90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7aa0: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
7ab0: 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
7ac0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
7ad0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
7ae0: 74 65 45 78 70 72 49 66 54 72 75 65 28 70 50 61  teExprIfTrue(pPa
7af0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
7b00: 74 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  t, d2);.      sq
7b10: 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28  liteExprIfFalse(
7b20: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
7b30: 52 69 67 68 74 2c 20 64 65 73 74 29 3b 0a 20 20  Right, dest);.  
7b40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
7b50: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
7b60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7b70: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
7b80: 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73  K_NOT: {.      s
7b90: 71 6c 69 74 65 45 78 70 72 49 66 54 72 75 65 28  qliteExprIfTrue(
7ba0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
7bb0: 4c 65 66 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  Left, dest);.   
7bc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7bd0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
7be0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
7bf0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
7c00: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
7c10: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
7c20: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
7c30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
7c40: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
7c50: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
7c60: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
7c70: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
7c80: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
7c90: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7ca0: 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74 29  (v, op, 0, dest)
7cb0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7cc0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7cd0: 5f 4c 49 4b 45 3a 0a 20 20 20 20 63 61 73 65 20  _LIKE:.    case 
7ce0: 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_GLOB: {.     
7cf0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
7d00: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
7d10: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
7d20: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
7d30: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
7d40: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
7d50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
7d60: 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   1, dest);.     
7d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7d80: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
7d90: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
7da0: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
7db0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
7dc0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
7dd0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
7de0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
7df0: 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
7e00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7e10: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
7e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
7e30: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
7e40: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
7e50: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
7e60: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
7e70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7e80: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
7e90: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
7ea0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
7eb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
7ec0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7ed0: 50 5f 53 65 74 4e 6f 74 46 6f 75 6e 64 2c 20 70  P_SetNotFound, p
7ee0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
7ef0: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
7f00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7f10: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
7f20: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  EEN: {.      int
7f30: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c   addr;.      sql
7f40: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
7f50: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
7f60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
7f70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
7f80: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
7f90: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
7fa0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
7fb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
7fc0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
7fd0: 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e  sqliteVdbeCurren
7fe0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
7ff0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8000: 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 61 64 64  v, OP_Ge, 0, add
8010: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
8020: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8030: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
8040: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8050: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
8060: 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
8070: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
8080: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
8090: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  ist->a[1].pExpr)
80a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
80b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 74  beAddOp(v, OP_Gt
80c0: 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
80d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
80e0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
80f0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
8100: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
8110: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8120: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
8130: 6f 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ot, 0, 0);.     
8140: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8150: 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 64 65  (v, OP_If, 0, de
8160: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
8170: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
8180: 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63  *.** Do a deep c
8190: 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f  omparison of two
81a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
81b0: 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
81c0: 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66  (non-zero).** if
81d0: 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
81e0: 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46  cal and return F
81f0: 41 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66  ALSE if they dif
8200: 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
8210: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70  */.int sqliteExp
8220: 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
8230: 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20  A, Expr *pB){.  
8240: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
8250: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
8260: 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20   pB==0;.  }else 
8270: 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20  if( pB==0 ){.   
8280: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
8290: 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d   if( pA->op!=pB-
82a0: 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >op ) return 0;.
82b0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 45 78 70    if( !sqliteExp
82c0: 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
82d0: 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29  ft, pB->pLeft) )
82e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
82f0: 20 21 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70   !sqliteExprComp
8300: 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20  are(pA->pRight, 
8310: 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65  pB->pRight) ) re
8320: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
8330: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69  ->pList ){.    i
8340: 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20  f( pB->pList==0 
8350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
8360: 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e  if( pA->pList->n
8370: 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d  Expr!=pB->pList-
8380: 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
8390: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
83a0: 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  i<pA->pList->nEx
83b0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
83c0: 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72 43  if( !sqliteExprC
83d0: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74  ompare(pA->pList
83e0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42  ->a[i].pExpr, pB
83f0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
8400: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
8410: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
8420: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
8430: 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b  if( pB->pList ){
8440: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8450: 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65   }.  if( pA->pSe
8460: 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c  lect || pB->pSel
8470: 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ect ) return 0;.
8480: 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e    if( pA->token.
8490: 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  z ){.    if( pB-
84a0: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65  >token.z==0 ) re
84b0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
84c0: 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d  pB->token.n!=pA-
84d0: 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72  >token.n ) retur
84e0: 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 0;.    if( sql
84f0: 69 74 65 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e  iteStrNICmp(pA->
8500: 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b  token.z, pB->tok
8510: 65 6e 2e 7a 2c 20 70 41 2d 3e 74 6f 6b 65 6e 2e  en.z, pA->token.
8520: 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  n)!=0 ) return 0
8530: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
8540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
8550: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
8560: 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
8570: 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 72 65 74  [] array and ret
8580: 75 72 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a  urn its index..*
8590: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70  /.static int app
85a0: 65 6e 64 41 67 67 49 6e 66 6f 28 50 61 72 73 65  endAggInfo(Parse
85b0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
85c0: 20 28 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 26   (pParse->nAgg &
85d0: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
85e0: 69 6e 74 20 61 6d 74 20 3d 20 70 50 61 72 73 65  int amt = pParse
85f0: 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20 20  ->nAgg + 8;.    
8600: 41 67 67 45 78 70 72 20 2a 61 41 67 67 20 3d 20  AggExpr *aAgg = 
8610: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 50  sqliteRealloc(pP
8620: 61 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a  arse->aAgg, amt*
8630: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
8640: 41 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Agg[0]));.    if
8650: 28 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20  ( aAgg==0 ){.   
8660: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
8670: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
8680: 61 41 67 67 20 3d 20 61 41 67 67 3b 0a 20 20 7d  aAgg = aAgg;.  }
8690: 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73  .  memset(&pPars
86a0: 65 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d 3e  e->aAgg[pParse->
86b0: 6e 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nAgg], 0, sizeof
86c0: 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d  (pParse->aAgg[0]
86d0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  ));.  return pPa
86e0: 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a  rse->nAgg++;.}..
86f0: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
8700: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
8710: 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
8720: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
8730: 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
8740: 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
8750: 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
8760: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
8770: 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61  g[] array..** Ma
8780: 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e  ke additional en
8790: 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61  tries to the pPa
87a0: 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
87b0: 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
87c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
87d0: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
87e0: 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
87f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
8800: 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
8810: 65 64 20 62 79 20 73 71 6c 69 74 65 45 78 70 72  ed by sqliteExpr
8820: 52 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64  ResolveIds() and
8830: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
8840: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72  ()..**.** If err
8850: 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65  ors are seen, le
8860: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
8870: 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20  sage in zErrMsg 
8880: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  and return.** th
8890: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
88a0: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
88b0: 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  eExprAnalyzeAggr
88c0: 65 67 61 74 65 73 28 50 61 72 73 65 20 2a 70 50  egates(Parse *pP
88d0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
88e0: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41  r){.  int i;.  A
88f0: 67 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20 20  ggExpr *aAgg;.  
8900: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
8910: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
8920: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
8930: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
8940: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
8950: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67  UMN: {.      aAg
8960: 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  g = pParse->aAgg
8970: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
8980: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
8990: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
89a0: 66 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  f( aAgg[i].isAgg
89b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
89c0: 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d       if( aAgg[i]
89d0: 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d  .pExpr->iTable==
89e0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20  pExpr->iTable.  
89f0: 20 20 20 20 20 20 20 26 26 20 61 41 67 67 5b 69         && aAgg[i
8a00: 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
8a10: 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
8a20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
8a30: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
8a40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8a50: 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67   i>=pParse->nAgg
8a60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
8a70: 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50  appendAggInfo(pP
8a80: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
8a90: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
8aa0: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
8ab0: 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
8ac0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
8ad0: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45  arse->aAgg[i].pE
8ae0: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
8af0: 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72     }.      pExpr
8b00: 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20  ->iAgg = i;.    
8b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8b20: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
8b30: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
8b40: 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e   aAgg = pParse->
8b50: 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  aAgg;.      for(
8b60: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
8b70: 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
8b80: 20 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d 2e     if( !aAgg[i].
8b90: 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
8ba0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
8bb0: 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28  liteExprCompare(
8bc0: 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70  aAgg[i].pExpr, p
8bd0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
8be0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8bf0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8c00: 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d    if( i>=pParse-
8c10: 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  >nAgg ){.       
8c20: 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e   i = appendAggIn
8c30: 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  fo(pParse);.    
8c40: 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65      if( i<0 ) re
8c50: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
8c60: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
8c70: 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  isAgg = 1;.     
8c80: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
8c90: 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  i].pExpr = pExpr
8ca0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8cb0: 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20  ->aAgg[i].pFunc 
8cc0: 3d 20 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63  = sqliteFindFunc
8cd0: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
8ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45  .             pE
8cf0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
8d00: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20  xpr->token.n,.  
8d10: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8d20: 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  ->pList ? pExpr-
8d30: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  >pList->nExpr : 
8d40: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
8d50: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
8d60: 20 3d 20 69 3b 0a 20 20 20 20 20 20 62 72 65 61   = i;.      brea
8d70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
8d80: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  ault: {.      if
8d90: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
8da0: 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d  {.        nErr =
8db0: 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
8dc0: 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
8dd0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
8de0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
8df0: 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26    if( nErr==0 &&
8e00: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
8e10: 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d  {.        nErr =
8e20: 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
8e30: 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
8e40: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
8e50: 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ht);.      }.   
8e60: 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26     if( nErr==0 &
8e70: 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29  & pExpr->pList )
8e80: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  {.        int n 
8e90: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
8ea0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  nExpr;.        i
8eb0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
8ec0: 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26  r(i=0; nErr==0 &
8ed0: 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  & i<n; i++){.   
8ee0: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
8ef0: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
8f00: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
8f10: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
8f20: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
8f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8f40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8f50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
8f60: 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Err;.}../*.** Lo
8f70: 63 61 74 65 20 61 20 75 73 65 72 20 66 75 6e 63  cate a user func
8f80: 74 69 6f 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d  tion given a nam
8f90: 65 20 61 6e 64 20 61 20 6e 75 6d 62 65 72 20 6f  e and a number o
8fa0: 66 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20  f arguments..** 
8fb0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
8fc0: 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20   to the FuncDef 
8fd0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
8fe0: 65 66 69 6e 65 73 20 74 68 61 74 0a 2a 2a 20 66  efines that.** f
8ff0: 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75  unction, or retu
9000: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
9010: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
9020: 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   exist..**.** If
9030: 20 74 68 65 20 63 72 65 61 74 65 46 6c 61 67 20   the createFlag 
9040: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
9050: 2c 20 74 68 65 6e 20 61 20 6e 65 77 20 28 62 6c  , then a new (bl
9060: 61 6e 6b 29 20 46 75 6e 63 44 65 66 0a 2a 2a 20  ank) FuncDef.** 
9070: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
9080: 61 74 65 64 20 61 6e 64 20 6c 69 6b 65 64 20 69  ated and liked i
9090: 6e 74 6f 20 74 68 65 20 22 64 62 22 20 73 74 72  nto the "db" str
90a0: 75 63 74 75 72 65 20 69 66 20 61 0a 2a 2a 20 6e  ucture if a.** n
90b0: 6f 20 6d 61 74 63 68 69 6e 67 20 66 75 6e 63 74  o matching funct
90c0: 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 65  ion previously e
90d0: 78 69 73 74 65 64 2e 20 20 57 68 65 6e 20 63 72  xisted.  When cr
90e0: 65 61 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  eateFlag is true
90f0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 41 72 67  .** and the nArg
9100: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 2d 31   parameter is -1
9110: 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 61 20 66 75  , then only a fu
9120: 6e 63 74 69 6f 6e 20 74 68 61 74 20 61 63 63 65  nction that acce
9130: 70 74 73 0a 2a 2a 20 61 6e 79 20 6e 75 6d 62 65  pts.** any numbe
9140: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77  r of arguments w
9150: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
9160: 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74 65  .**.** If create
9170: 46 6c 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e  Flag is false an
9180: 64 20 6e 41 72 67 20 69 73 20 2d 31 2c 20 74 68  d nArg is -1, th
9190: 65 6e 20 74 68 65 20 66 69 72 73 74 20 76 61 6c  en the first val
91a0: 69 64 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  id.** function f
91b0: 6f 75 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64  ound is returned
91c0: 2e 20 20 41 20 66 75 6e 63 74 69 6f 6e 20 69 73  .  A function is
91d0: 20 76 61 6c 69 64 20 69 66 20 65 69 74 68 65 72   valid if either
91e0: 20 78 46 75 6e 63 0a 2a 2a 20 6f 72 20 78 53 74   xFunc.** or xSt
91f0: 65 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  ep is non-zero..
9200: 2a 2f 0a 46 75 6e 63 44 65 66 20 2a 73 71 6c 69  */.FuncDef *sqli
9210: 74 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a  teFindFunction(.
9220: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20    sqlite *db,   
9230: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20       /* An open 
9240: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
9250: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
9260: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
9270: 66 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e  function.  Not n
9280: 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a  ull-terminated *
9290: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20  /.  int nName,  
92a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
92b0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
92c0: 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  n the name */.  
92d0: 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
92e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
92f0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d  arguments.  -1 m
9300: 65 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72 20  eans any number 
9310: 2a 2f 0a 20 20 69 6e 74 20 63 72 65 61 74 65 46  */.  int createF
9320: 6c 61 67 20 20 20 20 20 2f 2a 20 43 72 65 61 74  lag     /* Creat
9330: 65 20 6e 65 77 20 65 6e 74 72 79 20 69 66 20 74  e new entry if t
9340: 72 75 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  rue and does not
9350: 20 6f 74 68 65 72 77 69 73 65 20 65 78 69 73 74   otherwise exist
9360: 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66   */.){.  FuncDef
9370: 20 2a 70 46 69 72 73 74 2c 20 2a 70 2c 20 2a 70   *pFirst, *p, *p
9380: 4d 61 79 62 65 3b 0a 20 20 70 46 69 72 73 74 20  Maybe;.  pFirst 
9390: 3d 20 70 20 3d 20 28 46 75 6e 63 44 65 66 2a 29  = p = (FuncDef*)
93a0: 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26  sqliteHashFind(&
93b0: 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65  db->aFunc, zName
93c0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , nName);.  if( 
93d0: 70 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67  p && !createFlag
93e0: 20 26 26 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20   && nArg<0 ){.  
93f0: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
9400: 3e 78 46 75 6e 63 3d 3d 30 20 26 26 20 70 2d 3e  >xFunc==0 && p->
9410: 78 53 74 65 70 3d 3d 30 20 29 7b 20 70 20 3d 20  xStep==0 ){ p = 
9420: 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20  p->pNext; }.    
9430: 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20  return p;.  }.  
9440: 70 4d 61 79 62 65 20 3d 20 30 3b 0a 20 20 77 68  pMaybe = 0;.  wh
9450: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 41 72  ile( p && p->nAr
9460: 67 21 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69  g!=nArg ){.    i
9470: 66 28 20 70 2d 3e 6e 41 72 67 3c 30 20 26 26 20  f( p->nArg<0 && 
9480: 21 63 72 65 61 74 65 46 6c 61 67 20 26 26 20 28  !createFlag && (
9490: 70 2d 3e 78 46 75 6e 63 20 7c 7c 20 70 2d 3e 78  p->xFunc || p->x
94a0: 53 74 65 70 29 20 29 20 70 4d 61 79 62 65 20 3d  Step) ) pMaybe =
94b0: 20 70 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   p;.    p = p->p
94c0: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
94d0: 70 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67  p && !createFlag
94e0: 20 26 26 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   && p->xFunc==0 
94f0: 26 26 20 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29  && p->xStep==0 )
9500: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
9510: 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20 26    }.  if( p==0 &
9520: 26 20 70 4d 61 79 62 65 20 29 7b 0a 20 20 20 20  & pMaybe ){.    
9530: 61 73 73 65 72 74 28 20 63 72 65 61 74 65 46 6c  assert( createFl
9540: 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ag==0 );.    ret
9550: 75 72 6e 20 70 4d 61 79 62 65 3b 0a 20 20 7d 0a  urn pMaybe;.  }.
9560: 20 20 69 66 28 20 70 3d 3d 30 20 26 26 20 63 72    if( p==0 && cr
9570: 65 61 74 65 46 6c 61 67 20 26 26 20 28 70 20 3d  eateFlag && (p =
9580: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
9590: 7a 65 6f 66 28 2a 70 29 29 29 21 3d 30 20 29 7b  zeof(*p)))!=0 ){
95a0: 0a 20 20 20 20 70 2d 3e 6e 41 72 67 20 3d 20 6e  .    p->nArg = n
95b0: 41 72 67 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  Arg;.    p->pNex
95c0: 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
95d0: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
95e0: 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61  (&db->aFunc, zNa
95f0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 28 76 6f 69 64  me, nName, (void
9600: 2a 29 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  *)p);.  }.  retu
9610: 72 6e 20 70 3b 0a 7d 0a                          rn p;.}.