/ Hex Artifact Content
Login

Artifact 1a7a2f5f2b7dd37659783cdb6efaac74a092ba71:


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 36 34 20 32 30 30 32 2f 30 35 2f 32 36 20 32  .64 2002/05/26 2
0220: 30 3a 35 34 3a 33 33 20 64 72 68 20 45 78 70 20  0:54:33 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 2c 20 49 44 2c 20 61 6e 64 20 73 6f  list, ID, and so
1450: 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72  urce lists retur
1460: 6e 20 62 79 20 73 71 6c 69 74 65 45 78 70 72 4c  n by sqliteExprL
1470: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
1480: 69 74 65 49 64 4c 69 73 74 44 75 70 28 29 2c 20  iteIdListDup(), 
1490: 61 6e 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73  and sqliteSrcLis
14a0: 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62  tDup() can not b
14b0: 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64  e further expand
14c0: 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71  ed .** by subseq
14d0: 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
14e0: 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28  lite*ListAppend(
14f0: 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a  ) routines..**.*
1500: 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61  * Any tables tha
1510: 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69  t the SrcList mi
1520: 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65  ght point to are
1530: 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e   not duplicated.
1540: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
1550: 45 78 70 72 44 75 70 28 45 78 70 72 20 2a 70 29  ExprDup(Expr *p)
1560: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
1570: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1580: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
1590: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
15a0: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
15b0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
15c0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  rn 0;.  pNew->op
15d0: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
15e0: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
15f0: 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 65 66 74  ExprDup(p->pLeft
1600: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68  );.  pNew->pRigh
1610: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75  t = sqliteExprDu
1620: 70 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  p(p->pRight);.  
1630: 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71  pNew->pList = sq
1640: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
1650: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65  p->pList);.  pNe
1660: 77 2d 3e 69 54 61 62 6c 65 20 3d 20 70 2d 3e 69  w->iTable = p->i
1670: 54 61 62 6c 65 3b 0a 20 20 70 4e 65 77 2d 3e 69  Table;.  pNew->i
1680: 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 69 43 6f 6c  Column = p->iCol
1690: 75 6d 6e 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67  umn;.  pNew->iAg
16a0: 67 20 3d 20 70 2d 3e 69 41 67 67 3b 0a 20 20 70  g = p->iAgg;.  p
16b0: 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 70 2d 3e  New->token = p->
16c0: 74 6f 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d 3e 73  token;.  pNew->s
16d0: 70 61 6e 20 3d 20 70 2d 3e 73 70 61 6e 3b 0a 20  pan = p->span;. 
16e0: 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d   pNew->pSelect =
16f0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70   sqliteSelectDup
1700: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
1710: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 45  return pNew;.}.E
1720: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 45  xprList *sqliteE
1730: 78 70 72 4c 69 73 74 44 75 70 28 45 78 70 72 4c  xprListDup(ExprL
1740: 69 73 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c  ist *p){.  ExprL
1750: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
1760: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
1770: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
1780: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
1790: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
17a0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
17b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
17c0: 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 2d 3e  New->nExpr = p->
17d0: 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61  nExpr;.  pNew->a
17e0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
17f0: 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66   p->nExpr*sizeof
1800: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
1810: 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 20  f( pNew->a==0 ) 
1820: 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
1830: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
1840: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d   i++){.    pNew-
1850: 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71  >a[i].pExpr = sq
1860: 6c 69 74 65 45 78 70 72 44 75 70 28 70 2d 3e 61  liteExprDup(p->a
1870: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1880: 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pNew->a[i].zName
1890: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
18a0: 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  p->a[i].zName);.
18b0: 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 73      pNew->a[i].s
18c0: 6f 72 74 4f 72 64 65 72 20 3d 20 70 2d 3e 61 5b  ortOrder = p->a[
18d0: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
18e0: 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 69 73 41    pNew->a[i].isA
18f0: 67 67 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73 41  gg = p->a[i].isA
1900: 67 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  gg;.    pNew->a[
1910: 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  i].done = 0;.  }
1920: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
1930: 7d 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  }.SrcList *sqlit
1940: 65 53 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c  eSrcListDup(SrcL
1950: 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ist *p){.  SrcLi
1960: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
1970: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
1980: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
1990: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
19a0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
19b0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
19c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
19d0: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 2d 3e 6e 53  ew->nSrc = p->nS
19e0: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  rc;.  pNew->a = 
19f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d  sqliteMalloc( p-
1a00: 3e 6e 53 72 63 2a 73 69 7a 65 6f 66 28 70 2d 3e  >nSrc*sizeof(p->
1a10: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
1a20: 4e 65 77 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75  New->a==0 ) retu
1a30: 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 0;.  for(i=0;
1a40: 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29   i<p->nSrc; i++)
1a50: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d  {.    pNew->a[i]
1a60: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  .zName = sqliteS
1a70: 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e  trDup(p->a[i].zN
1a80: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ame);.    pNew->
1a90: 61 5b 69 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71  a[i].zAlias = sq
1aa0: 6c 69 74 65 53 74 72 44 75 70 28 70 2d 3e 61 5b  liteStrDup(p->a[
1ab0: 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  i].zAlias);.    
1ac0: 70 4e 65 77 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74  pNew->a[i].joint
1ad0: 79 70 65 20 3d 20 70 2d 3e 61 5b 69 5d 2e 6a 6f  ype = p->a[i].jo
1ae0: 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77  intype;.    pNew
1af0: 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b  ->a[i].pTab = 0;
1b00: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e  .    pNew->a[i].
1b10: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
1b20: 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 61 5b 69  SelectDup(p->a[i
1b30: 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ].pSelect);.    
1b40: 70 4e 65 77 2d 3e 61 5b 69 5d 2e 70 4f 6e 20 3d  pNew->a[i].pOn =
1b50: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
1b60: 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20  ->a[i].pOn);.   
1b70: 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 70 55 73 69   pNew->a[i].pUsi
1b80: 6e 67 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73  ng = sqliteIdLis
1b90: 74 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 70 55 73  tDup(p->a[i].pUs
1ba0: 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ing);.  }.  retu
1bb0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
1bc0: 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 44  t *sqliteIdListD
1bd0: 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  up(IdList *p){. 
1be0: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
1bf0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
1c00: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1c10: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
1c20: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
1c30: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
1c40: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
1c50: 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70  .  pNew->nId = p
1c60: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
1c70: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1c80: 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70   p->nId*sizeof(p
1c90: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
1ca0: 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 20 72 65   pNew->a==0 ) re
1cb0: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
1cc0: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
1cd0: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69  ){.    pNew->a[i
1ce0: 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
1cf0: 53 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a  StrDup(p->a[i].z
1d00: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Name);.    pNew-
1d10: 3e 61 5b 69 5d 2e 69 64 78 20 3d 20 70 2d 3e 61  >a[i].idx = p->a
1d20: 5b 69 5d 2e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  [i].idx;.  }.  r
1d30: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
1d40: 6c 65 63 74 20 2a 73 71 6c 69 74 65 53 65 6c 65  lect *sqliteSele
1d50: 63 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29  ctDup(Select *p)
1d60: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
1d70: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1d80: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
1d90: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1da0: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
1db0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
1dc0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
1dd0: 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
1de0: 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e  isDistinct;.  pN
1df0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
1e00: 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70  iteExprListDup(p
1e10: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65  ->pEList);.  pNe
1e20: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
1e30: 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70 53  SrcListDup(p->pS
1e40: 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68  rc);.  pNew->pWh
1e50: 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ere = sqliteExpr
1e60: 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  Dup(p->pWhere);.
1e70: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
1e80: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
1e90: 74 44 75 70 28 70 2d 3e 70 47 72 6f 75 70 42 79  tDup(p->pGroupBy
1ea0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  );.  pNew->pHavi
1eb0: 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  ng = sqliteExprD
1ec0: 75 70 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  up(p->pHaving);.
1ed0: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
1ee0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
1ef0: 74 44 75 70 28 70 2d 3e 70 4f 72 64 65 72 42 79  tDup(p->pOrderBy
1f00: 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  );.  pNew->op = 
1f10: 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70  p->op;.  pNew->p
1f20: 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 53 65  Prior = sqliteSe
1f30: 6c 65 63 74 44 75 70 28 70 2d 3e 70 50 72 69 6f  lectDup(p->pPrio
1f40: 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d  r);.  pNew->nLim
1f50: 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a  it = p->nLimit;.
1f60: 20 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20    pNew->nOffset 
1f70: 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20  = p->nOffset;.  
1f80: 70 4e 65 77 2d 3e 7a 53 65 6c 65 63 74 20 3d 20  pNew->zSelect = 
1f90: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  0;.  return pNew
1fa0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ;.}.../*.** Add 
1fb0: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1fc0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
1fd0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
1fe0: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
1ff0: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
2000: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
2010: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
2020: 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  t..*/.ExprList *
2030: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
2040: 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20 2a 70  pend(ExprList *p
2050: 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70  List, Expr *pExp
2060: 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  r, Token *pName)
2070: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
2080: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
2090: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
20a0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78  alloc( sizeof(Ex
20b0: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
20c0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
20d0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
20e0: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20  elete(pExpr);.  
20f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2100: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
2110: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 37 29  List->nExpr & 7)
2120: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
2130: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   = pList->nExpr 
2140: 2b 20 38 3b 0a 20 20 20 20 73 74 72 75 63 74 20  + 8;.    struct 
2150: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
2160: 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65  ;.    a = sqlite
2170: 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61  Realloc(pList->a
2180: 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  , n*sizeof(pList
2190: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
21a0: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
21b0: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
21c0: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72  (pExpr);.      r
21d0: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20  eturn pList;.   
21e0: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
21f0: 3d 20 61 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = a;.  }.  if( p
2200: 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b  Expr || pName ){
2210: 0a 20 20 20 20 69 20 3d 20 70 4c 69 73 74 2d 3e  .    i = pList->
2220: 6e 45 78 70 72 2b 2b 3b 0a 20 20 20 20 70 4c 69  nExpr++;.    pLi
2230: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
2240: 20 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 69 73   pExpr;.    pLis
2250: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
2260: 30 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65  0;.    if( pName
2270: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2280: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73  SetNString(&pLis
2290: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
22a0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
22b0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  n, 0);.      sql
22c0: 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74  iteDequote(pList
22d0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
22e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22f0: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
2300: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
2310: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  re expression li
2320: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
2330: 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  teExprListDelete
2340: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
2350: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
2360: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
2370: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
2380: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
2390: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
23a0: 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73 74  ExprDelete(pList
23b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
23c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
23d0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
23e0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
23f0: 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
2400: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
2410: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
2420: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2430: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
2440: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
2450: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
2460: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
2470: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 2e 0a  lves variables..
2480: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
2490: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
24a0: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
24b0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
24c0: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
24d0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
24e0: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
24f0: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
2500: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
2510: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
2520: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78  .*/.int sqliteEx
2530: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  prIsConstant(Exp
2540: 72 20 2a 70 29 7b 0a 20 20 73 77 69 74 63 68 28  r *p){.  switch(
2550: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
2560: 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61  se TK_ID:.    ca
2570: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
2580: 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20    case TK_DOT:. 
2590: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
25a0: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
25b0: 47 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  G:.      return 
25c0: 70 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27  p->token.z[0]=='
25d0: 5c 27 27 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  \'';.    case TK
25e0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
25f0: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
2600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2610: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
2620: 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26    if( p->pLeft &
2630: 26 20 21 73 71 6c 69 74 65 45 78 70 72 49 73 43  & !sqliteExprIsC
2640: 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 65 66 74  onstant(p->pLeft
2650: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
2660: 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68      if( p->pRigh
2670: 74 20 26 26 20 21 73 71 6c 69 74 65 45 78 70 72  t && !sqliteExpr
2680: 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 52  IsConstant(p->pR
2690: 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30  ight) ) return 0
26a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
26b0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
26c0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
26d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 4c 69  or(i=0; i<p->pLi
26e0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
26f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2700: 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73  sqliteExprIsCons
2710: 74 61 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e 61  tant(p->pList->a
2720: 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 72 65 74  [i].pExpr) ) ret
2730: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
2740: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2750: 65 74 75 72 6e 20 70 2d 3e 70 4c 65 66 74 21 3d  eturn p->pLeft!=
2760: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 21 3d  0 || p->pRight!=
2770: 30 20 7c 7c 20 28 70 2d 3e 70 4c 69 73 74 20 26  0 || (p->pList &
2780: 26 20 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  & p->pList->nExp
2790: 72 3e 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  r>0);.    }.  }.
27a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
27b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
27c0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   if the given st
27d0: 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64  ring is a row-id
27e0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f   column name..*/
27f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
2800: 74 65 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20  teIsRowid(const 
2810: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20  char *z){.  if( 
2820: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c  sqliteStrICmp(z,
2830: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
2840: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
2850: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
2860: 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20  , "ROWID")==0 ) 
2870: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
2880: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c  sqliteStrICmp(z,
2890: 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74   "OID")==0 ) ret
28a0: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
28b0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
28c0: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61   routine walks a
28d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
28e0: 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72  e and resolves r
28f0: 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20  eferences to.** 
2900: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20  table columns.  
2910: 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72  Nodes of the for
2920: 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65  m ID.ID or ID re
2930: 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a  solve into an.**
2940: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61   index to the ta
2950: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
2960: 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75   list and a colu
2970: 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20  mn offset.  The 
2980: 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20  .** Expr.opcode 
2990: 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69  for such nodes i
29a0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
29b0: 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70  COLUMN.  The Exp
29c0: 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  r.iTable.** valu
29d0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
29e0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
29f0: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
2a00: 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a  e in pTabList.**
2a10: 20 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22   plus the "base"
2a20: 20 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73   value.  The bas
2a30: 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74  e value will ult
2a40: 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74  imately become t
2a50: 68 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f  he.** VDBE curso
2a60: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63  r number for a c
2a70: 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f  ursor that is po
2a80: 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20  inting into the 
2a90: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61  referenced.** ta
2aa0: 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ble.  The Expr.i
2ab0: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20  Column value is 
2ac0: 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69  changed to the i
2ad0: 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
2ae0: 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  mn .** of the re
2af0: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20  ferenced table. 
2b00: 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d   The Expr.iColum
2b10: 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  n value for the 
2b20: 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44  special.** ROWID
2b30: 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20   column is -1.  
2b40: 41 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d  Any INTEGER PRIM
2b50: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69  ARY KEY column i
2b60: 73 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a  s tried as an.**
2b70: 20 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44   alias for ROWID
2b80: 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 6c 73 6f 20  ..**.** We also 
2b90: 63 68 65 63 6b 20 66 6f 72 20 69 6e 73 74 61 6e  check for instan
2ba0: 63 65 73 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ces of the IN op
2bb0: 65 72 61 74 6f 72 2e 20 20 49 4e 20 63 6f 6d 65  erator.  IN come
2bc0: 73 20 69 6e 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d  s in two.** form
2bd0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
2be0: 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
2bf0: 6c 69 73 74 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20  list).** and.** 
2c00: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 20 49            expr I
2c10: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  N (SELECT ...).*
2c20: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66  *.** The first f
2c30: 6f 72 6d 20 69 73 20 68 61 6e 64 6c 65 64 20 62  orm is handled b
2c40: 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  y creating a set
2c50: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6c 69 73   holding the lis
2c60: 74 0a 2a 2a 20 6f 66 20 61 6c 6c 6f 77 65 64 20  t.** of allowed 
2c70: 76 61 6c 75 65 73 2e 20 20 54 68 65 20 73 65 63  values.  The sec
2c80: 6f 6e 64 20 66 6f 72 6d 20 63 61 75 73 65 73 20  ond form causes 
2c90: 74 68 65 20 53 45 4c 45 43 54 20 74 6f 20 67 65  the SELECT to ge
2ca0: 6e 65 72 61 74 65 20 0a 2a 2a 20 61 20 74 65 6d  nerate .** a tem
2cb0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 2a 2a  porary table..**
2cc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2cd0: 20 61 6c 73 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20   also looks for 
2ce0: 73 63 61 6c 61 72 20 53 45 4c 45 43 54 73 20 74  scalar SELECTs t
2cf0: 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20  hat are part of 
2d00: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
2d10: 2a 20 49 66 20 69 74 20 66 69 6e 64 73 20 61 6e  * If it finds an
2d20: 79 2c 20 69 74 20 67 65 6e 65 72 61 74 65 73 20  y, it generates 
2d30: 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68  code to write th
2d40: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20  e value of that 
2d50: 73 65 6c 65 63 74 0a 2a 2a 20 69 6e 74 6f 20 61  select.** into a
2d60: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a   memory cell..**
2d70: 0a 2a 2a 20 55 6e 6b 6e 6f 77 6e 20 63 6f 6c 75  .** Unknown colu
2d80: 6d 6e 73 20 6f 72 20 74 61 62 6c 65 73 20 70 72  mns or tables pr
2d90: 6f 76 6f 6b 65 20 61 6e 20 65 72 72 6f 72 2e 20  ovoke an error. 
2da0: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   The function re
2db0: 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  turns.** the num
2dc0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
2dd0: 65 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 61 6e  en and leaves an
2de0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f   error message o
2df0: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
2e00: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
2e10: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 0a  ExprResolveIds(.
2e20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2e30: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2e40: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2e50: 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20  int base,       
2e60: 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
2e70: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72  r number for fir
2e80: 73 74 20 65 6e 74 72 79 20 69 6e 20 70 54 61 62  st entry in pTab
2e90: 4c 69 73 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  List */.  SrcLis
2ea0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 2f 2a 20  t *pTabList, /* 
2eb0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 75  List of tables u
2ec0: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 63  sed to resolve c
2ed0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
2ee0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2ef0: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65  t,  /* List of e
2f00: 78 70 72 65 73 73 69 6f 6e 73 20 75 73 65 64 20  xpressions used 
2f10: 74 6f 20 72 65 73 6f 6c 76 65 20 22 41 53 22 20  to resolve "AS" 
2f20: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
2f30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
2f40: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
2f50: 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a  analyzed. */.){.
2f60: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
2f70: 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 20  | pTabList==0 ) 
2f80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
2f90: 72 74 28 20 62 61 73 65 2b 70 54 61 62 4c 69 73  rt( base+pTabLis
2fa0: 74 2d 3e 6e 53 72 63 3c 3d 70 50 61 72 73 65 2d  t->nSrc<=pParse-
2fb0: 3e 6e 54 61 62 20 29 3b 0a 20 20 73 77 69 74 63  >nTab );.  switc
2fc0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
2fd0: 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75      /* Double-qu
2fe0: 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78  oted strings (ex
2ff0: 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65  : "abc") are use
3000: 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73  d as identifiers
3010: 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69   if.    ** possi
3020: 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ble.  Otherwise 
3030: 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73  they remain as s
3040: 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d  trings.  Single-
3050: 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74  quoted.    ** st
3060: 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27  rings (ex: 'abc'
3070: 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72  ) are always str
3080: 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20  ing literals..  
3090: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
30a0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
30b0: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
30c0: 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62  n.z[0]=='\'' ) b
30d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46  reak;.      /* F
30e0: 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
30f0: 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20  e TK_ID case if 
3100: 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65  this is a double
3110: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a  -quoted string *
3120: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  /.    }.    /* A
3130: 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72   lone identifier
3140: 2e 20 20 54 72 79 20 61 6e 64 20 6d 61 74 63 68  .  Try and match
3150: 20 69 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   it as follows:.
3160: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
3170: 20 20 31 2e 20 20 54 6f 20 74 68 65 20 6e 61 6d    1.  To the nam
3180: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66  e of a column of
3190: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
31a0: 65 73 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 20  es in pTabList. 
31b0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
31c0: 20 32 2e 20 20 54 6f 20 74 68 65 20 72 69 67 68   2.  To the righ
31d0: 74 20 73 69 64 65 20 6f 66 20 61 6e 20 41 53 20  t side of an AS 
31e0: 6b 65 79 77 6f 72 64 20 69 6e 20 74 68 65 20 63  keyword in the c
31f0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 6f 66 0a 20 20  olumn list of.  
3200: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 61 20 53    **         a S
3210: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
3220: 20 20 28 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20    (For example, 
3230: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 27 78  match against 'x
3240: 27 20 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  ' in.    **     
3250: 20 20 20 20 22 53 45 4c 45 43 54 20 61 2b 62 20      "SELECT a+b 
3260: 41 53 20 27 78 27 20 46 52 4f 4d 20 74 31 22 2e  AS 'x' FROM t1".
3270: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
3280: 20 20 20 20 33 2e 20 20 4f 6e 65 20 6f 66 20 74      3.  One of t
3290: 68 65 20 73 70 65 63 69 61 6c 20 6e 61 6d 65 73  he special names
32a0: 20 22 52 4f 57 49 44 22 2c 20 22 4f 49 44 22 2c   "ROWID", "OID",
32b0: 20 6f 72 20 22 5f 52 4f 57 49 44 5f 22 2e 0a 20   or "_ROWID_".. 
32c0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
32d0: 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_ID: {.      in
32e0: 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  t cnt = 0;      
32f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
3300: 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ches */.      in
3310: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
3320: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
3330: 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
3340: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3350: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  pExpr->token.z )
3360: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  ;.      z = sqli
3370: 74 65 53 74 72 4e 44 75 70 28 70 45 78 70 72 2d  teStrNDup(pExpr-
3380: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
3390: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
33a0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
33b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d  );.      if( z==
33c0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
33d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
33e0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
33f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
3400: 20 6a 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c   j;.        Tabl
3410: 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69  e *pTab = pTabLi
3420: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20  st->a[i].pTab;. 
3430: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d         if( pTab=
3440: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
3450: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
3460: 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20  Tab->nCol>0 );. 
3470: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
3480: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
3490: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
34a0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
34b0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
34c0: 61 6d 65 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20  ame, z)==0 ){.  
34d0: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
34e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
34f0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 2b  pr->iTable = i +
3500: 20 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20   base;.         
3510: 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e     if( j==pTab->
3520: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
3530: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69         /* Substi
3540: 74 75 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  tute the record 
3550: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 49  number for the I
3560: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
3570: 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  EY */.          
3580: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
3590: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
35a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
35b0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
35c0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  >iColumn = j;.  
35d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35e0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
35f0: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
3600: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3610: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3620: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26     if( cnt==0 &&
3630: 20 70 45 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20   pEList!=0 ){.  
3640: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
3650: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3660: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
3670: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
3680: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
3690: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
36a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73           if( zAs
36b0: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 53 74 72  !=0 && sqliteStr
36c0: 49 43 6d 70 28 7a 41 73 2c 20 7a 29 3d 3d 30 20  ICmp(zAs, z)==0 
36d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
36e0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
36f0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
3700: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
3710: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
3720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
3730: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a  pr->op = TK_AS;.
3740: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
3750: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  r->iColumn = j;.
3760: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
3770: 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
3780: 65 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  eExprDup(pEList-
3790: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[j].pExpr);.  
37a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37b0: 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 20 20 20    } .      }.   
37c0: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26     if( cnt==0 &&
37d0: 20 73 71 6c 69 74 65 49 73 52 6f 77 69 64 28 7a   sqliteIsRowid(z
37e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  ) ){.        pEx
37f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31  pr->iColumn = -1
3800: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
3810: 3e 69 54 61 62 6c 65 20 3d 20 62 61 73 65 3b 0a  >iTable = base;.
3820: 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 20          cnt = 1 
3830: 2b 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  + (pTabList->nSr
3840: 63 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 70 45  c>1);.        pE
3850: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
3860: 55 4d 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UMN;.      }.   
3870: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
3880: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d  ;.      if( cnt=
3890: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 74 6f 6b  =0 && pExpr->tok
38a0: 65 6e 2e 7a 5b 30 5d 21 3d 27 22 27 20 29 7b 0a  en.z[0]!='"' ){.
38b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
38c0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
38d0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
38e0: 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 22 2c 20 2d  uch column: ", -
38f0: 31 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 70  1,  .          p
3900: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
3910: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30  Expr->token.n, 0
3920: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
3930: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3940: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3950: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6e 74     }else if( cnt
3960: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >1 ){.        sq
3970: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
3980: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
3990: 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75   "ambiguous colu
39a0: 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 2d 31 2c 20  mn name: ", -1, 
39b0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70   .          pExp
39c0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
39d0: 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a  r->token.n, 0);.
39e0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
39f0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
3a00: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3a10: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 0a  }.      break; .
3a20: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
3a30: 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  A table name and
3a40: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 49   column name:  I
3a50: 44 2e 49 44 20 2a 2f 0a 20 20 20 20 63 61 73 65  D.ID */.    case
3a60: 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_DOT: {.     
3a70: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20   int cnt = 0;   
3a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3a90: 62 65 72 20 6f 66 20 6d 61 74 63 68 65 73 20 2a  ber of matches *
3aa0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 54  /.      int cntT
3ab0: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
3ac0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
3ad0: 74 63 68 69 6e 67 20 74 61 62 6c 65 73 20 2a 2f  tching tables */
3ae0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b00: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
3b10: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
3b20: 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 20 20  Left, *pRight;  
3b30: 20 20 2f 2a 20 4c 65 66 74 20 61 6e 64 20 72 69    /* Left and ri
3b40: 67 68 74 20 73 75 62 62 72 61 6e 63 68 65 73 20  ght subbranches 
3b50: 6f 66 20 74 68 65 20 65 78 70 72 20 2a 2f 0a 20  of the expr */. 
3b60: 20 20 20 20 20 63 68 61 72 20 2a 7a 4c 65 66 74       char *zLeft
3b70: 2c 20 2a 7a 52 69 67 68 74 3b 20 20 20 20 2f 2a  , *zRight;    /*
3b80: 20 54 65 78 74 20 6f 66 20 61 6e 20 69 64 65 6e   Text of an iden
3b90: 74 69 66 69 65 72 20 2a 2f 0a 0a 20 20 20 20 20  tifier */..     
3ba0: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
3bb0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 69  pLeft;.      pRi
3bc0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
3bd0: 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
3be0: 74 28 20 70 4c 65 66 74 20 26 26 20 70 4c 65 66  t( pLeft && pLef
3bf0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 26 26 20  t->op==TK_ID && 
3c00: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  pLeft->token.z )
3c10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3c20: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
3c30: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 26 26 20 70  ->op==TK_ID && p
3c40: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  Right->token.z )
3c50: 3b 0a 20 20 20 20 20 20 7a 4c 65 66 74 20 3d 20  ;.      zLeft = 
3c60: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4c  sqliteStrNDup(pL
3c70: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c  eft->token.z, pL
3c80: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  eft->token.n);. 
3c90: 20 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71       zRight = sq
3ca0: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 52 69 67  liteStrNDup(pRig
3cb0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69  ht->token.z, pRi
3cc0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  ght->token.n);. 
3cd0: 20 20 20 20 20 69 66 28 20 7a 4c 65 66 74 3d 3d       if( zLeft==
3ce0: 30 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 20 29  0 || zRight==0 )
3cf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3d00: 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 20  Free(zLeft);.   
3d10: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
3d20: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  zRight);.       
3d30: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
3d40: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44   }.      sqliteD
3d50: 65 71 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20  equote(zLeft);. 
3d60: 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f       sqliteDequo
3d70: 74 65 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  te(zRight);.    
3d80: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
3d90: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 66 6f 72 28  = -1;.      for(
3da0: 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
3db0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
3dc0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
3dd0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a      char *zTab;.
3de0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
3df0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
3e00: 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[i].pTab;.     
3e10: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
3e20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
3e30: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
3e40: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  >nCol>0 );.     
3e50: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
3e60: 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 20 29 7b 0a  >a[i].zAlias ){.
3e70: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d            zTab =
3e80: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
3e90: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
3ea0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3eb0: 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e   zTab = pTab->zN
3ec0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
3ed0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 3d         if( zTab=
3ee0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 53 74 72 49  =0 || sqliteStrI
3ef0: 43 6d 70 28 7a 54 61 62 2c 20 7a 4c 65 66 74 29  Cmp(zTab, zLeft)
3f00: 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
3f10: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28          if( 0==(
3f20: 63 6e 74 54 61 62 2b 2b 29 20 29 20 70 45 78 70  cntTab++) ) pExp
3f30: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 2b 20  r->iTable = i + 
3f40: 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  base;.        fo
3f50: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
3f60: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
3f70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
3f80: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
3f90: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 52 69 67  l[j].zName, zRig
3fa0: 68 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ht)==0 ){.      
3fb0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
3fc0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
3fd0: 69 54 61 62 6c 65 20 3d 20 69 20 2b 20 62 61 73  iTable = i + bas
3fe0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
3ff0: 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  f( j==pTab->iPKe
4000: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
4010: 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
4020: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
4030: 65 72 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  er for the INTEG
4040: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
4050: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
4060: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
4070: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
4080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4090: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
40a0: 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
40b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
40c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
40d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
40e0: 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61  If we have not a
40f0: 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64 20  lready resolved 
4100: 74 68 69 73 20 2a 2e 2a 20 65 78 70 72 65 73 73  this *.* express
4110: 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 79 62 65 20  ion, then maybe 
4120: 0a 20 20 20 20 20 20 20 2a 20 69 74 20 69 73 20  .       * it is 
4130: 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  a new.* or old.*
4140: 20 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e   trigger argumen
4150: 74 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20  t reference */. 
4160: 20 20 20 20 20 69 66 28 20 63 6e 74 20 3d 3d 20       if( cnt == 
4170: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69  0 && pParse->tri
4180: 67 53 74 61 63 6b 20 21 3d 20 30 20 29 7b 0a 20  gStack != 0 ){. 
4190: 20 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74         TriggerSt
41a0: 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61  ack *pTriggerSta
41b0: 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69  ck = pParse->tri
41c0: 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  gStack;.        
41d0: 69 6e 74 20 74 20 3d 20 30 3b 0a 20 20 20 20 20  int t = 0;.     
41e0: 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53     if( pTriggerS
41f0: 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20  tack->newIdx != 
4200: 2d 31 20 26 26 20 73 71 6c 69 74 65 53 74 72 49  -1 && sqliteStrI
4210: 43 6d 70 28 22 6e 65 77 22 2c 20 7a 4c 65 66 74  Cmp("new", zLeft
4220: 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20  ) == 0 ){.      
4230: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
4240: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
4250: 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20  k->newIdx;.     
4260: 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20       cntTab++;. 
4270: 20 20 20 20 20 20 20 20 20 74 20 3d 20 31 3b 0a           t = 1;.
4280: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4290: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
42a0: 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d  ack->oldIdx != -
42b0: 31 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43  1 && sqliteStrIC
42c0: 6d 70 28 22 6f 6c 64 22 2c 20 7a 4c 65 66 74 29  mp("old", zLeft)
42d0: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20   == 0 ){.       
42e0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
42f0: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
4300: 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20  ->oldIdx;.      
4310: 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20      cntTab++;.  
4320: 20 20 20 20 20 20 20 20 74 20 3d 20 31 3b 0a 20          t = 1;. 
4330: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
4340: 20 20 69 66 28 20 74 20 29 7b 20 0a 09 20 20 69    if( t ){ ..  i
4350: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  nt j;.          
4360: 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20 70 54 72  for(j=0; j < pTr
4370: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
4380: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 20 7b 0a 20  ->nCol; j++) {. 
4390: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
43a0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 54 72  qliteStrICmp(pTr
43b0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
43c0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
43d0: 20 7a 52 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20   zRight)==0 ){. 
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74               cnt
43f0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
4400: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
4410: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
4420: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
4430: 09 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .}.      }..    
4440: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
4450: 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73 71 6c  cntTab==1 && sql
4460: 69 74 65 49 73 52 6f 77 69 64 28 7a 52 69 67 68  iteIsRowid(zRigh
4470: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e  t) ){.        cn
4480: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  t = 1;.        p
4490: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
44a0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
44b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 65    sqliteFree(zLe
44c0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
44d0: 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 20  eFree(zRight);. 
44e0: 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20       if( cnt==0 
44f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4500: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
4510: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e  rse->zErrMsg, "n
4520: 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 22  o such column: "
4530: 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20 20 20 20  , -1,  .        
4540: 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a    pLeft->token.z
4550: 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e  , pLeft->token.n
4560: 2c 20 22 2e 22 2c 20 31 2c 20 0a 20 20 20 20 20  , ".", 1, .     
4570: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b       pRight->tok
4580: 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e 74 6f  en.z, pRight->to
4590: 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ken.n, 0);.     
45a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
45b0: 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  +;.        retur
45c0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
45d0: 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a 20 20   if( cnt>1 ){.  
45e0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
45f0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
4600: 7a 45 72 72 4d 73 67 2c 20 22 61 6d 62 69 67 75  zErrMsg, "ambigu
4610: 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ous column name:
4620: 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20 20   ", -1,  .      
4630: 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e      pLeft->token
4640: 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  .z, pLeft->token
4650: 2e 6e 2c 20 22 2e 22 2c 20 31 2c 0a 20 20 20 20  .n, ".", 1,.    
4660: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f        pRight->to
4670: 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e 74  ken.z, pRight->t
4680: 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20  oken.n, 0);.    
4690: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
46a0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ++;.        retu
46b0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
46c0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
46d0: 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20  lete(pLeft);.   
46e0: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
46f0: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
4700: 65 45 78 70 72 44 65 6c 65 74 65 28 70 52 69 67  eExprDelete(pRig
4710: 68 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ht);.      pExpr
4720: 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  ->pRight = 0;.  
4730: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
4740: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
4750: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4760: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
4770: 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d  .      Vdbe *v =
4780: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
4790: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
47a0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
47b0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  1;.      if( sql
47c0: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
47d0: 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  s(pParse, base, 
47e0: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
47f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  , pExpr->pLeft) 
4800: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4810: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
4820: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
4830: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
4840: 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
4850: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
4860: 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
4870: 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
4880: 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
4890: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
48a0: 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
48b0: 20 61 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20   a temporary.   
48c0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20       ** table.  
48d0: 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
48e0: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
48f0: 72 79 20 74 61 62 6c 65 20 68 61 73 20 61 6c 72  ry table has alr
4900: 65 61 64 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  eady.        ** 
4910: 62 65 65 6e 20 70 75 74 20 69 6e 20 69 54 61 62  been put in iTab
4920: 6c 65 20 62 79 20 73 71 6c 69 74 65 45 78 70 72  le by sqliteExpr
4930: 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28  ResolveInSelect(
4940: 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
4950: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
4960: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ble = pParse->nT
4970: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71  ab++;.        sq
4980: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4990: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 70 45   OP_OpenTemp, pE
49a0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b  xpr->iTable, 1);
49b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
49c0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
49d0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52  xpr->pSelect, SR
49e0: 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
49f0: 61 62 6c 65 2c 20 30 2c 30 2c 30 29 3b 0a 20 20  able, 0,0,0);.  
4a00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
4a10: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
4a20: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
4a30: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
4a40: 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
4a50: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72  **.        ** Cr
4a60: 65 61 74 65 20 61 20 73 65 74 20 74 6f 20 70 75  eate a set to pu
4a70: 74 20 74 68 65 20 65 78 70 72 6c 69 73 74 20 76  t the exprlist v
4a80: 61 6c 75 65 73 20 69 6e 2e 20 20 54 68 65 20 53  alues in.  The S
4a90: 65 74 20 69 64 20 69 73 20 73 74 6f 72 65 64 0a  et id is stored.
4aa0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 69 54          ** in iT
4ab0: 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  able..        */
4ac0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20  .        int i, 
4ad0: 69 53 65 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  iSet;.        fo
4ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e  r(i=0; i<pExpr->
4af0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
4b00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
4b10: 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d  pr *pE2 = pExpr-
4b20: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
4b30: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
4b40: 28 20 21 73 71 6c 69 74 65 45 78 70 72 49 73 43  ( !sqliteExprIsC
4b50: 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
4b70: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
4b80: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 0a 20 20  rse->zErrMsg,.  
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 22 72 69 67              "rig
4ba0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
4bb0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  IN operator must
4bc0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 22 2c 20 30   be constant", 0
4bd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
4be0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
4bf0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
4c00: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 1;.          }
4c10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
4c20: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
4c30: 50 61 72 73 65 2c 20 70 45 32 2c 20 30 2c 20 30  Parse, pE2, 0, 0
4c40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
4c50: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
4c60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
4c70: 0a 20 20 20 20 20 20 20 20 69 53 65 74 20 3d 20  .        iSet = 
4c80: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
4c90: 70 50 61 72 73 65 2d 3e 6e 53 65 74 2b 2b 3b 0a  pParse->nSet++;.
4ca0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
4cb0: 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   i<pExpr->pList-
4cc0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
4cd0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
4ce0: 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  2 = pExpr->pList
4cf0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
4d00: 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
4d10: 70 45 32 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  pE2->op ){.     
4d20: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 46         case TK_F
4d30: 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20 20 20 20  LOAT:.          
4d40: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
4d50: 52 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  R:.            c
4d60: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
4d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
4d80: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
4d90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4da0: 53 65 74 49 6e 73 65 72 74 2c 20 69 53 65 74 2c  SetInsert, iSet,
4db0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
4dc0: 20 20 20 61 73 73 65 72 74 28 20 70 45 32 2d 3e     assert( pE2->
4dd0: 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20  token.z );.     
4de0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
4df0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
4e00: 64 64 72 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e  ddr, pE2->token.
4e10: 7a 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e 6e 29  z, pE2->token.n)
4e20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4e30: 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74  sqliteVdbeDequot
4e40: 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  eP3(v, addr);.  
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4e60: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
4e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66  .            def
4e80: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
4e90: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
4ea0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32  Code(pParse, pE2
4eb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
4ec0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4ed0: 28 76 2c 20 4f 50 5f 53 65 74 49 6e 73 65 72 74  (v, OP_SetInsert
4ee0: 2c 20 69 53 65 74 2c 20 30 29 3b 0a 20 20 20 20  , iSet, 0);.    
4ef0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
4f10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4f20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4f30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4f40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
4f50: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
4f60: 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  This has to be a
4f70: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
4f80: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
4f90: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
4fa0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
4fb0: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
4fc0: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
4fd0: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
4fe0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
4ff0: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
5000: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  olumn..      */.
5010: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
5020: 6c 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  lumn = pParse->n
5030: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Mem++;.      if(
5040: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
5050: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
5060: 6c 65 63 74 2c 20 53 52 54 5f 4d 65 6d 2c 20 70  lect, SRT_Mem, p
5070: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 30 2c  Expr->iColumn,0,
5080: 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  0,0) ){.        
5090: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
50a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
50b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72     }..    /* For
50c0: 20 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20   all else, just 
50d0: 72 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b  recursively walk
50e0: 20 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 20   the tree */.   
50f0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5100: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
5110: 66 74 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69  ft.      && sqli
5120: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
5130: 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70  (pParse, base, p
5140: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
5150: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29   pExpr->pLeft) )
5160: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
5170: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
5180: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69    if( pExpr->pRi
5190: 67 68 74 20 0a 20 20 20 20 20 20 26 26 20 73 71  ght .      && sq
51a0: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
51b0: 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ds(pParse, base,
51c0: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
51d0: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
51e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
51f0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
5200: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
5210: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
5220: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
5230: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
5240: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
5250: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
5260: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
5270: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
5280: 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20 70 4c   Expr *pArg = pL
5290: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
52a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
52b0: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
52c0: 49 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65  Ids(pParse, base
52d0: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
52e0: 73 74 2c 20 70 41 72 67 29 20 29 7b 0a 20 20 20  st, pArg) ){.   
52f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5300: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
5310: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5330: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
5340: 45 72 72 6f 72 20 63 68 65 63 6b 20 74 68 65 20  Error check the 
5350: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 61 6e 20  functions in an 
5360: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4d 61 6b  expression.  Mak
5370: 65 20 73 75 72 65 20 61 6c 6c 0a 2a 2a 20 66 75  e sure all.** fu
5380: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65  nction names are
5390: 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20   recognized and 
53a0: 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 20 68 61  all functions ha
53b0: 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  ve the correct.*
53c0: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * number of argu
53d0: 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61 6e  ments.  Leave an
53e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
53f0: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
5400: 67 0a 2a 2a 20 69 66 20 61 6e 79 74 68 69 6e 67  g.** if anything
5410: 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74 75   is amiss.  Retu
5420: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
5430: 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 69   errors..**.** i
5440: 66 20 70 49 73 41 67 67 20 69 73 20 6e 6f 74 20  f pIsAgg is not 
5450: 6e 75 6c 6c 20 61 6e 64 20 74 68 69 73 20 65 78  null and this ex
5460: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 61  pression is an a
5470: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
5480: 6e 0a 2a 2a 20 28 6c 69 6b 65 20 63 6f 75 6e 74  n.** (like count
5490: 28 2a 29 20 6f 72 20 6d 61 78 28 76 61 6c 75 65  (*) or max(value
54a0: 29 29 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  )) then write a 
54b0: 31 20 69 6e 74 6f 20 2a 70 49 73 41 67 67 2e 0a  1 into *pIsAgg..
54c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70  */.int sqliteExp
54d0: 72 43 68 65 63 6b 28 50 61 72 73 65 20 2a 70 50  rCheck(Parse *pP
54e0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
54f0: 72 2c 20 69 6e 74 20 61 6c 6c 6f 77 41 67 67 2c  r, int allowAgg,
5500: 20 69 6e 74 20 2a 70 49 73 41 67 67 29 7b 0a 20   int *pIsAgg){. 
5510: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
5520: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
5530: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
5540: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
5550: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
5560: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  CTION: {.      i
5570: 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c  nt n = pExpr->pL
5580: 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69  ist ? pExpr->pLi
5590: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
55a0: 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68       int no_such
55b0: 5f 66 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  _func = 0;.     
55c0: 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   int wrong_num_a
55d0: 72 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rgs = 0;.      i
55e0: 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20  nt is_agg = 0;. 
55f0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
5600: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
5610: 0a 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ..      pDef = s
5620: 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74 69 6f  qliteFindFunctio
5630: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
5640: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
5650: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
5660: 6b 65 6e 2e 6e 2c 20 6e 2c 20 30 29 3b 0a 20 20  ken.n, n, 0);.  
5670: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
5680: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
5690: 3d 20 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63  = sqliteFindFunc
56a0: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
56b0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70  .           pExp
56c0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
56d0: 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 2d 31 2c 20  r->token.n, -1, 
56e0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
56f0: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
5700: 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e       no_such_fun
5710: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
5720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5730: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
5740: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
5750: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5760: 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66     is_agg = pDef
5770: 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20  ->xFunc==0;.    
5780: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
5790: 5f 61 67 67 20 26 26 20 21 61 6c 6c 6f 77 41 67  _agg && !allowAg
57a0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
57b0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
57c0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
57d0: 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
57e0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 22 2c  gate function ",
57f0: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20   -1,.           
5800: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
5810: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pExpr->token.n, 
5820: 22 28 29 22 2c 20 32 2c 20 30 29 3b 0a 20 20 20  "()", 2, 0);.   
5830: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
5840: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72  r++;.        nEr
5850: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f  r++;.        is_
5860: 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  agg = 0;.      }
5870: 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68  else if( no_such
5880: 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  _func ){.       
5890: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
58a0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
58b0: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e  sg, "no such fun
58c0: 63 74 69 6f 6e 3a 20 22 2c 20 2d 31 2c 0a 20 20  ction: ", -1,.  
58d0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
58e0: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
58f0: 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  token.n, 0);.   
5900: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
5910: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72  r++;.        nEr
5920: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
5930: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
5940: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
5950: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
5960: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
5970: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 77  , .           "w
5980: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
5990: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
59a0: 74 69 6f 6e 20 22 2c 2d 31 2c 0a 20 20 20 20 20  tion ",-1,.     
59b0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
59c0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
59d0: 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c 20 30  en.n, "()", 2, 0
59e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
59f0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5a00: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
5a10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
5a20: 61 67 67 20 29 20 70 45 78 70 72 2d 3e 6f 70 20  agg ) pExpr->op 
5a30: 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  = TK_AGG_FUNCTIO
5a40: 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f  N;.      if( is_
5a50: 61 67 67 20 26 26 20 70 49 73 41 67 67 20 29 20  agg && pIsAgg ) 
5a60: 2a 70 49 73 41 67 67 20 3d 20 31 3b 0a 20 20 20  *pIsAgg = 1;.   
5a70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72     for(i=0; nErr
5a80: 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29  ==0 && i<n; i++)
5a90: 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d  {.        nErr =
5aa0: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
5ab0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
5ac0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
5ad0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5af0: 20 20 61 6c 6c 6f 77 41 67 67 20 26 26 20 21 69    allowAgg && !i
5b00: 73 5f 61 67 67 2c 20 70 49 73 41 67 67 29 3b 0a  s_agg, pIsAgg);.
5b10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5b20: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5b30: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
5b40: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  eft ){.        n
5b50: 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  Err = sqliteExpr
5b60: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
5b70: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 6c 6c 6f  xpr->pLeft, allo
5b80: 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20  wAgg, pIsAgg);. 
5b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5ba0: 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70   nErr==0 && pExp
5bb0: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
5bc0: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
5bd0: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
5be0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
5bf0: 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73  t, allowAgg, pIs
5c00: 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Agg);.      }.  
5c10: 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20      if( nErr==0 
5c20: 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20  && pExpr->pList 
5c30: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
5c40: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
5c50: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
5c60: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
5c70: 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20  or(i=0; nErr==0 
5c80: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
5c90: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
5ca0: 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  2 = pExpr->pList
5cb0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
5cc0: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
5cd0: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
5ce0: 50 61 72 73 65 2c 20 70 45 32 2c 20 61 6c 6c 6f  Parse, pE2, allo
5cf0: 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20  wAgg, pIsAgg);. 
5d00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5d10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5d20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5d30: 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nErr;.}../*.** 
5d40: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
5d50: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
5d60: 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
5d70: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
5d80: 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76  ression and leav
5d90: 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20  e the result on 
5da0: 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b  the top of stack
5db0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5dc0: 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
5dd0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
5de0: 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  xpr){.  Vdbe *v 
5df0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5e00: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28  .  int op;.  if(
5e10: 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
5e20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77  0 ) return;.  sw
5e30: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
5e40: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  ){.    case TK_P
5e50: 4c 55 53 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50  LUS:     op = OP
5e60: 5f 41 64 64 3b 20 20 20 20 20 20 62 72 65 61 6b  _Add;      break
5e70: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  ;.    case TK_MI
5e80: 4e 55 53 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  NUS:    op = OP_
5e90: 53 75 62 74 72 61 63 74 3b 20 62 72 65 61 6b 3b  Subtract; break;
5ea0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
5eb0: 52 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4d  R:     op = OP_M
5ec0: 75 6c 74 69 70 6c 79 3b 20 62 72 65 61 6b 3b 0a  ultiply; break;.
5ed0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
5ee0: 48 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44 69  H:    op = OP_Di
5ef0: 76 69 64 65 3b 20 20 20 62 72 65 61 6b 3b 0a 20  vide;   break;. 
5f00: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
5f10: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 6e 64       op = OP_And
5f20: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
5f30: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
5f40: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 72 3b 20      op = OP_Or; 
5f50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5f60: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
5f70: 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20     op = OP_Lt;  
5f80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5f90: 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20  case TK_LE:     
5fa0: 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20    op = OP_Le;   
5fb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5fc0: 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
5fd0: 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20   op = OP_Gt;    
5fe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
5ff0: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20  se TK_GE:       
6000: 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20  op = OP_Ge;     
6010: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6020: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f  e TK_NE:       o
6030: 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20  p = OP_Ne;      
6040: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
6050: 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70   TK_EQ:       op
6060: 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20   = OP_Eq;       
6070: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6080: 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20  TK_ISNULL:   op 
6090: 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62  = OP_IsNull;   b
60a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
60b0: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d  K_NOTNULL:  op =
60c0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72   OP_NotNull;  br
60d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
60e0: 5f 4e 4f 54 3a 20 20 20 20 20 20 6f 70 20 3d 20  _NOT:      op = 
60f0: 4f 50 5f 4e 6f 74 3b 20 20 20 20 20 20 62 72 65  OP_Not;      bre
6100: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
6110: 55 4d 49 4e 55 53 3a 20 20 20 6f 70 20 3d 20 4f  UMINUS:   op = O
6120: 50 5f 4e 65 67 61 74 69 76 65 3b 20 62 72 65 61  P_Negative; brea
6130: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
6140: 49 54 41 4e 44 3a 20 20 20 6f 70 20 3d 20 4f 50  ITAND:   op = OP
6150: 5f 42 69 74 41 6e 64 3b 20 20 20 62 72 65 61 6b  _BitAnd;   break
6160: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
6170: 54 4f 52 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  TOR:    op = OP_
6180: 42 69 74 4f 72 3b 20 20 20 20 62 72 65 61 6b 3b  BitOr;    break;
6190: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
61a0: 4e 4f 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42  NOT:   op = OP_B
61b0: 69 74 4e 6f 74 3b 20 20 20 62 72 65 61 6b 3b 0a  itNot;   break;.
61c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
61d0: 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68  FT:   op = OP_Sh
61e0: 69 66 74 4c 65 66 74 3b 20 20 62 72 65 61 6b 3b  iftLeft;  break;
61f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
6200: 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53  IFT:   op = OP_S
6210: 68 69 66 74 52 69 67 68 74 3b 20 62 72 65 61 6b  hiftRight; break
6220: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
6230: 4d 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  M:      op = OP_
6240: 52 65 6d 61 69 6e 64 65 72 3b 20 20 62 72 65 61  Remainder;  brea
6250: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
6260: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69  break;.  }.  swi
6270: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
6280: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
6290: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
62a0: 28 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67  ( pParse->useAgg
62b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
62c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
62d0: 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78  P_AggGet, 0, pEx
62e0: 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20  pr->iAgg);.     
62f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
6300: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
6310: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
6320: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
6330: 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61  lumn, pExpr->iTa
6340: 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
6350: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
6360: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
6370: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6380: 5f 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69  _Recno, pExpr->i
6390: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
63a0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
63b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
63c0: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
63d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
63e0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
63f0: 2c 20 61 74 6f 69 28 70 45 78 70 72 2d 3e 74 6f  , atoi(pExpr->to
6400: 6b 65 6e 2e 7a 29 2c 20 30 29 3b 0a 20 20 20 20  ken.z), 0);.    
6410: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
6420: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 45 78 70  geP3(v, -1, pExp
6430: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
6440: 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
6450: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6460: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
6470: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
6480: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6490: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
64a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
64b0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a  xpr->token.z );.
64c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
64d0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
64e0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
64f0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
6500: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6510: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
6520: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
6530: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
6540: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6550: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
6560: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
6570: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a  xpr->token.z );.
6580: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6590: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
65a0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  , pExpr->token.z
65b0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
65c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
65d0: 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20  dbeDequoteP3(v, 
65e0: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65  addr);.      bre
65f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6600: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
6610: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6620: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
6630: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
6640: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6650: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
6660: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
6670: 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
6680: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
6690: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
66a0: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
66b0: 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
66c0: 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
66d0: 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
66e0: 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
66f0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
6700: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
6710: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
6720: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
6730: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
6740: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
6750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
6760: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
6770: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
6780: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
6790: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
67a0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
67b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
67c0: 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  v, op, 0, 0);.  
67d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
67e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
67f0: 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
6800: 5f 52 53 48 49 46 54 3a 20 7b 0a 20 20 20 20 20  _RSHIFT: {.     
6810: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
6820: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
6830: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71  Right);.      sq
6840: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
6850: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
6860: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
6870: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
6880: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
6890: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
68a0: 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
68b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
68c0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
68d0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
68e0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
68f0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
6900: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
6910: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6920: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c  v, OP_Concat, 2,
6930: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
6940: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6950: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
6960: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
6970: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  r->pLeft );.    
6980: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
6990: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
69a0: 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   || pExpr->pLeft
69b0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
69c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65   ){.        Toke
69d0: 6e 20 2a 70 20 3d 20 26 70 45 78 70 72 2d 3e 70  n *p = &pExpr->p
69e0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
69f0: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73       char *z = s
6a00: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e  qliteMalloc( p->
6a10: 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20  n + 2 );.       
6a20: 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e   sprintf(z, "-%.
6a30: 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29  *s", p->n, p->z)
6a40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
6a50: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
6a60: 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
6a70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
6a80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
6a90: 74 65 67 65 72 2c 20 61 74 6f 69 28 7a 29 2c 20  teger, atoi(z), 
6aa0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
6ab0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
6ac0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6ad0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
6ae0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6af0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6b00: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c  angeP3(v, -1, z,
6b10: 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20   p->n+1);.      
6b20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
6b30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6b40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
6b50: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e   Fall through in
6b60: 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20  to TK_NOT */.   
6b70: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
6b80: 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
6b90: 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
6ba0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
6bb0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
6bc0: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
6bd0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
6be0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
6bf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6c00: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
6c10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
6c20: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NULL: {.      in
6c30: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 73 71  t dest;.      sq
6c40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6c50: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
6c60: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
6c70: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
6c80: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
6c90: 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c        dest = sql
6ca0: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
6cb0: 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20  dr(v) + 2;.     
6cc0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6cd0: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
6ce0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6cf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
6d00: 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  dImm, -1, 0);.  
6d10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6d20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
6d30: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
6d40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6d50: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c  Op(v, OP_AggGet,
6d60: 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29   0, pExpr->iAgg)
6d70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6d80: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
6d90: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
6da0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
6db0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
6dc0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
6dd0: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20        int nExpr 
6de0: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
6df0: 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
6e00: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
6e10: 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
6e20: 6c 69 74 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e  liteFindFunction
6e30: 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e50: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
6e60: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
6e70: 6e 2c 20 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  n, nExpr, 0);.  
6e80: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66      assert( pDef
6e90: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  !=0 );.      for
6ea0: 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
6eb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
6ec0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
6ed0: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
6ee0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
6ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6f00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6e 63  AddOp(v, OP_Func
6f10: 74 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 30 29 3b  tion, nExpr, 0);
6f20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6f30: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
6f40: 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33   (char*)pDef, P3
6f50: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20  _POINTER);.     
6f60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6f70: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
6f80: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6f90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6fa0: 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e  MemLoad, pExpr->
6fb0: 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  iColumn, 0);.   
6fc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6fd0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
6fe0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
6ff0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
7000: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
7010: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20  teger, 1, 0);.  
7020: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
7030: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
7040: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
7050: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
7060: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
7070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7080: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
7090: 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34  Null, -1, addr+4
70a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
70b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
70c0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
70d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
70e0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
70f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7100: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7110: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b  P_Goto, 0, addr+
7120: 36 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  6);.      if( pE
7130: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
7140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
7150: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f  beAddOp(v, OP_Fo
7160: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
7170: 6c 65 2c 20 61 64 64 72 2b 36 29 3b 0a 20 20 20  le, addr+6);.   
7180: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7190: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
71a0: 70 28 76 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64  p(v, OP_SetFound
71b0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
71c0: 20 61 64 64 72 2b 36 29 3b 0a 20 20 20 20 20 20   addr+6);.      
71d0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
71e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
71f0: 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  dImm, -1, 0);.  
7200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7210: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
7220: 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71  WEEN: {.      sq
7230: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
7240: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
7250: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
7260: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7270: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
7280: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
7290: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
72a0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
72b0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
72c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
72d0: 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Ge, 0, 0);.     
72e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
72f0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
7300: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
7310: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
7320: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
7330: 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
7340: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7350: 70 28 76 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30  p(v, OP_Le, 0, 0
7360: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
7370: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
7380: 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  nd, 0, 0);.     
7390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
73a0: 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a    case TK_AS: {.
73b0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
73c0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
73d0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
73e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
73f0: 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a     case TK_CASE:
7400: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70   {.      int exp
7410: 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20  r_end_label;.   
7420: 20 20 20 69 6e 74 20 6e 75 6c 6c 5f 72 65 73 75     int null_resu
7430: 6c 74 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20  lt_label;.      
7440: 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20  int jumpInst;.  
7450: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
7460: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20      int nExpr;. 
7470: 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
7480: 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
7490: 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61  >pList);.      a
74a0: 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c  ssert((pExpr->pL
74b0: 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20  ist->nExpr % 2) 
74c0: 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  == 0);.      ass
74d0: 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
74e0: 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
74f0: 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 78 70      nExpr = pExp
7500: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  r->pList->nExpr;
7510: 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f  .      expr_end_
7520: 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 56 64  label = sqliteVd
7530: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
7540: 20 20 20 20 20 20 6e 75 6c 6c 5f 72 65 73 75 6c        null_resul
7550: 74 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  t_label = sqlite
7560: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
7570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
7580: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
7590: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
75a0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
75b0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
75c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
75d0: 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  p(v, OP_IsNull, 
75e0: 2d 31 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62  -1, expr_end_lab
75f0: 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
7600: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
7610: 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  xpr; i=i+2){.   
7620: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
7630: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
7640: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
7650: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
7660: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7670: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 31 2c  , OP_IsNull, -1,
7680: 20 6e 75 6c 6c 5f 72 65 73 75 6c 74 5f 6c 61 62   null_result_lab
7690: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  el);.        if(
76a0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
76b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
76c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
76d0: 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20 20  _Dup, 1, 1);.   
76e0: 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20         jumpInst 
76f0: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
7700: 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 2c 20 30  p(v, OP_Ne, 0, 0
7710: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
7720: 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70  {.          jump
7730: 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 56 64 62  Inst = sqliteVdb
7740: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e  eAddOp(v, OP_IfN
7750: 6f 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ot, 0, 0);.     
7760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
7770: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
7780: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
7790: 2d 3e 61 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b  ->a[i+1].pExpr);
77a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
77b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
77c0: 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64  oto, 0, expr_end
77d0: 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  _label);.       
77e0: 20 69 66 28 20 69 3e 3d 6e 45 78 70 72 2d 32 20   if( i>=nExpr-2 
77f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7800: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
7810: 62 65 6c 28 76 2c 20 6e 75 6c 6c 5f 72 65 73 75  bel(v, null_resu
7820: 6c 74 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20  lt_label);.     
7830: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7840: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
7850: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
7860: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
7870: 68 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ht!=0 ){.       
7880: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7890: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
78a0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
78b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
78c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
78d0: 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61  , 0, expr_end_la
78e0: 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  bel);.          
78f0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
7900: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
7910: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
7920: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
7930: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 32 28  iteVdbeChangeP2(
7940: 76 2c 20 6a 75 6d 70 49 6e 73 74 2c 20 61 64 64  v, jumpInst, add
7950: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
7960: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69    if( pExpr->pRi
7970: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ght ){.        s
7980: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
7990: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
79a0: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
79b0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
79c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
79d0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
79e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
79f0: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
7a00: 61 62 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e 64  abel(v, expr_end
7a10: 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 69  _label);.      i
7a20: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
7a30: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7a40: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7a50: 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
7a60: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7a70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
7a80: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
7a90: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
7aa0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
7ab0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
7ac0: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
7ad0: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
7ae0: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
7af0: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
7b00: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
7b10: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
7b20: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
7b30: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
7b40: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
7b50: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
7b60: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
7b70: 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
7b80: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
7b90: 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
7ba0: 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
7bb0: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
7bc0: 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
7bd0: 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  flag is true..*/
7be0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
7bf0: 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
7c00: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
7c10: 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
7c20: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
7c30: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
7c40: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
7c50: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d  p = 0;.  if( v==
7c60: 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
7c70: 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68  return;.  switch
7c80: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
7c90: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
7ca0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b       op = OP_Lt;
7cb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7cc0: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
7cd0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20      op = OP_Le; 
7ce0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7cf0: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
7d00: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20     op = OP_Gt;  
7d10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7d20: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
7d30: 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20    op = OP_Ge;   
7d40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
7d50: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
7d60: 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20   op = OP_Ne;    
7d70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
7d80: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20  se TK_EQ:       
7d90: 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20  op = OP_Eq;     
7da0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7db0: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f  e TK_ISNULL:   o
7dc0: 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20  p = OP_IsNull;  
7dd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7de0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70   TK_NOTNULL:  op
7df0: 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20   = OP_NotNull;  
7e00: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
7e10: 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  lt:  break;.  }.
7e20: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
7e30: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
7e40: 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
7e50: 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 56  int d2 = sqliteV
7e60: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
7e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
7e80: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
7e90: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
7ea0: 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  2, !jumpIfNull);
7eb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
7ec0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
7ed0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
7ee0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
7ef0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
7f00: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
7f10: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
7f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7f30: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
7f40: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72    sqliteExprIfTr
7f50: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
7f60: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
7f70: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
7f80: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72    sqliteExprIfTr
7f90: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
7fa0: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
7fb0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
7fc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7fd0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
7fe0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
7ff0: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
8000: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
8010: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
8020: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
8030: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
8040: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
8050: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
8060: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
8070: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
8080: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
8090: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73  TK_EQ: {.      s
80a0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
80b0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
80c0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
80d0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
80e0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
80f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8100: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 6a  beAddOp(v, op, j
8110: 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29  umpIfNull, dest)
8120: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8130: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
8140: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
8150: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
8160: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
8170: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
8180: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
8190: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
81a0: 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74  p(v, op, 1, dest
81b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
81c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
81d0: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
81e0: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73 71  t addr;.      sq
81f0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
8200: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
8210: 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  t);.      addr =
8220: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
8230: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
8240: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8250: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
8260: 2d 31 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20  -1, addr+3);.   
8270: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8280: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
8290: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
82a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
82b0: 5f 47 6f 74 6f 2c 20 30 2c 20 6a 75 6d 70 49 66  _Goto, 0, jumpIf
82c0: 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 61 64  Null ? dest : ad
82d0: 64 72 2b 34 29 3b 0a 20 20 20 20 20 20 69 66 28  dr+4);.      if(
82e0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
82f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8300: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8310: 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
8320: 54 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20  Table, dest);.  
8330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8340: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8350: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 46 6f 75 6e  Op(v, OP_SetFoun
8360: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
8370: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
8380: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8390: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
83a0: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
83b0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
83c0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
83d0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
83e0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
83f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8400: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
8410: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
8420: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
8430: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
8440: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61 64 64  Expr);.      add
8450: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
8460: 64 4f 70 28 76 2c 20 4f 50 5f 4c 74 2c 20 21 6a  dOp(v, OP_Lt, !j
8470: 75 6d 70 49 66 4e 75 6c 6c 2c 20 30 29 3b 0a 20  umpIfNull, 0);. 
8480: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
8490: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
84a0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
84b0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
84c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
84d0: 4f 50 5f 4c 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  OP_Le, jumpIfNul
84e0: 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
84f0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8500: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
8510: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
8520: 74 65 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  teVdbeChangeP2(v
8530: 2c 20 61 64 64 72 2c 20 73 71 6c 69 74 65 56 64  , addr, sqliteVd
8540: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
8550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8560: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
8570: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
8580: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8590: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
85a0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
85b0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
85c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
85d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
85e0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
85f0: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
8600: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
8610: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
8620: 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
8630: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
8640: 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
8650: 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
8660: 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
8670: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
8680: 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
8690: 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
86a0: 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
86b0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
86c0: 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
86d0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
86e0: 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
86f0: 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
8700: 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
8710: 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
8720: 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65  mpIfNull is true
8730: 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
8740: 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
8750: 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64  s false..*/.void
8760: 20 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c   sqliteExprIfFal
8770: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
8780: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
8790: 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
87a0: 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
87b0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
87c0: 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
87d0: 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  0;.  if( v==0 ||
87e0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
87f0: 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  rn;.  switch( pE
8800: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
8810: 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20  ase TK_LT:      
8820: 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20   op = OP_Ge;    
8830: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8840: 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20  se TK_LE:       
8850: 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20  op = OP_Gt;     
8860: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8870: 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f  e TK_GT:       o
8880: 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20  p = OP_Le;      
8890: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
88a0: 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f 70   TK_GE:       op
88b0: 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20   = OP_Lt;       
88c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
88d0: 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_NE:       op 
88e0: 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62  = OP_Eq;       b
88f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8900: 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_EQ:       op =
8910: 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20 62 72   OP_Ne;       br
8920: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8930: 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20  _ISNULL:   op = 
8940: 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65  OP_NotNull;  bre
8950: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8960: 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f  NOTNULL:  op = O
8970: 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61  P_IsNull;   brea
8980: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
8990: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77   break;.  }.  sw
89a0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
89b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
89c0: 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ND: {.      sqli
89d0: 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  teExprIfFalse(pP
89e0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
89f0: 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
8a00: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
8a10: 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70  iteExprIfFalse(p
8a20: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
8a30: 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
8a40: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
8a50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8a60: 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
8a70: 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
8a80: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
8a90: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
8aa0: 65 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  eExprIfTrue(pPar
8ab0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
8ac0: 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  , d2, !jumpIfNul
8ad0: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
8ae0: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
8af0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
8b00: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
8b10: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
8b20: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
8b30: 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
8b40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8b50: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
8b60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
8b70: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
8b80: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
8b90: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
8ba0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8bb0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8bc0: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
8bd0: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
8be0: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
8bf0: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
8c00: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
8c10: 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  EQ: {.      sqli
8c20: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
8c30: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
8c40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
8c50: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
8c60: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
8c70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8c80: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 6a 75 6d 70  ddOp(v, op, jump
8c90: 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20  IfNull, dest);. 
8ca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8cb0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
8cc0: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
8cd0: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
8ce0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
8cf0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
8d00: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
8d10: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8d20: 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a  , op, 1, dest);.
8d30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8d40: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
8d50: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  N: {.      int a
8d60: 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ddr;.      sqlit
8d70: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
8d80: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
8d90: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
8da0: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
8db0: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
8dc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8dd0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c   OP_NotNull, -1,
8de0: 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20   addr+3);.      
8df0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8e00: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
8e10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8e20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
8e30: 74 6f 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c  to, 0, jumpIfNul
8e40: 6c 20 3f 20 64 65 73 74 20 3a 20 61 64 64 72 2b  l ? dest : addr+
8e50: 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  4);.      if( pE
8e60: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
8e70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8e80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
8e90: 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  tFound, pExpr->i
8ea0: 54 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20  Table, dest);.  
8eb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8ec0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8ed0: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 6f 74 46  Op(v, OP_SetNotF
8ee0: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
8ef0: 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ble, dest);.    
8f00: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8f10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
8f20: 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
8f30: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
8f40: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
8f50: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
8f60: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
8f70: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8f80: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
8f90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
8fa0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
8fb0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
8fc0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
8fd0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
8fe0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
8ff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
9000: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c  eAddOp(v, OP_Ge,
9010: 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 61 64   !jumpIfNull, ad
9020: 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+3);.      sql
9030: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9040: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
9050: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9060: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
9070: 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   0, dest);.     
9080: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
9090: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
90a0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
90b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
90c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
90d0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64  t, jumpIfNull, d
90e0: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
90f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
9100: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  ault: {.      sq
9110: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
9120: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
9130: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9140: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 2c 20 30 2c  Op(v, OP_Not, 0,
9150: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
9160: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9170: 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c  _If, jumpIfNull,
9180: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
9190: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
91a0: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
91b0: 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
91c0: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
91d0: 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52  rees.  Return TR
91e0: 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a  UE (non-zero).**
91f0: 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
9200: 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72  ntical and retur
9210: 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20  n FALSE if they 
9220: 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
9230: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
9240: 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72  ExprCompare(Expr
9250: 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b   *pA, Expr *pB){
9260: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
9270: 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pA==0 ){.    ret
9280: 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c  urn pB==0;.  }el
9290: 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a  se if( pB==0 ){.
92a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
92b0: 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
92c0: 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20  pB->op ) return 
92d0: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
92e0: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
92f0: 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
9300: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
9310: 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72 43  if( !sqliteExprC
9320: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
9330: 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29  t, pB->pRight) )
9340: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
9350: 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pA->pList ){.  
9360: 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d    if( pB->pList=
9370: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
9380: 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74     if( pA->pList
9390: 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69  ->nExpr!=pB->pLi
93a0: 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  st->nExpr ) retu
93b0: 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d  rn 0;.    for(i=
93c0: 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e  0; i<pA->pList->
93d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
93e0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 45 78     if( !sqliteEx
93f0: 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
9400: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
9410: 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d   pB->pList->a[i]
9420: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
9430: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
9440: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
9450: 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74  se if( pB->pList
9460: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
9470: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
9480: 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70  pSelect || pB->p
9490: 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
94a0: 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b  0;.  if( pA->tok
94b0: 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20  en.z ){.    if( 
94c0: 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29  pB->token.z==0 )
94d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
94e0: 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  f( pB->token.n!=
94f0: 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65  pA->token.n ) re
9500: 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
9510: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70  sqliteStrNICmp(p
9520: 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e  A->token.z, pB->
9530: 74 6f 6b 65 6e 2e 7a 2c 20 70 41 2d 3e 74 6f 6b  token.z, pA->tok
9540: 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74 75 72  en.n)!=0 ) retur
9550: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
9560: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 1;.}../*.** Ad
9570: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
9580: 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
9590: 41 67 67 5b 5d 20 61 72 72 61 79 20 61 6e 64 20  Agg[] array and 
95a0: 72 65 74 75 72 6e 20 69 74 73 20 69 6e 64 65 78  return its index
95b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
95c0: 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 50 61  appendAggInfo(Pa
95d0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
95e0: 69 66 28 20 28 70 50 61 72 73 65 2d 3e 6e 41 67  if( (pParse->nAg
95f0: 67 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  g & 0x7)==0 ){. 
9600: 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 70 50 61     int amt = pPa
9610: 72 73 65 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a 20  rse->nAgg + 8;. 
9620: 20 20 20 41 67 67 45 78 70 72 20 2a 61 41 67 67     AggExpr *aAgg
9630: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
9640: 28 70 50 61 72 73 65 2d 3e 61 41 67 67 2c 20 61  (pParse->aAgg, a
9650: 6d 74 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65  mt*sizeof(pParse
9660: 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 20  ->aAgg[0]));.   
9670: 20 69 66 28 20 61 41 67 67 3d 3d 30 20 29 7b 0a   if( aAgg==0 ){.
9680: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
9690: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
96a0: 65 2d 3e 61 41 67 67 20 3d 20 61 41 67 67 3b 0a  e->aAgg = aAgg;.
96b0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 50    }.  memset(&pP
96c0: 61 72 73 65 2d 3e 61 41 67 67 5b 70 50 61 72 73  arse->aAgg[pPars
96d0: 65 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20 73 69 7a  e->nAgg], 0, siz
96e0: 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67  eof(pParse->aAgg
96f0: 5b 30 5d 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  [0]));.  return 
9700: 70 50 61 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a  pParse->nAgg++;.
9710: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
9720: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
9730: 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ssion looking fo
9740: 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
9750: 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72  tions and.** for
9760: 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
9770: 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
9780: 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
9790: 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  aAgg[] array..**
97a0: 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c   Make additional
97b0: 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20   entries to the 
97c0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
97d0: 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72  rray as necessar
97e0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
97f0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
9800: 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
9810: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
9820: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
9830: 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 45  lyzed by sqliteE
9840: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 29 20  xprResolveIds() 
9850: 61 6e 64 20 73 71 6c 69 74 65 45 78 70 72 43 68  and sqliteExprCh
9860: 65 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eck()..**.** If 
9870: 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2c  errors are seen,
9880: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
9890: 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72 4d  message in zErrM
98a0: 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  sg and return.**
98b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
98c0: 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrors..*/.int sq
98d0: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
98e0: 67 67 72 65 67 61 74 65 73 28 50 61 72 73 65 20  ggregates(Parse 
98f0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
9900: 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
9910: 20 20 41 67 67 45 78 70 72 20 2a 61 41 67 67 3b    AggExpr *aAgg;
9920: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
9930: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
9940: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
9950: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
9960: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
9970: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
9980: 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  aAgg = pParse->a
9990: 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Agg;.      for(i
99a0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
99b0: 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
99c0: 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e 69 73    if( aAgg[i].is
99d0: 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Agg ) continue;.
99e0: 20 20 20 20 20 20 20 20 69 66 28 20 61 41 67 67          if( aAgg
99f0: 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c  [i].pExpr->iTabl
9a00: 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
9a10: 0a 20 20 20 20 20 20 20 20 20 26 26 20 61 41 67  .         && aAg
9a20: 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  g[i].pExpr->iCol
9a30: 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
9a40: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
9a50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9a60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9a70: 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e  if( i>=pParse->n
9a80: 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Agg ){.        i
9a90: 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f   = appendAggInfo
9aa0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
9ab0: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
9ac0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50  rn 1;.        pP
9ad0: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73  arse->aAgg[i].is
9ae0: 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Agg = 0;.       
9af0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
9b00: 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
9b10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45        }.      pE
9b20: 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20  xpr->iAgg = i;. 
9b30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9b40: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
9b50: 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
9b60: 20 20 20 20 61 41 67 67 20 3d 20 70 50 61 72 73      aAgg = pPars
9b70: 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66  e->aAgg;.      f
9b80: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
9b90: 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
9ba0: 20 20 20 20 20 20 69 66 28 20 21 61 41 67 67 5b        if( !aAgg[
9bb0: 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  i].isAgg ) conti
9bc0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
9bd0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61   sqliteExprCompa
9be0: 72 65 28 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  re(aAgg[i].pExpr
9bf0: 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  , pExpr) ){.    
9c00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9c10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9c20: 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72       if( i>=pPar
9c30: 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20  se->nAgg ){.    
9c40: 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67      i = appendAg
9c50: 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20  gInfo(pParse);. 
9c60: 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29         if( i<0 )
9c70: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
9c80: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
9c90: 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20  i].isAgg = 1;.  
9ca0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
9cb0: 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45  gg[i].pExpr = pE
9cc0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61  xpr;.        pPa
9cd0: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75  rse->aAgg[i].pFu
9ce0: 6e 63 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 46  nc = sqliteFindF
9cf0: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
9d00: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
9d10: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
9d20: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
9d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45  .             pE
9d40: 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78  xpr->pList ? pEx
9d50: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
9d60: 20 3a 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20   : 0, 0);.      
9d70: 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  }.      pExpr->i
9d80: 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 62  Agg = i;.      b
9d90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9da0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
9db0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
9dc0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72  t ){.        nEr
9dd0: 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 41 6e  r = sqliteExprAn
9de0: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
9df0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9e00: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Left);.      }. 
9e10: 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30       if( nErr==0
9e20: 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
9e30: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72  t ){.        nEr
9e40: 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 41 6e  r = sqliteExprAn
9e50: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
9e60: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9e70: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Right);.      }.
9e80: 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d        if( nErr==
9e90: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
9ea0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
9eb0: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73   n = pExpr->pLis
9ec0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
9ed0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
9ee0: 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d   for(i=0; nErr==
9ef0: 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  0 && i<n; i++){.
9f00: 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d            nErr =
9f10: 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
9f20: 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
9f30: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
9f40: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
9f50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9f60: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9f70: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9f80: 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nErr;.}../*.**
9f90: 20 4c 6f 63 61 74 65 20 61 20 75 73 65 72 20 66   Locate a user f
9fa0: 75 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20 61 20  unction given a 
9fb0: 6e 61 6d 65 20 61 6e 64 20 61 20 6e 75 6d 62 65  name and a numbe
9fc0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 0a  r of arguments..
9fd0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
9fe0: 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44  ter to the FuncD
9ff0: 65 66 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ef structure tha
a000: 74 20 64 65 66 69 6e 65 73 20 74 68 61 74 0a 2a  t defines that.*
a010: 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 72  * function, or r
a020: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
a030: 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
a040: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  not exist..**.**
a050: 20 49 66 20 74 68 65 20 63 72 65 61 74 65 46 6c   If the createFl
a060: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  ag argument is t
a070: 72 75 65 2c 20 74 68 65 6e 20 61 20 6e 65 77 20  rue, then a new 
a080: 28 62 6c 61 6e 6b 29 20 46 75 6e 63 44 65 66 0a  (blank) FuncDef.
a090: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ** structure is 
a0a0: 63 72 65 61 74 65 64 20 61 6e 64 20 6c 69 6b 65  created and like
a0b0: 64 20 69 6e 74 6f 20 74 68 65 20 22 64 62 22 20  d into the "db" 
a0c0: 73 74 72 75 63 74 75 72 65 20 69 66 20 61 0a 2a  structure if a.*
a0d0: 2a 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 66 75  * no matching fu
a0e0: 6e 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c  nction previousl
a0f0: 79 20 65 78 69 73 74 65 64 2e 20 20 57 68 65 6e  y existed.  When
a100: 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 74   createFlag is t
a110: 72 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  rue.** and the n
a120: 41 72 67 20 70 61 72 61 6d 65 74 65 72 20 69 73  Arg parameter is
a130: 20 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 61   -1, then only a
a140: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 61   function that a
a150: 63 63 65 70 74 73 0a 2a 2a 20 61 6e 79 20 6e 75  ccepts.** any nu
a160: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a170: 73 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  s will be return
a180: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65  ed..**.** If cre
a190: 61 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65  ateFlag is false
a1a0: 20 61 6e 64 20 6e 41 72 67 20 69 73 20 2d 31 2c   and nArg is -1,
a1b0: 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
a1c0: 76 61 6c 69 64 0a 2a 2a 20 66 75 6e 63 74 69 6f  valid.** functio
a1d0: 6e 20 66 6f 75 6e 64 20 69 73 20 72 65 74 75 72  n found is retur
a1e0: 6e 65 64 2e 20 20 41 20 66 75 6e 63 74 69 6f 6e  ned.  A function
a1f0: 20 69 73 20 76 61 6c 69 64 20 69 66 20 65 69 74   is valid if eit
a200: 68 65 72 20 78 46 75 6e 63 0a 2a 2a 20 6f 72 20  her xFunc.** or 
a210: 78 53 74 65 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  xStep is non-zer
a220: 6f 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66 20 2a 73  o..*/.FuncDef *s
a230: 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74 69 6f  qliteFindFunctio
a240: 6e 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c  n(.  sqlite *db,
a250: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70          /* An op
a260: 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  en database */. 
a270: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
a280: 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  me, /* Name of t
a290: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f  he function.  No
a2a0: 74 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  t null-terminate
a2b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  d */.  int nName
a2c0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ,         /* Num
a2d0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
a2e0: 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f  s in the name */
a2f0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
a300: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a310: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 2d  of arguments.  -
a320: 31 20 6d 65 61 6e 73 20 61 6e 79 20 6e 75 6d 62  1 means any numb
a330: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 72 65 61  er */.  int crea
a340: 74 65 46 6c 61 67 20 20 20 20 20 2f 2a 20 43 72  teFlag     /* Cr
a350: 65 61 74 65 20 6e 65 77 20 65 6e 74 72 79 20 69  eate new entry i
a360: 66 20 74 72 75 65 20 61 6e 64 20 64 6f 65 73 20  f true and does 
a370: 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 65 78  not otherwise ex
a380: 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63  ist */.){.  Func
a390: 44 65 66 20 2a 70 46 69 72 73 74 2c 20 2a 70 2c  Def *pFirst, *p,
a3a0: 20 2a 70 4d 61 79 62 65 3b 0a 20 20 70 46 69 72   *pMaybe;.  pFir
a3b0: 73 74 20 3d 20 70 20 3d 20 28 46 75 6e 63 44 65  st = p = (FuncDe
a3c0: 66 2a 29 73 71 6c 69 74 65 48 61 73 68 46 69 6e  f*)sqliteHashFin
a3d0: 64 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e  d(&db->aFunc, zN
a3e0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 69  ame, nName);.  i
a3f0: 66 28 20 70 20 26 26 20 21 63 72 65 61 74 65 46  f( p && !createF
a400: 6c 61 67 20 26 26 20 6e 41 72 67 3c 30 20 29 7b  lag && nArg<0 ){
a410: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26  .    while( p &&
a420: 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 26 26 20   p->xFunc==0 && 
a430: 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29 7b 20 70  p->xStep==0 ){ p
a440: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20   = p->pNext; }. 
a450: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d     return p;.  }
a460: 0a 20 20 70 4d 61 79 62 65 20 3d 20 30 3b 0a 20  .  pMaybe = 0;. 
a470: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
a480: 6e 41 72 67 21 3d 6e 41 72 67 20 29 7b 0a 20 20  nArg!=nArg ){.  
a490: 20 20 69 66 28 20 70 2d 3e 6e 41 72 67 3c 30 20    if( p->nArg<0 
a4a0: 26 26 20 21 63 72 65 61 74 65 46 6c 61 67 20 26  && !createFlag &
a4b0: 26 20 28 70 2d 3e 78 46 75 6e 63 20 7c 7c 20 70  & (p->xFunc || p
a4c0: 2d 3e 78 53 74 65 70 29 20 29 20 70 4d 61 79 62  ->xStep) ) pMayb
a4d0: 65 20 3d 20 70 3b 0a 20 20 20 20 70 20 3d 20 70  e = p;.    p = p
a4e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
a4f0: 66 28 20 70 20 26 26 20 21 63 72 65 61 74 65 46  f( p && !createF
a500: 6c 61 67 20 26 26 20 70 2d 3e 78 46 75 6e 63 3d  lag && p->xFunc=
a510: 3d 30 20 26 26 20 70 2d 3e 78 53 74 65 70 3d 3d  =0 && p->xStep==
a520: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a530: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d  0;.  }.  if( p==
a540: 30 20 26 26 20 70 4d 61 79 62 65 20 29 7b 0a 20  0 && pMaybe ){. 
a550: 20 20 20 61 73 73 65 72 74 28 20 63 72 65 61 74     assert( creat
a560: 65 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  eFlag==0 );.    
a570: 72 65 74 75 72 6e 20 70 4d 61 79 62 65 3b 0a 20  return pMaybe;. 
a580: 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20 26 26   }.  if( p==0 &&
a590: 20 63 72 65 61 74 65 46 6c 61 67 20 26 26 20 28   createFlag && (
a5a0: 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  p = sqliteMalloc
a5b0: 28 73 69 7a 65 6f 66 28 2a 70 29 29 29 21 3d 30  (sizeof(*p)))!=0
a5c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 72 67 20   ){.    p->nArg 
a5d0: 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70 2d 3e 70  = nArg;.    p->p
a5e0: 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20  Next = pFirst;. 
a5f0: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
a600: 65 72 74 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20  ert(&db->aFunc, 
a610: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 28 76  zName, nName, (v
a620: 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 20 20 72  oid*)p);.  }.  r
a630: 65 74 75 72 6e 20 70 3b 0a 7d 0a                 eturn p;.}.