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

Artifact 535c2468cfa9a8d043c6bbe50488849943da237b:


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 32 20 32 30 30 32 2f 30 35 2f 32 33 20 30  .62 2002/05/23 0
0220: 32 3a 30 39 3a 30 34 20 64 72 68 20 45 78 70 20  2:09:04 drh Exp 
0230: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
0240: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a  qliteInt.h".../*
0250: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
0260: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
0270: 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ode and return a
0280: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
0290: 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74   Memory.** for t
02a0: 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74 61  his node is obta
02b0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
02c0: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
02d0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
02e0: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
02f0: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
0300: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
0310: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
0320: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0330: 65 45 78 70 72 28 69 6e 74 20 6f 70 2c 20 45 78  eExpr(int op, Ex
0340: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
0350: 2a 70 52 69 67 68 74 2c 20 54 6f 6b 65 6e 20 2a  *pRight, Token *
0360: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
0370: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
0380: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
0390: 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20  zeof(Expr) );.  
03a0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
03b0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
03c0: 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ete(pLeft);.    
03d0: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
03e0: 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65  (pRight);.    re
03f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
0400: 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ew->op = op;.  p
0410: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65  New->pLeft = pLe
0420: 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  ft;.  pNew->pRig
0430: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 69  ht = pRight;.  i
0440: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
0450: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a   pNew->token = *
0460: 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b  pToken;.  }else{
0470: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
0480: 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  .z = 0;.    pNew
0490: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20  ->token.n = 0;. 
04a0: 20 7d 0a 20 20 69 66 28 20 70 4c 65 66 74 20 26   }.  if( pLeft &
04b0: 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  & pRight ){.    
04c0: 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 70  sqliteExprSpan(p
04d0: 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61  New, &pLeft->spa
04e0: 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70 61 6e  n, &pRight->span
04f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
0500: 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65  pNew->span = pNe
0510: 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20  w->token;.  }.  
0520: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
0530: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
0540: 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6f  pr.token field o
0550: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
0560: 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61  ession to span a
0570: 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74 77 65  ll.** text betwe
0580: 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e  en the two given
0590: 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64   tokens..*/.void
05a0: 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28   sqliteExprSpan(
05b0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
05c0: 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e  en *pLeft, Token
05d0: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
05e0: 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45   pExpr ){.    pE
05f0: 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c  xpr->span.z = pL
0600: 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 70 45 78 70  eft->z;.    pExp
0610: 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67  r->span.n = pRig
0620: 68 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 52 69  ht->n + Addr(pRi
0630: 67 68 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70  ght->z) - Addr(p
0640: 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a  Left->z);.  }.}.
0650: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
0660: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
0670: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e  n node for a fun
0680: 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69  ction with multi
0690: 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ple.** arguments
06a0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
06b0: 65 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 45 78  eExprFunction(Ex
06c0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  prList *pList, T
06d0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
06e0: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70   Expr *pNew;.  p
06f0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
0700: 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29  oc( sizeof(Expr)
0710: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
0720: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  0 ){.    sqliteE
0730: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  xprListDelete(pL
0740: 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
0750: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
0760: 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  op = TK_FUNCTION
0770: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20  ;.  pNew->pList 
0780: 3d 20 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  = pList;.  if( p
0790: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 70 4e 65  Token ){.    pNe
07a0: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
07b0: 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  en;.  }else{.   
07c0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d   pNew->token.z =
07d0: 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   0;.    pNew->to
07e0: 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20  ken.n = 0;.  }. 
07f0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
0800: 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65  ./*.** Recursive
0810: 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70  ly delete an exp
0820: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
0830: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
0840: 44 65 6c 65 74 65 28 45 78 70 72 20 2a 70 29 7b  Delete(Expr *p){
0850: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
0860: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 70  turn;.  if( p->p
0870: 4c 65 66 74 20 29 20 73 71 6c 69 74 65 45 78 70  Left ) sqliteExp
0880: 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74  rDelete(p->pLeft
0890: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67  );.  if( p->pRig
08a0: 68 74 20 29 20 73 71 6c 69 74 65 45 78 70 72 44  ht ) sqliteExprD
08b0: 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29  elete(p->pRight)
08c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74  ;.  if( p->pList
08d0: 20 29 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   ) sqliteExprLis
08e0: 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74  tDelete(p->pList
08f0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  );.  if( p->pSel
0900: 65 63 74 20 29 20 73 71 6c 69 74 65 53 65 6c 65  ect ) sqliteSele
0910: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c  ctDelete(p->pSel
0920: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ect);.  sqliteFr
0930: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
0940: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
0950: 6f 75 70 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73  oup of functions
0960: 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61   are used to tra
0970: 6e 73 6c 61 74 65 20 74 68 65 20 73 74 72 69 6e  nslate the strin
0980: 67 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 6f 66  g.** pointers of
0990: 20 74 6f 6b 65 6e 73 20 69 6e 20 65 78 70 72 65   tokens in expre
09a0: 73 73 69 6f 6e 20 66 72 6f 6d 20 6f 6e 65 20 62  ssion from one b
09b0: 75 66 66 65 72 20 74 6f 20 61 6e 6f 74 68 65 72  uffer to another
09c0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
09d0: 2c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  , the Expr.token
09e0: 2e 7a 20 61 6e 64 20 45 78 70 72 2e 73 70 61 6e  .z and Expr.span
09f0: 2e 7a 20 66 69 65 6c 64 73 20 70 6f 69 6e 74 20  .z fields point 
0a00: 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 6f 72 69 67  into the.** orig
0a10: 69 6e 61 6c 20 69 6e 70 75 74 20 62 75 66 66 65  inal input buffe
0a20: 72 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74  r of an SQL stat
0a30: 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20  ement.  This is 
0a40: 75 73 75 61 6c 6c 79 20 4f 4b 0a 2a 2a 20 73 69  usually OK.** si
0a50: 6e 63 65 20 74 68 65 20 53 51 4c 20 73 74 61 74  nce the SQL stat
0a60: 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75 74 65  ement is execute
0a70: 64 20 61 6e 64 20 74 68 65 20 65 78 70 72 65 73  d and the expres
0a80: 73 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 0a  sion is deleted.
0a90: 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 69 6e  ** before the in
0aa0: 70 75 74 20 62 75 66 66 65 72 20 69 73 20 66 72  put buffer is fr
0ab0: 65 65 64 2e 20 20 4d 61 6b 69 6e 67 20 74 68 65  eed.  Making the
0ac0: 20 74 6f 6b 65 6e 73 20 70 6f 69 6e 74 20 74 6f   tokens point to
0ad0: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
0ae0: 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 73 61   input buffer sa
0af0: 76 65 73 20 6d 61 6e 79 20 63 61 6c 6c 73 20 74  ves many calls t
0b00: 6f 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 74  o malloc() and t
0b10: 68 75 73 20 68 65 6c 70 73 0a 2a 2a 20 74 68 65  hus helps.** the
0b20: 20 6c 69 62 72 61 72 79 20 74 6f 20 72 75 6e 20   library to run 
0b30: 66 61 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 42  faster. .**.** B
0b40: 75 74 20 73 6f 6d 65 74 69 6d 65 73 20 77 65 20  ut sometimes we 
0b50: 6e 65 65 64 20 61 6e 20 65 78 70 72 65 73 73 69  need an expressi
0b60: 6f 6e 20 74 6f 20 70 65 72 73 69 73 74 20 70 61  on to persist pa
0b70: 73 74 20 74 68 65 20 74 69 6d 65 20 77 68 65 6e  st the time when
0b80: 0a 2a 2a 20 74 68 65 20 69 6e 70 75 74 20 62 75  .** the input bu
0b90: 66 66 65 72 20 69 73 20 66 72 65 65 64 2e 20 20  ffer is freed.  
0ba0: 28 45 78 61 6d 70 6c 65 3a 20 54 68 65 20 53 45  (Example: The SE
0bb0: 4c 45 43 54 20 63 6c 61 75 73 65 20 6f 66 20 61  LECT clause of a
0bc0: 0a 2a 2a 20 43 52 45 41 54 45 20 56 49 45 57 20  .** CREATE VIEW 
0bd0: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69  statement contai
0be0: 6e 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ns expressions t
0bf0: 68 61 74 20 6d 75 73 74 20 70 65 72 73 69 73 74  hat must persist
0c00: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 69 66 65   for.** the life
0c10: 20 6f 66 20 74 68 65 20 76 69 65 77 2e 29 20 20   of the view.)  
0c20: 57 68 65 6e 20 74 68 61 74 20 68 61 70 70 65 6e  When that happen
0c30: 73 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  s we have to mak
0c40: 65 20 61 0a 2a 2a 20 70 65 72 73 69 73 74 65 6e  e a.** persisten
0c50: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 6e  t copy of the in
0c60: 70 75 74 20 62 75 66 66 65 72 20 61 6e 64 20 74  put buffer and t
0c70: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 45 78 70  ranslate the Exp
0c80: 72 2e 74 6f 6b 65 6e 2e 7a 0a 2a 2a 20 61 6e 64  r.token.z.** and
0c90: 20 45 78 70 72 2e 73 70 61 6e 2e 7a 20 66 69 65   Expr.span.z fie
0ca0: 6c 64 73 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  lds to point to 
0cb0: 74 68 65 20 63 6f 70 79 20 72 61 74 68 65 72 20  the copy rather 
0cc0: 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6f 72 69  than the .** ori
0cd0: 67 69 6e 61 6c 20 69 6e 70 75 74 20 62 75 66 66  ginal input buff
0ce0: 65 72 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  er.  The followi
0cf0: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
0d00: 69 6e 65 73 20 68 61 6e 64 6c 65 20 74 68 61 74  ines handle that
0d10: 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e  .** translation.
0d20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6f 66 66 73  .**.** The "offs
0d30: 65 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  et" parameter is
0d40: 20 74 68 65 20 64 69 73 74 61 6e 63 65 20 66 72   the distance fr
0d50: 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  om the original 
0d60: 69 6e 70 75 74 20 62 75 66 66 65 72 0a 2a 2a 20  input buffer.** 
0d70: 74 6f 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  to the persisten
0d80: 74 20 63 6f 70 79 2e 20 20 54 68 65 73 65 20 72  t copy.  These r
0d90: 6f 75 74 69 6e 65 73 20 72 65 63 75 72 73 69 76  outines recursiv
0da0: 65 6c 79 20 77 61 6c 6b 20 74 68 65 20 65 6e 74  ely walk the ent
0db0: 69 72 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ire.** expressio
0dc0: 6e 20 74 72 65 65 20 61 6e 64 20 73 68 69 66 74  n tree and shift
0dd0: 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 62 79 20 22   all tokens by "
0de0: 6f 66 66 73 65 74 22 20 61 6d 6f 75 6e 74 2e 0a  offset" amount..
0df0: 2a 2a 0a 2a 2a 20 54 68 65 20 77 6f 72 6b 20 6f  **.** The work o
0e00: 66 20 66 69 67 75 72 69 6e 67 20 6f 75 74 20 74  f figuring out t
0e10: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 22  he appropriate "
0e20: 6f 66 66 73 65 74 22 20 61 6e 64 20 6d 61 6b 69  offset" and maki
0e30: 6e 67 20 74 68 65 0a 2a 2a 20 70 72 65 73 69 73  ng the.** presis
0e40: 74 65 6e 74 20 63 6f 70 79 20 6f 66 20 74 68 65  tent copy of the
0e50: 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73   input buffer is
0e60: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
0e70: 6c 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  ling routine..*/
0e80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
0e90: 4d 6f 76 65 53 74 72 69 6e 67 73 28 45 78 70 72  MoveStrings(Expr
0ea0: 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29   *p, int offset)
0eb0: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
0ec0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
0ed0: 74 6f 6b 65 6e 2e 7a 20 29 20 70 2d 3e 74 6f 6b  token.z ) p->tok
0ee0: 65 6e 2e 7a 20 2b 3d 20 6f 66 66 73 65 74 3b 0a  en.z += offset;.
0ef0: 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20    if( p->span.z 
0f00: 29 20 70 2d 3e 73 70 61 6e 2e 7a 20 2b 3d 20 6f  ) p->span.z += o
0f10: 66 66 73 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  ffset;.  if( p->
0f20: 70 4c 65 66 74 20 29 20 73 71 6c 69 74 65 45 78  pLeft ) sqliteEx
0f30: 70 72 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 2d  prMoveStrings(p-
0f40: 3e 70 4c 65 66 74 2c 20 6f 66 66 73 65 74 29 3b  >pLeft, offset);
0f50: 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74  .  if( p->pRight
0f60: 20 29 20 73 71 6c 69 74 65 45 78 70 72 4d 6f 76   ) sqliteExprMov
0f70: 65 53 74 72 69 6e 67 73 28 70 2d 3e 70 52 69 67  eStrings(p->pRig
0f80: 68 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  ht, offset);.  i
0f90: 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 20 73 71  f( p->pList ) sq
0fa0: 6c 69 74 65 45 78 70 72 4c 69 73 74 4d 6f 76 65  liteExprListMove
0fb0: 53 74 72 69 6e 67 73 28 70 2d 3e 70 4c 69 73 74  Strings(p->pList
0fc0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
0fd0: 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 20 73 71   p->pSelect ) sq
0fe0: 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76 65 53 74  liteSelectMoveSt
0ff0: 72 69 6e 67 73 28 70 2d 3e 70 53 65 6c 65 63 74  rings(p->pSelect
1000: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 76 6f 69  , offset);.}.voi
1010: 64 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  d sqliteExprList
1020: 4d 6f 76 65 53 74 72 69 6e 67 73 28 45 78 70 72  MoveStrings(Expr
1030: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74  List *pList, int
1040: 20 6f 66 66 73 65 74 29 7b 0a 20 20 69 6e 74 20   offset){.  int 
1050: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1060: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1070: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1080: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1090: 20 73 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53   sqliteExprMoveS
10a0: 74 72 69 6e 67 73 28 70 4c 69 73 74 2d 3e 61 5b  trings(pList->a[
10b0: 69 5d 2e 70 45 78 70 72 2c 20 6f 66 66 73 65 74  i].pExpr, offset
10c0: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
10d0: 6c 69 74 65 53 65 6c 65 63 74 4d 6f 76 65 53 74  liteSelectMoveSt
10e0: 72 69 6e 67 73 28 53 65 6c 65 63 74 20 2a 70 53  rings(Select *pS
10f0: 65 6c 65 63 74 2c 20 69 6e 74 20 6f 66 66 73 65  elect, int offse
1100: 74 29 7b 0a 20 20 69 66 28 20 70 53 65 6c 65 63  t){.  if( pSelec
1110: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1120: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 4d   sqliteExprListM
1130: 6f 76 65 53 74 72 69 6e 67 73 28 70 53 65 6c 65  oveStrings(pSele
1140: 63 74 2d 3e 70 45 4c 69 73 74 2c 20 6f 66 66 73  ct->pEList, offs
1150: 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  et);.  sqliteExp
1160: 72 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 53 65  rMoveStrings(pSe
1170: 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 6f 66  lect->pWhere, of
1180: 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 45  fset);.  sqliteE
1190: 78 70 72 4c 69 73 74 4d 6f 76 65 53 74 72 69 6e  xprListMoveStrin
11a0: 67 73 28 70 53 65 6c 65 63 74 2d 3e 70 47 72 6f  gs(pSelect->pGro
11b0: 75 70 42 79 2c 20 6f 66 66 73 65 74 29 3b 0a 20  upBy, offset);. 
11c0: 20 73 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53   sqliteExprMoveS
11d0: 74 72 69 6e 67 73 28 70 53 65 6c 65 63 74 2d 3e  trings(pSelect->
11e0: 70 48 61 76 69 6e 67 2c 20 6f 66 66 73 65 74 29  pHaving, offset)
11f0: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69  ;.  sqliteExprLi
1200: 73 74 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 53  stMoveStrings(pS
1210: 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 2c  elect->pOrderBy,
1220: 20 6f 66 66 73 65 74 29 3b 0a 20 20 73 71 6c 69   offset);.  sqli
1230: 74 65 53 65 6c 65 63 74 4d 6f 76 65 53 74 72 69  teSelectMoveStri
1240: 6e 67 73 28 70 53 65 6c 65 63 74 2d 3e 70 50 72  ngs(pSelect->pPr
1250: 69 6f 72 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  ior, offset);.}.
1260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1270: 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f  wing group of ro
1280: 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70  utines make deep
1290: 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65   copies of expre
12a0: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65  ssions,.** expre
12b0: 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20  ssion lists, ID 
12c0: 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63  lists, and selec
12d0: 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  t statements.  T
12e0: 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a  he copies can.**
12f0: 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20   be deleted (by 
1300: 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20  being passed to 
1310: 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65  their respective
1320: 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75   ...Delete() rou
1330: 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75  tines).** withou
1340: 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20  t effecting the 
1350: 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a  originals..**.**
1360: 20 4e 6f 74 65 2c 20 68 6f 77 65 76 65 72 2c 20   Note, however, 
1370: 74 68 61 74 20 74 68 65 20 45 78 70 72 2e 74 6f  that the Expr.to
1380: 6b 65 6e 2e 7a 20 61 6e 64 20 45 78 70 72 2e 73  ken.z and Expr.s
1390: 70 61 6e 2e 7a 20 66 69 65 6c 64 73 20 70 6f 69  pan.z fields poi
13a0: 6e 74 20 74 6f 0a 2a 2a 20 73 74 72 69 6e 67 20  nt to.** string 
13b0: 73 70 61 63 65 20 74 68 61 74 20 69 73 20 61 6c  space that is al
13c0: 6c 6f 63 61 74 65 64 20 73 65 70 61 72 61 74 65  located separate
13d0: 6c 79 20 66 72 6f 6d 20 74 68 65 20 65 78 70 72  ly from the expr
13e0: 65 73 73 69 6f 6e 20 74 72 65 65 0a 2a 2a 20 69  ession tree.** i
13f0: 74 73 65 6c 66 2e 20 20 54 68 65 73 65 20 72 6f  tself.  These ro
1400: 75 74 69 6e 65 73 20 64 6f 20 4e 4f 54 20 64 75  utines do NOT du
1410: 70 6c 69 63 61 74 65 20 74 68 61 74 20 73 74 72  plicate that str
1420: 69 6e 67 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  ing space..**.**
1430: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1440: 6c 69 73 74 20 61 6e 64 20 49 44 20 6c 69 73 74  list and ID list
1450: 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74   return by sqlit
1460: 65 45 78 70 72 4c 69 73 74 44 75 70 28 29 20 61  eExprListDup() a
1470: 6e 64 20 0a 2a 2a 20 73 71 6c 69 74 65 49 64 4c  nd .** sqliteIdL
1480: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
1490: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
14a0: 6e 64 65 64 20 62 79 20 73 75 62 73 65 71 75 65  nded by subseque
14b0: 6e 74 20 63 61 6c 6c 73 0a 2a 2a 20 74 6f 20 73  nt calls.** to s
14c0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
14d0: 65 6e 64 28 29 20 6f 72 20 73 71 6c 69 74 65 49  end() or sqliteI
14e0: 64 4c 69 73 74 41 70 70 65 6e 64 28 29 2e 0a 2a  dListAppend()..*
14f0: 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20  *.** Any tables 
1500: 74 68 61 74 20 74 68 65 20 49 44 20 6c 69 73 74  that the ID list
1510: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1520: 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
1530: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
1540: 69 74 65 45 78 70 72 44 75 70 28 45 78 70 72 20  iteExprDup(Expr 
1550: 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  *p){.  Expr *pNe
1560: 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  w;.  if( p==0 ) 
1570: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
1580: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1590: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
15a0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
15b0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
15c0: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  >op = p->op;.  p
15d0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
15e0: 69 74 65 45 78 70 72 44 75 70 28 70 2d 3e 70 4c  iteExprDup(p->pL
15f0: 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  eft);.  pNew->pR
1600: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70  ight = sqliteExp
1610: 72 44 75 70 28 70 2d 3e 70 52 69 67 68 74 29 3b  rDup(p->pRight);
1620: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d  .  pNew->pList =
1630: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
1640: 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  up(p->pList);.  
1650: 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pNew->iTable = p
1660: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 70 4e 65 77  ->iTable;.  pNew
1670: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 69  ->iColumn = p->i
1680: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 4e 65 77 2d 3e  Column;.  pNew->
1690: 69 41 67 67 20 3d 20 70 2d 3e 69 41 67 67 3b 0a  iAgg = p->iAgg;.
16a0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
16b0: 70 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 70 4e 65 77  p->token;.  pNew
16c0: 2d 3e 73 70 61 6e 20 3d 20 70 2d 3e 73 70 61 6e  ->span = p->span
16d0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63  ;.  pNew->pSelec
16e0: 74 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  t = sqliteSelect
16f0: 44 75 70 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b  Dup(p->pSelect);
1700: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
1710: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
1720: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 45 78  teExprListDup(Ex
1730: 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45 78  prList *p){.  Ex
1740: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
1750: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
1760: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1770: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
1780: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
1790: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
17a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17b0: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
17c0: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77  p->nExpr;.  pNew
17d0: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ->a = sqliteMall
17e0: 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a  oc( p->nExpr*siz
17f0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
1800: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
1810: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
1820: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
1830: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4e  pr; i++){.    pN
1840: 65 77 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  ew->a[i].pExpr =
1850: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
1860: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1870: 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 4e     pNew->a[i].zN
1880: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
1890: 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  up(p->a[i].zName
18a0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69  );.    pNew->a[i
18b0: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 2d  ].sortOrder = p-
18c0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
18d0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e  .    pNew->a[i].
18e0: 69 73 41 67 67 20 3d 20 70 2d 3e 61 5b 69 5d 2e  isAgg = p->a[i].
18f0: 69 73 41 67 67 3b 0a 20 20 20 20 70 4e 65 77 2d  isAgg;.    pNew-
1900: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a  >a[i].done = 0;.
1910: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
1920: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
1930: 69 74 65 49 64 4c 69 73 74 44 75 70 28 49 64 4c  iteIdListDup(IdL
1940: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
1950: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
1960: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1970: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
1980: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1990: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
19a0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
19b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
19c0: 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b  w->nId = p->nId;
19d0: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
19e0: 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 49  iteMalloc( p->nI
19f0: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
1a00: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
1a10: 3e 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  >a==0 ) return 0
1a20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1a30: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
1a40: 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d   pNew->a[i].zNam
1a50: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
1a60: 28 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  (p->a[i].zName);
1a70: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e  .    pNew->a[i].
1a80: 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 53  zAlias = sqliteS
1a90: 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 41  trDup(p->a[i].zA
1aa0: 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d  lias);.    pNew-
1ab0: 3e 61 5b 69 5d 2e 69 64 78 20 3d 20 70 2d 3e 61  >a[i].idx = p->a
1ac0: 5b 69 5d 2e 69 64 78 3b 0a 20 20 20 20 70 4e 65  [i].idx;.    pNe
1ad0: 77 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30  w->a[i].pTab = 0
1ae0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d  ;.    pNew->a[i]
1af0: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
1b00: 65 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 61 5b  eSelectDup(p->a[
1b10: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  i].pSelect);.  }
1b20: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
1b30: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
1b40: 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74  SelectDup(Select
1b50: 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a   *p){.  Select *
1b60: 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pNew;.  if( p==0
1b70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1b80: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
1b90: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
1ba0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
1bb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
1bc0: 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d  ew->isDistinct =
1bd0: 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
1be0: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
1bf0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
1c00: 75 70 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  up(p->pEList);. 
1c10: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71   pNew->pSrc = sq
1c20: 6c 69 74 65 49 64 4c 69 73 74 44 75 70 28 70 2d  liteIdListDup(p-
1c30: 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e  >pSrc);.  pNew->
1c40: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45  pWhere = sqliteE
1c50: 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65  xprDup(p->pWhere
1c60: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  );.  pNew->pGrou
1c70: 70 42 79 20 3d 20 73 71 6c 69 74 65 45 78 70 72  pBy = sqliteExpr
1c80: 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75  ListDup(p->pGrou
1c90: 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  pBy);.  pNew->pH
1ca0: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 45 78  aving = sqliteEx
1cb0: 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e 67  prDup(p->pHaving
1cc0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
1cd0: 72 42 79 20 3d 20 73 71 6c 69 74 65 45 78 70 72  rBy = sqliteExpr
1ce0: 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72 64 65  ListDup(p->pOrde
1cf0: 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  rBy);.  pNew->op
1d00: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
1d10: 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  ->pPrior = sqlit
1d20: 65 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 50  eSelectDup(p->pP
1d30: 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e  rior);.  pNew->n
1d40: 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69  Limit = p->nLimi
1d50: 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 66 66 73  t;.  pNew->nOffs
1d60: 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b  et = p->nOffset;
1d70: 0a 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 65 63 74  .  pNew->zSelect
1d80: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
1d90: 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  New;.}.../*.** A
1da0: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
1db0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
1dc0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
1dd0: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
1de0: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
1df0: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
1e00: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
1e10: 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  list..*/.ExprLis
1e20: 74 20 2a 73 71 6c 69 74 65 45 78 70 72 4c 69 73  t *sqliteExprLis
1e30: 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74  tAppend(ExprList
1e40: 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70   *pList, Expr *p
1e50: 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  Expr, Token *pNa
1e60: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1e70: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
1e80: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
1e90: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
1ea0: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
1eb0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1ec0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
1ed0: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b  prDelete(pExpr);
1ee0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1ef0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1f00: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26   (pList->nExpr &
1f10: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e   7)==0 ){.    in
1f20: 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  t n = pList->nEx
1f30: 70 72 20 2b 20 38 3b 0a 20 20 20 20 73 74 72 75  pr + 8;.    stru
1f40: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1f50: 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c   *a;.    a = sql
1f60: 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
1f70: 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c  ->a, n*sizeof(pL
1f80: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
1f90: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
1fa0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
1fb0: 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20  ete(pExpr);.    
1fc0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1fd0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
1fe0: 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 69 66  >a = a;.  }.  if
1ff0: 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65  ( pExpr || pName
2000: 20 29 7b 0a 20 20 20 20 69 20 3d 20 70 4c 69 73   ){.    i = pLis
2010: 74 2d 3e 6e 45 78 70 72 2b 2b 3b 0a 20 20 20 20  t->nExpr++;.    
2020: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
2030: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70  r = pExpr;.    p
2040: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
2050: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4e   = 0;.    if( pN
2060: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
2070: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
2080: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
2090: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
20a0: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  e->n, 0);.      
20b0: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 70 4c  sqliteDequote(pL
20c0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
20d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
20e0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
20f0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
2100: 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e  ntire expression
2110: 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
2120: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
2130: 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ete(ExprList *pL
2140: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
2150: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
2160: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
2170: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
2180: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
2190: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c  iteExprDelete(pL
21a0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
21b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
21c0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
21d0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
21e0: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
21f0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
2200: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ist);.}../*.** W
2210: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
2220: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
2230: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
2240: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
2250: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
2260: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
2270: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
2280: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
2290: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
22a0: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
22b0: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
22c0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
22d0: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
22e0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
22f0: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
2300: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
2310: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
2320: 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  eExprIsConstant(
2330: 45 78 70 72 20 2a 70 29 7b 0a 20 20 73 77 69 74  Expr *p){.  swit
2340: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
2350: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
2360: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
2370: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
2380: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
2390: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
23a0: 52 49 4e 47 3a 0a 20 20 20 20 20 20 72 65 74 75  RING:.      retu
23b0: 72 6e 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  rn p->token.z[0]
23c0: 3d 3d 27 5c 27 27 3b 0a 20 20 20 20 63 61 73 65  =='\'';.    case
23d0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
23e0: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
23f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2400: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
2410: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66       if( p->pLef
2420: 74 20 26 26 20 21 73 71 6c 69 74 65 45 78 70 72  t && !sqliteExpr
2430: 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c  IsConstant(p->pL
2440: 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
2450: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 52  .      if( p->pR
2460: 69 67 68 74 20 26 26 20 21 73 71 6c 69 74 65 45  ight && !sqliteE
2470: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d  xprIsConstant(p-
2480: 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72  >pRight) ) retur
2490: 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 0;.      if( p
24a0: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
24b0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
24c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
24d0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
24e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
24f0: 28 20 21 73 71 6c 69 74 65 45 78 70 72 49 73 43  ( !sqliteExprIsC
2500: 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 69 73 74  onstant(p->pList
2510: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20  ->a[i].pExpr) ) 
2520: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
2530: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2540: 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 4c 65 66    return p->pLef
2550: 74 21 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  t!=0 || p->pRigh
2560: 74 21 3d 30 20 7c 7c 20 28 70 2d 3e 70 4c 69 73  t!=0 || (p->pLis
2570: 74 20 26 26 20 70 2d 3e 70 4c 69 73 74 2d 3e 6e  t && p->pList->n
2580: 45 78 70 72 3e 30 29 3b 0a 20 20 20 20 7d 0a 20  Expr>0);.    }. 
2590: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
25a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
25b0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
25c0: 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77   string is a row
25d0: 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  -id column name.
25e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
25f0: 71 6c 69 74 65 49 73 52 6f 77 69 64 28 63 6f 6e  qliteIsRowid(con
2600: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
2610: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
2620: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
2630: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
2640: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
2650: 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
2660: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
2670: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
2680: 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20  (z, "OID")==0 ) 
2690: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
26a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
26b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
26c0: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
26d0: 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65  tree and resolve
26e0: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a  s references to.
26f0: 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ** table columns
2700: 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20  .  Nodes of the 
2710: 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44  form ID.ID or ID
2720: 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e   resolve into an
2730: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65  .** index to the
2740: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61   table in the ta
2750: 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63  ble list and a c
2760: 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54  olumn offset.  T
2770: 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f  he .** Expr.opco
2780: 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65  de for such node
2790: 73 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  s is changed to 
27a0: 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20  TK_COLUMN.  The 
27b0: 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76  Expr.iTable.** v
27c0: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
27d0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
27e0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
27f0: 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
2800: 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22 62 61  .** plus the "ba
2810: 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68 65 20  se" value.  The 
2820: 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c 6c 20  base value will 
2830: 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d  ultimately becom
2840: 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63 75  e the.** VDBE cu
2850: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2860: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73  a cursor that is
2870: 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74   pointing into t
2880: 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  he referenced.**
2890: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70   table.  The Exp
28a0: 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  r.iColumn value 
28b0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
28c0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
28d0: 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65  olumn .** of the
28e0: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
28f0: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
2900: 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20 74  lumn value for t
2910: 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f  he special.** RO
2920: 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31  WID column is -1
2930: 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20 50  .  Any INTEGER P
2940: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
2950: 6e 20 69 73 20 74 72 69 65 64 20 61 73 20 61 6e  n is tried as an
2960: 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52 4f  .** alias for RO
2970: 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 6c  WID..**.** We al
2980: 73 6f 20 63 68 65 63 6b 20 66 6f 72 20 69 6e 73  so check for ins
2990: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 49 4e  tances of the IN
29a0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 4e 20 63   operator.  IN c
29b0: 6f 6d 65 73 20 69 6e 20 74 77 6f 0a 2a 2a 20 66  omes in two.** f
29c0: 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  orms:.**.**     
29d0: 20 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65        expr IN (e
29e0: 78 70 72 6c 69 73 74 29 0a 2a 2a 20 61 6e 64 0a  xprlist).** and.
29f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78 70  **           exp
2a00: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
2a10: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ).**.** The firs
2a20: 74 20 66 6f 72 6d 20 69 73 20 68 61 6e 64 6c 65  t form is handle
2a30: 64 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  d by creating a 
2a40: 73 65 74 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  set holding the 
2a50: 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 6f 77  list.** of allow
2a60: 65 64 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20  ed values.  The 
2a70: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 61 75 73  second form caus
2a80: 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 74 6f  es the SELECT to
2a90: 20 67 65 6e 65 72 61 74 65 20 0a 2a 2a 20 61 20   generate .** a 
2aa0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
2ab0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2ac0: 69 6e 65 20 61 6c 73 6f 20 6c 6f 6f 6b 73 20 66  ine also looks f
2ad0: 6f 72 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54  or scalar SELECT
2ae0: 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20  s that are part 
2af0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
2b00: 2e 0a 2a 2a 20 49 66 20 69 74 20 66 69 6e 64 73  ..** If it finds
2b10: 20 61 6e 79 2c 20 69 74 20 67 65 6e 65 72 61 74   any, it generat
2b20: 65 73 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  es code to write
2b30: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2b40: 61 74 20 73 65 6c 65 63 74 0a 2a 2a 20 69 6e 74  at select.** int
2b50: 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  o a memory cell.
2b60: 0a 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f 77 6e 20 63  .**.** Unknown c
2b70: 6f 6c 75 6d 6e 73 20 6f 72 20 74 61 62 6c 65 73  olumns or tables
2b80: 20 70 72 6f 76 6f 6b 65 20 61 6e 20 65 72 72 6f   provoke an erro
2b90: 72 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  r.  The function
2ba0: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
2bb0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
2bc0: 20 73 65 65 6e 20 61 6e 64 20 6c 65 61 76 65 73   seen and leaves
2bd0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2be0: 65 20 6f 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e on pParse->zEr
2bf0: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
2c00: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
2c10: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
2c20: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
2c30: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
2c40: 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20  .  int base,    
2c50: 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
2c60: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2c70: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70  first entry in p
2c80: 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 49 64 4c  TabList */.  IdL
2c90: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
2ca0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
2cb0: 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  s used to resolv
2cc0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
2cd0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
2ce0: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
2cf0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  f expressions us
2d00: 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 22 41  ed to resolve "A
2d10: 53 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  S" */.  Expr *pE
2d20: 78 70 72 20 20 20 20 20 20 20 20 2f 2a 20 54 68  xpr        /* Th
2d30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
2d40: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a  be analyzed. */.
2d50: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
2d60: 30 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30  0 || pTabList==0
2d70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
2d80: 73 73 65 72 74 28 20 62 61 73 65 2b 70 54 61 62  ssert( base+pTab
2d90: 4c 69 73 74 2d 3e 6e 49 64 3c 3d 70 50 61 72 73  List->nId<=pPars
2da0: 65 2d 3e 6e 54 61 62 20 29 3b 0a 20 20 73 77 69  e->nTab );.  swi
2db0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
2dc0: 7b 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d  {.    /* Double-
2dd0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28  quoted strings (
2de0: 65 78 3a 20 22 61 62 63 22 29 20 61 72 65 20 75  ex: "abc") are u
2df0: 73 65 64 20 61 73 20 69 64 65 6e 74 69 66 69 65  sed as identifie
2e00: 72 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73  rs if.    ** pos
2e10: 73 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  sible.  Otherwis
2e20: 65 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73  e they remain as
2e30: 20 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c   strings.  Singl
2e40: 65 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20  e-quoted.    ** 
2e50: 73 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62  strings (ex: 'ab
2e60: 63 27 29 20 61 72 65 20 61 6c 77 61 79 73 20 73  c') are always s
2e70: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a  tring literals..
2e80: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
2e90: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
2ea0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f     if( pExpr->to
2eb0: 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29  ken.z[0]=='\'' )
2ec0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a   break;.      /*
2ed0: 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20   Fall thru into 
2ee0: 74 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69  the TK_ID case i
2ef0: 66 20 74 68 69 73 20 69 73 20 61 20 64 6f 75 62  f this is a doub
2f00: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
2f10: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a   */.    }.    /*
2f20: 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69   A lone identifi
2f30: 65 72 2e 20 20 54 72 79 20 61 6e 64 20 6d 61 74  er.  Try and mat
2f40: 63 68 20 69 74 20 61 73 20 66 6f 6c 6c 6f 77 73  ch it as follows
2f50: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2f60: 20 20 20 20 31 2e 20 20 54 6f 20 74 68 65 20 6e      1.  To the n
2f70: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ame of a column 
2f80: 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  of one of the ta
2f90: 62 6c 65 73 20 69 6e 20 70 54 61 62 4c 69 73 74  bles in pTabList
2fa0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2fb0: 20 20 20 32 2e 20 20 54 6f 20 74 68 65 20 72 69     2.  To the ri
2fc0: 67 68 74 20 73 69 64 65 20 6f 66 20 61 6e 20 41  ght side of an A
2fd0: 53 20 6b 65 79 77 6f 72 64 20 69 6e 20 74 68 65  S keyword in the
2fe0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 6f 66 0a   column list of.
2ff0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 61      **         a
3000: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3010: 74 2e 20 20 28 46 6f 72 20 65 78 61 6d 70 6c 65  t.  (For example
3020: 2c 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  , match against 
3030: 27 78 27 20 69 6e 0a 20 20 20 20 2a 2a 20 20 20  'x' in.    **   
3040: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 61 2b        "SELECT a+
3050: 62 20 41 53 20 27 78 27 20 46 52 4f 4d 20 74 31  b AS 'x' FROM t1
3060: 22 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ".).    **.    *
3070: 2a 20 20 20 20 20 33 2e 20 20 4f 6e 65 20 6f 66  *     3.  One of
3080: 20 74 68 65 20 73 70 65 63 69 61 6c 20 6e 61 6d   the special nam
3090: 65 73 20 22 52 4f 57 49 44 22 2c 20 22 4f 49 44  es "ROWID", "OID
30a0: 22 2c 20 6f 72 20 22 5f 52 4f 57 49 44 5f 22 2e  ", or "_ROWID_".
30b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
30c0: 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20   TK_ID: {.      
30d0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20  int cnt = 0;    
30e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
30f0: 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
3100: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
3110: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
3120: 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  r */.      char 
3130: 2a 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  *z;.      assert
3140: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  ( pExpr->token.z
3150: 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   );.      z = sq
3160: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78 70  liteStrNDup(pExp
3170: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
3180: 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
3190: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
31a0: 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  (z);.      if( z
31b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
31c0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
31d0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20  <pTabList->nId; 
31e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
31f0: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 54 61 62  t j;.        Tab
3200: 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c  le *pTab = pTabL
3210: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a  ist->a[i].pTab;.
3220: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
3230: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
3240: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3250: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
3260: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
3270: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
3280: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
3290: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
32a0: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  (pTab->aCol[j].z
32b0: 4e 61 6d 65 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20  Name, z)==0 ){. 
32c0: 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
32d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
32e0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20  xpr->iTable = i 
32f0: 2b 20 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20  + base;.        
3300: 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d      if( j==pTab-
3310: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
3320: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74          /* Subst
3330: 69 74 75 74 65 20 74 68 65 20 72 65 63 6f 72 64  itute the record
3340: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
3350: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
3360: 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  KEY */.         
3370: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
3380: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
3390: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33a0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
33b0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  ->iColumn = j;. 
33c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
33d0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
33e0: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
33f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3400: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3410: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26      if( cnt==0 &
3420: 26 20 70 45 4c 69 73 74 21 3d 30 20 29 7b 0a 20  & pEList!=0 ){. 
3430: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
3440: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3450: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
3460: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
3470: 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69  char *zAs = pELi
3480: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
3490: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 41            if( zA
34a0: 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 53 74  s!=0 && sqliteSt
34b0: 72 49 43 6d 70 28 7a 41 73 2c 20 7a 29 3d 3d 30  rICmp(zAs, z)==0
34c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34d0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
34e0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
34f0: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
3500: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
3510: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
3520: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b  xpr->op = TK_AS;
3530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
3540: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  pr->iColumn = j;
3550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
3560: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr->pLeft = sqli
3570: 74 65 45 78 70 72 44 75 70 28 70 45 4c 69 73 74  teExprDup(pEList
3580: 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[j].pExpr);. 
3590: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
35a0: 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 20 20     } .      }.  
35b0: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26      if( cnt==0 &
35c0: 26 20 73 71 6c 69 74 65 49 73 52 6f 77 69 64 28  & sqliteIsRowid(
35d0: 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  z) ){.        pE
35e0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
35f0: 31 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  1;.        pExpr
3600: 2d 3e 69 54 61 62 6c 65 20 3d 20 62 61 73 65 3b  ->iTable = base;
3610: 0a 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31  .        cnt = 1
3620: 20 2b 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 49   + (pTabList->nI
3630: 64 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 70 45  d>1);.        pE
3640: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
3650: 55 4d 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UMN;.      }.   
3660: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
3670: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d  ;.      if( cnt=
3680: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 74 6f 6b  =0 && pExpr->tok
3690: 65 6e 2e 7a 5b 30 5d 21 3d 27 22 27 20 29 7b 0a  en.z[0]!='"' ){.
36a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
36b0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
36c0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
36d0: 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 22 2c 20 2d  uch column: ", -
36e0: 31 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 70  1,  .          p
36f0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
3700: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30  Expr->token.n, 0
3710: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
3720: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3730: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3740: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6e 74     }else if( cnt
3750: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >1 ){.        sq
3760: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
3770: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
3780: 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75   "ambiguous colu
3790: 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 2d 31 2c 20  mn name: ", -1, 
37a0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70   .          pExp
37b0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
37c0: 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a  r->token.n, 0);.
37d0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
37e0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
37f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3800: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 0a  }.      break; .
3810: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
3820: 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  A table name and
3830: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 49   column name:  I
3840: 44 2e 49 44 20 2a 2f 0a 20 20 20 20 63 61 73 65  D.ID */.    case
3850: 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_DOT: {.     
3860: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20   int cnt = 0;   
3870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3880: 62 65 72 20 6f 66 20 6d 61 74 63 68 65 73 20 2a  ber of matches *
3890: 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 54  /.      int cntT
38a0: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
38b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
38c0: 74 63 68 69 6e 67 20 74 61 62 6c 65 73 20 2a 2f  tching tables */
38d0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
3900: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
3910: 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 20 20  Left, *pRight;  
3920: 20 20 2f 2a 20 4c 65 66 74 20 61 6e 64 20 72 69    /* Left and ri
3930: 67 68 74 20 73 75 62 62 72 61 6e 63 68 65 73 20  ght subbranches 
3940: 6f 66 20 74 68 65 20 65 78 70 72 20 2a 2f 0a 20  of the expr */. 
3950: 20 20 20 20 20 63 68 61 72 20 2a 7a 4c 65 66 74       char *zLeft
3960: 2c 20 2a 7a 52 69 67 68 74 3b 20 20 20 20 2f 2a  , *zRight;    /*
3970: 20 54 65 78 74 20 6f 66 20 61 6e 20 69 64 65 6e   Text of an iden
3980: 74 69 66 69 65 72 20 2a 2f 0a 0a 20 20 20 20 20  tifier */..     
3990: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
39a0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 69  pLeft;.      pRi
39b0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
39c0: 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
39d0: 74 28 20 70 4c 65 66 74 20 26 26 20 70 4c 65 66  t( pLeft && pLef
39e0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 26 26 20  t->op==TK_ID && 
39f0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  pLeft->token.z )
3a00: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3a10: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
3a20: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 26 26 20 70  ->op==TK_ID && p
3a30: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  Right->token.z )
3a40: 3b 0a 20 20 20 20 20 20 7a 4c 65 66 74 20 3d 20  ;.      zLeft = 
3a50: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4c  sqliteStrNDup(pL
3a60: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c  eft->token.z, pL
3a70: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  eft->token.n);. 
3a80: 20 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71       zRight = sq
3a90: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 52 69 67  liteStrNDup(pRig
3aa0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69  ht->token.z, pRi
3ab0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  ght->token.n);. 
3ac0: 20 20 20 20 20 69 66 28 20 7a 4c 65 66 74 3d 3d       if( zLeft==
3ad0: 30 20 7c 7c 20 7a 52 69 67 68 74 3d 3d 30 20 29  0 || zRight==0 )
3ae0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3af0: 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 20  Free(zLeft);.   
3b00: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
3b10: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  zRight);.       
3b20: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
3b30: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44   }.      sqliteD
3b40: 65 71 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20  equote(zLeft);. 
3b50: 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f       sqliteDequo
3b60: 74 65 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  te(zRight);.    
3b70: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
3b80: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 66 6f 72 28  = -1;.      for(
3b90: 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
3ba0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
3bb0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
3bc0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20     char *zTab;. 
3bd0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
3be0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
3bf0: 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [i].pTab;.      
3c00: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
3c10: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3c20: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
3c30: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  nCol>0 );.      
3c40: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
3c50: 61 5b 69 5d 2e 7a 41 6c 69 61 73 20 29 7b 0a 20  a[i].zAlias ){. 
3c60: 20 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20           zTab = 
3c70: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
3c80: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 7d  Alias;.        }
3c90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
3ca0: 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTab = pTab->zNa
3cb0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  me;.        }.  
3cc0: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 3d 3d        if( zTab==
3cd0: 30 20 7c 7c 20 73 71 6c 69 74 65 53 74 72 49 43  0 || sqliteStrIC
3ce0: 6d 70 28 7a 54 61 62 2c 20 7a 4c 65 66 74 29 21  mp(zTab, zLeft)!
3cf0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
3d00: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63         if( 0==(c
3d10: 6e 74 54 61 62 2b 2b 29 20 29 20 70 45 78 70 72  ntTab++) ) pExpr
3d20: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 2b 20 62  ->iTable = i + b
3d30: 61 73 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ase;.        for
3d40: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
3d50: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
3d60: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
3d70: 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c  rICmp(pTab->aCol
3d80: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 52 69 67 68  [j].zName, zRigh
3d90: 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
3da0: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
3db0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
3dc0: 54 61 62 6c 65 20 3d 20 69 20 2b 20 62 61 73 65  Table = i + base
3dd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
3de0: 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  ( j==pTab->iPKey
3df0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3e00: 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
3e10: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
3e20: 72 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45  r for the INTEGE
3e30: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f  R PRIMARY KEY */
3e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3e50: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
3e60: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
3e70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3e80: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
3e90: 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
3ea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3eb0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
3ec0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
3ed0: 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c  f we have not al
3ee0: 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74  ready resolved t
3ef0: 68 69 73 20 2a 2e 2a 20 65 78 70 72 65 73 73 69  his *.* expressi
3f00: 6f 6e 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a  on, then maybe .
3f10: 20 20 20 20 20 20 20 2a 20 69 74 20 69 73 20 61         * it is a
3f20: 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
3f30: 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74  trigger argument
3f40: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20   reference */.  
3f50: 20 20 20 20 69 66 28 20 63 6e 74 20 3d 3d 20 30      if( cnt == 0
3f60: 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67   && pParse->trig
3f70: 53 74 61 63 6b 20 21 3d 20 30 20 29 7b 0a 20 20  Stack != 0 ){.  
3f80: 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74 61        TriggerSta
3f90: 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61 63  ck *pTriggerStac
3fa0: 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67  k = pParse->trig
3fb0: 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 69  Stack;.        i
3fc0: 6e 74 20 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt t = 0;.      
3fd0: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
3fe0: 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d  ack->newIdx != -
3ff0: 31 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43  1 && sqliteStrIC
4000: 6d 70 28 22 6e 65 77 22 2c 20 7a 4c 65 66 74 29  mp("new", zLeft)
4010: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20   == 0 ){.       
4020: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
4030: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
4040: 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20 20  ->newIdx;.      
4050: 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20      cntTab++;.  
4060: 20 20 20 20 20 20 20 20 74 20 3d 20 31 3b 0a 20          t = 1;. 
4070: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4080: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61   if( pTriggerSta
4090: 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31  ck->oldIdx != -1
40a0: 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d   && sqliteStrICm
40b0: 70 28 22 6f 6c 64 22 2c 20 7a 4c 65 66 74 29 20  p("old", zLeft) 
40c0: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
40d0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
40e0: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
40f0: 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 20  >oldIdx;.       
4100: 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20     cntTab++;.   
4110: 20 20 20 20 20 20 20 74 20 3d 20 31 3b 0a 20 20         t = 1;.  
4120: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
4130: 20 69 66 28 20 74 20 29 7b 20 0a 09 20 20 69 6e   if( t ){ ..  in
4140: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 66  t j;.          f
4150: 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20 70 54 72 69  or(j=0; j < pTri
4160: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 2d  ggerStack->pTab-
4170: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 20 7b 0a 20 20  >nCol; j++) {.  
4180: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
4190: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 54 72 69  liteStrICmp(pTri
41a0: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 2d  ggerStack->pTab-
41b0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
41c0: 7a 52 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20  zRight)==0 ){.  
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b              cnt+
41e0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
41f0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
4200: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
4210: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 09   }.          }..
4220: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
4230: 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63   if( cnt==0 && c
4240: 6e 74 54 61 62 3d 3d 31 20 26 26 20 73 71 6c 69  ntTab==1 && sqli
4250: 74 65 49 73 52 6f 77 69 64 28 7a 52 69 67 68 74  teIsRowid(zRight
4260: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74  ) ){.        cnt
4270: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 45   = 1;.        pE
4280: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
4290: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
42a0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 65 66   sqliteFree(zLef
42b0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
42c0: 46 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 20 20  Free(zRight);.  
42d0: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29      if( cnt==0 )
42e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
42f0: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
4300: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
4310: 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 22 2c   such column: ",
4320: 20 2d 31 2c 20 20 0a 20 20 20 20 20 20 20 20 20   -1,  .         
4330: 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pLeft->token.z,
4340: 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pLeft->token.n,
4350: 20 22 2e 22 2c 20 31 2c 20 0a 20 20 20 20 20 20   ".", 1, .      
4360: 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65      pRight->toke
4370: 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e 74 6f 6b  n.z, pRight->tok
4380: 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  en.n, 0);.      
4390: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
43a0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
43b0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
43c0: 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a 20 20 20  if( cnt>1 ){.   
43d0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
43e0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
43f0: 45 72 72 4d 73 67 2c 20 22 61 6d 62 69 67 75 6f  ErrMsg, "ambiguo
4400: 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  us column name: 
4410: 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20 20 20  ", -1,  .       
4420: 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e     pLeft->token.
4430: 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e  z, pLeft->token.
4440: 6e 2c 20 22 2e 22 2c 20 31 2c 0a 20 20 20 20 20  n, ".", 1,.     
4450: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f 6b       pRight->tok
4460: 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e 74 6f  en.z, pRight->to
4470: 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ken.n, 0);.     
4480: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
4490: 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  +;.        retur
44a0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
44b0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
44c0: 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ete(pLeft);.    
44d0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
44e0: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
44f0: 45 78 70 72 44 65 6c 65 74 65 28 70 52 69 67 68  ExprDelete(pRigh
4500: 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
4510: 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  >pRight = 0;.   
4520: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
4530: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
4540: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4550: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
4560: 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
4570: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
4580: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
4590: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   v==0 ) return 1
45a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
45b0: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
45c0: 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70  (pParse, base, p
45d0: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  TabList, pEList,
45e0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29   pExpr->pLeft) )
45f0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4600: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
4610: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
4620: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
4630: 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
4640: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
4650: 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..).        **. 
4660: 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
4670: 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
4680: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
4690: 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
46a0: 61 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  a temporary.    
46b0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 54      ** table.  T
46c0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
46d0: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
46e0: 79 20 74 61 62 6c 65 20 68 61 73 20 61 6c 72 65  y table has alre
46f0: 61 64 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ady.        ** b
4700: 65 65 6e 20 70 75 74 20 69 6e 20 69 54 61 62 6c  een put in iTabl
4710: 65 20 62 79 20 73 71 6c 69 74 65 45 78 70 72 52  e by sqliteExprR
4720: 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 29  esolveInSelect()
4730: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
4740: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
4750: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
4760: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b++;.        sql
4770: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4780: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 70 45 78  OP_OpenTemp, pEx
4790: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a  pr->iTable, 1);.
47a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
47b0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
47c0: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  pr->pSelect, SRT
47d0: 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
47e0: 62 6c 65 2c 20 30 2c 30 2c 30 29 3b 0a 20 20 20  ble, 0,0,0);.   
47f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
4800: 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pr->pList ){.   
4810: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20       /* Case 2: 
4820: 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70      expr IN (exp
4830: 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a  rlist).        *
4840: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65  *.        ** Cre
4850: 61 74 65 20 61 20 73 65 74 20 74 6f 20 70 75 74  ate a set to put
4860: 20 74 68 65 20 65 78 70 72 6c 69 73 74 20 76 61   the exprlist va
4870: 6c 75 65 73 20 69 6e 2e 20 20 54 68 65 20 53 65  lues in.  The Se
4880: 74 20 69 64 20 69 73 20 73 74 6f 72 65 64 0a 20  t id is stored. 
4890: 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 69 54 61         ** in iTa
48a0: 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ble..        */.
48b0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 69          int i, i
48c0: 53 65 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Set;.        for
48d0: 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70  (i=0; i<pExpr->p
48e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
48f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
4900: 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e  r *pE2 = pExpr->
4910: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
4920: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  r;.          if(
4930: 20 21 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f   !sqliteExprIsCo
4940: 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20  nstant(pE2) ){. 
4950: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
4960: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
4970: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 0a 20 20 20  se->zErrMsg,.   
4980: 20 20 20 20 20 20 20 20 20 20 20 22 72 69 67 68             "righ
4990: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49  t-hand side of I
49a0: 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20  N operator must 
49b0: 62 65 20 63 6f 6e 73 74 61 6e 74 22 2c 20 30 29  be constant", 0)
49c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  ;.            pP
49d0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
49e0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
49f0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
4a00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
4a10: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
4a20: 61 72 73 65 2c 20 70 45 32 2c 20 30 2c 20 30 29  arse, pE2, 0, 0)
4a30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4a40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
4a50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
4a60: 20 20 20 20 20 20 20 20 69 53 65 74 20 3d 20 70          iSet = p
4a70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
4a80: 50 61 72 73 65 2d 3e 6e 53 65 74 2b 2b 3b 0a 20  Parse->nSet++;. 
4a90: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
4aa0: 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  i<pExpr->pList->
4ab0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
4ac0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
4ad0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
4ae0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
4af0: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70         switch( p
4b00: 45 32 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20  E2->op ){.      
4b10: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c        case TK_FL
4b20: 4f 41 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OAT:.           
4b30: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
4b40: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  :.            ca
4b50: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
4b70: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56  t addr = sqliteV
4b80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4b90: 65 74 49 6e 73 65 72 74 2c 20 69 53 65 74 2c 20  etInsert, iSet, 
4ba0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
4bb0: 20 20 61 73 73 65 72 74 28 20 70 45 32 2d 3e 74    assert( pE2->t
4bc0: 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20  oken.z );.      
4bd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4be0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
4bf0: 64 72 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e 7a  dr, pE2->token.z
4c00: 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  , pE2->token.n);
4c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
4c20: 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74 65  qliteVdbeDequote
4c30: 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  P3(v, addr);.   
4c40: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
4c50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
4c70: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ult: {.         
4c80: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
4c90: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32 29  ode(pParse, pE2)
4ca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4cb0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4cc0: 76 2c 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c  v, OP_SetInsert,
4cd0: 20 69 53 65 74 2c 20 30 29 3b 0a 20 20 20 20 20   iSet, 0);.     
4ce0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4d00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4d10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4d20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4d30: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
4d40: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
4d50: 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
4d60: 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
4d70: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
4d80: 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
4d90: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
4da0: 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
4db0: 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
4dc0: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
4dd0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
4de0: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
4df0: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
4e00: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
4e10: 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  umn = pParse->nM
4e20: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  em++;.      if( 
4e30: 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61  sqliteSelect(pPa
4e40: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c  rse, pExpr->pSel
4e50: 65 63 74 2c 20 53 52 54 5f 4d 65 6d 2c 20 70 45  ect, SRT_Mem, pE
4e60: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 30 2c 30  xpr->iColumn,0,0
4e70: 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ,0) ){.        r
4e80: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
4e90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4ea0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
4eb0: 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20 72  all else, just r
4ec0: 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20  ecursively walk 
4ed0: 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 20 20  the tree */.    
4ee0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4ef0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
4f00: 74 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  t.      && sqlit
4f10: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
4f20: 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 70 54  pParse, base, pT
4f30: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  abList, pEList, 
4f40: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b  pExpr->pLeft) ){
4f50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4f60: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
4f70: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
4f80: 68 74 20 0a 20 20 20 20 20 20 26 26 20 73 71 6c  ht .      && sql
4f90: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
4fa0: 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  s(pParse, base, 
4fb0: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
4fc0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
4fd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4fe0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
4ff0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
5000: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
5010: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45  int i;.        E
5020: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
5030: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
5040: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
5050: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
5060: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
5070: 45 78 70 72 20 2a 70 41 72 67 20 3d 20 70 4c 69  Expr *pArg = pLi
5080: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
5090: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
50a0: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
50b0: 64 73 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ds(pParse, base,
50c0: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
50d0: 74 2c 20 70 41 72 67 29 20 29 7b 0a 20 20 20 20  t, pArg) ){.    
50e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
50f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5110: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5120: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  rn 0;.}../*.** E
5130: 72 72 6f 72 20 63 68 65 63 6b 20 74 68 65 20 66  rror check the f
5140: 75 6e 63 74 69 6f 6e 73 20 69 6e 20 61 6e 20 65  unctions in an e
5150: 78 70 72 65 73 73 69 6f 6e 2e 20 20 4d 61 6b 65  xpression.  Make
5160: 20 73 75 72 65 20 61 6c 6c 0a 2a 2a 20 66 75 6e   sure all.** fun
5170: 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65 20  ction names are 
5180: 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 61  recognized and a
5190: 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76  ll functions hav
51a0: 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
51b0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
51c0: 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61 6e 20  ents.  Leave an 
51d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
51e0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
51f0: 0a 2a 2a 20 69 66 20 61 6e 79 74 68 69 6e 67 20  .** if anything 
5200: 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74 75 72  is amiss.  Retur
5210: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5220: 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 69 66  errors..**.** if
5230: 20 70 49 73 41 67 67 20 69 73 20 6e 6f 74 20 6e   pIsAgg is not n
5240: 75 6c 6c 20 61 6e 64 20 74 68 69 73 20 65 78 70  ull and this exp
5250: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 61 67  ression is an ag
5260: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
5270: 0a 2a 2a 20 28 6c 69 6b 65 20 63 6f 75 6e 74 28  .** (like count(
5280: 2a 29 20 6f 72 20 6d 61 78 28 76 61 6c 75 65 29  *) or max(value)
5290: 29 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 31  ) then write a 1
52a0: 20 69 6e 74 6f 20 2a 70 49 73 41 67 67 2e 0a 2a   into *pIsAgg..*
52b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72  /.int sqliteExpr
52c0: 43 68 65 63 6b 28 50 61 72 73 65 20 2a 70 50 61  Check(Parse *pPa
52d0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
52e0: 2c 20 69 6e 74 20 61 6c 6c 6f 77 41 67 67 2c 20  , int allowAgg, 
52f0: 69 6e 74 20 2a 70 49 73 41 67 67 29 7b 0a 20 20  int *pIsAgg){.  
5300: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20  int nErr = 0;.  
5310: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
5320: 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63  eturn 0;.  switc
5330: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
5340: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
5350: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TION: {.      in
5360: 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  t n = pExpr->pLi
5370: 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73  st ? pExpr->pLis
5380: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  t->nExpr : 0;.  
5390: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
53a0: 66 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  func = 0;.      
53b0: 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72  int wrong_num_ar
53c0: 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  gs = 0;.      in
53d0: 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20  t is_agg = 0;.  
53e0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
53f0: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a   FuncDef *pDef;.
5400: 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
5410: 6c 69 74 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e  liteFindFunction
5420: 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
5430: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
5440: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
5450: 65 6e 2e 6e 2c 20 6e 2c 20 30 29 3b 0a 20 20 20  en.n, n, 0);.   
5460: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
5470: 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
5480: 20 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74   sqliteFindFunct
5490: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
54a0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
54b0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
54c0: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 2d 31 2c 20 30  ->token.n, -1, 0
54d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
54e0: 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Def==0 ){.      
54f0: 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63      no_such_func
5500: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
5510: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
5520: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
5530: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
5540: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5550: 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d    is_agg = pDef-
5560: 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20  >xFunc==0;.     
5570: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
5580: 61 67 67 20 26 26 20 21 61 6c 6c 6f 77 41 67 67  agg && !allowAgg
5590: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
55a0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
55b0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
55c0: 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
55d0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 22 2c 20  ate function ", 
55e0: 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  -1,.           p
55f0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
5600: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22  Expr->token.n, "
5610: 28 29 22 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  ()", 2, 0);.    
5620: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5630: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72  ++;.        nErr
5640: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61  ++;.        is_a
5650: 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  gg = 0;.      }e
5660: 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f  lse if( no_such_
5670: 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  func ){.        
5680: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
5690: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
56a0: 67 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63  g, "no such func
56b0: 74 69 6f 6e 3a 20 22 2c 20 2d 31 2c 0a 20 20 20  tion: ", -1,.   
56c0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
56d0: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
56e0: 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20  oken.n, 0);.    
56f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5700: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72  ++;.        nErr
5710: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
5720: 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72  if( wrong_num_ar
5730: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  gs ){.        sq
5740: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
5750: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
5760: 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 77 72   .           "wr
5770: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
5780: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
5790: 69 6f 6e 20 22 2c 2d 31 2c 0a 20 20 20 20 20 20  ion ",-1,.      
57a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
57b0: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
57c0: 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c 20 30 29  n.n, "()", 2, 0)
57d0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
57e0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
57f0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
5800: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
5810: 67 67 20 29 20 70 45 78 70 72 2d 3e 6f 70 20 3d  gg ) pExpr->op =
5820: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
5830: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  ;.      if( is_a
5840: 67 67 20 26 26 20 70 49 73 41 67 67 20 29 20 2a  gg && pIsAgg ) *
5850: 70 49 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  pIsAgg = 1;.    
5860: 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d    for(i=0; nErr=
5870: 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =0 && i<n; i++){
5880: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
5890: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
58a0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
58b0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
58c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 61 6c 6c 6f 77 41 67 67 20 26 26 20 21 69 73   allowAgg && !is
58f0: 5f 61 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20  _agg, pIsAgg);. 
5900: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5910: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5920: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
5930: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45  ft ){.        nE
5940: 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 43  rr = sqliteExprC
5950: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78  heck(pParse, pEx
5960: 70 72 2d 3e 70 4c 65 66 74 2c 20 61 6c 6c 6f 77  pr->pLeft, allow
5970: 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20  Agg, pIsAgg);.  
5980: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5990: 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72  nErr==0 && pExpr
59a0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
59b0: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
59c0: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
59d0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
59e0: 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41  , allowAgg, pIsA
59f0: 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gg);.      }.   
5a00: 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26     if( nErr==0 &
5a10: 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29  & pExpr->pList )
5a20: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  {.        int n 
5a30: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
5a40: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  nExpr;.        i
5a50: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
5a60: 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26  r(i=0; nErr==0 &
5a70: 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  & i<n; i++){.   
5a80: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
5a90: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
5aa0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
5ab0: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
5ac0: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
5ad0: 61 72 73 65 2c 20 70 45 32 2c 20 61 6c 6c 6f 77  arse, pE2, allow
5ae0: 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20  Agg, pIsAgg);.  
5af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5b00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5b10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5b20: 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  nErr;.}../*.** G
5b30: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
5b40: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
5b50: 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
5b60: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
5b70: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
5b80: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74   the result on t
5b90: 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e  he top of stack.
5ba0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45  .*/.void sqliteE
5bb0: 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
5bc0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
5bd0: 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  pr){.  Vdbe *v =
5be0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5bf0: 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28 20    int op;.  if( 
5c00: 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30  v==0 || pExpr==0
5c10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69   ) return;.  swi
5c20: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
5c30: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  {.    case TK_PL
5c40: 55 53 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  US:     op = OP_
5c50: 41 64 64 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  Add;      break;
5c60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
5c70: 55 53 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53  US:    op = OP_S
5c80: 75 62 74 72 61 63 74 3b 20 62 72 65 61 6b 3b 0a  ubtract; break;.
5c90: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
5ca0: 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4d 75  :     op = OP_Mu
5cb0: 6c 74 69 70 6c 79 3b 20 62 72 65 61 6b 3b 0a 20  ltiply; break;. 
5cc0: 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
5cd0: 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44 69 76  :    op = OP_Div
5ce0: 69 64 65 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ide;   break;.  
5cf0: 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20    case TK_AND:  
5d00: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 6e 64 3b      op = OP_And;
5d10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5d20: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20   case TK_OR:    
5d30: 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 72 3b 20 20     op = OP_Or;  
5d40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5d50: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
5d60: 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20    op = OP_Lt;   
5d70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5d80: 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20  ase TK_LE:      
5d90: 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20   op = OP_Le;    
5da0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
5db0: 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20  se TK_GT:       
5dc0: 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20  op = OP_Gt;     
5dd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5de0: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f  e TK_GE:       o
5df0: 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20 20  p = OP_Ge;      
5e00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5e10: 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70   TK_NE:       op
5e20: 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20   = OP_Ne;       
5e30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5e40: 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20  TK_EQ:       op 
5e50: 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62  = OP_Eq;       b
5e60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
5e70: 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d  K_ISNULL:   op =
5e80: 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72   OP_IsNull;   br
5e90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
5ea0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20  _NOTNULL:  op = 
5eb0: 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65  OP_NotNull;  bre
5ec0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
5ed0: 4e 4f 54 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f  NOT:      op = O
5ee0: 50 5f 4e 6f 74 3b 20 20 20 20 20 20 62 72 65 61  P_Not;      brea
5ef0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
5f00: 4d 49 4e 55 53 3a 20 20 20 6f 70 20 3d 20 4f 50  MINUS:   op = OP
5f10: 5f 4e 65 67 61 74 69 76 65 3b 20 62 72 65 61 6b  _Negative; break
5f20: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
5f30: 54 41 4e 44 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  TAND:   op = OP_
5f40: 42 69 74 41 6e 64 3b 20 20 20 62 72 65 61 6b 3b  BitAnd;   break;
5f50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
5f60: 4f 52 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 42  OR:    op = OP_B
5f70: 69 74 4f 72 3b 20 20 20 20 62 72 65 61 6b 3b 0a  itOr;    break;.
5f80: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
5f90: 4f 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69  OT:   op = OP_Bi
5fa0: 74 4e 6f 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20  tNot;   break;. 
5fb0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
5fc0: 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68 69  T:   op = OP_Shi
5fd0: 66 74 4c 65 66 74 3b 20 20 62 72 65 61 6b 3b 0a  ftLeft;  break;.
5fe0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
5ff0: 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68  FT:   op = OP_Sh
6000: 69 66 74 52 69 67 68 74 3b 20 62 72 65 61 6b 3b  iftRight; break;
6010: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
6020: 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52  :      op = OP_R
6030: 65 6d 61 69 6e 64 65 72 3b 20 20 62 72 65 61 6b  emainder;  break
6040: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  ;.    default: b
6050: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74  reak;.  }.  swit
6060: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
6070: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
6080: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
6090: 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20   pParse->useAgg 
60a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
60b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
60c0: 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70  _AggGet, 0, pExp
60d0: 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20  r->iAgg);.      
60e0: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
60f0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
6100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
6110: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
6120: 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
6130: 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
6140: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
6150: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6160: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6170: 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69 54  Recno, pExpr->iT
6180: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
6190: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
61a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
61b0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
61c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
61d0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
61e0: 20 61 74 6f 69 28 70 45 78 70 72 2d 3e 74 6f 6b   atoi(pExpr->tok
61f0: 65 6e 2e 7a 29 2c 20 30 29 3b 0a 20 20 20 20 20  en.z), 0);.     
6200: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
6210: 65 50 33 28 76 2c 20 2d 31 2c 20 70 45 78 70 72  eP3(v, -1, pExpr
6220: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
6230: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
6240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6250: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
6260: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6270: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6280: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
6290: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
62a0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20  pr->token.z );. 
62b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
62c0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
62d0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
62e0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
62f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6300: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
6310: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69  TRING: {.      i
6320: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
6330: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6340: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
6350: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
6360: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20  pr->token.z );. 
6370: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
6380: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
6390: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
63a0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
63b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
63c0: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61  beDequoteP3(v, a
63d0: 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ddr);.      brea
63e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
63f0: 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
6400: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6410: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
6420: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
6430: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6440: 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
6450: 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
6460: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
6470: 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
6480: 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
6490: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
64a0: 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
64b0: 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
64c0: 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
64d0: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 7b 0a  ase TK_SLASH: {.
64e0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
64f0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
6500: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
6510: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6520: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
6530: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
6540: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6550: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
6560: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6570: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
6580: 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
6590: 52 53 48 49 46 54 3a 20 7b 0a 20 20 20 20 20 20  RSHIFT: {.      
65a0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
65b0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
65c0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ight);.      sql
65d0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
65e0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
65f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6600: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
6610: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
6620: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6630: 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
6640: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
6650: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
6660: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
6670: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6680: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
6690: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
66a0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
66b0: 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c 20  , OP_Concat, 2, 
66c0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
66d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
66e0: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
66f0: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
6700: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
6710: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
6720: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
6730: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69  TK_EQ: {.      i
6740: 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 73  nt dest;.      s
6750: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6760: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
6770: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
6780: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
6790: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
67a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
67b0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
67c0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
67d0: 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c 69 74      dest = sqlit
67e0: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
67f0: 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  (v) + 2;.      s
6800: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6810: 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74 29 3b 0a  , op, 0, dest);.
6820: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6830: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
6840: 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  mm, -1, 0);.    
6850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6860: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
6870: 53 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  S: {.      asser
6880: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
6890: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
68a0: 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pr->pLeft->op==T
68b0: 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 45 78 70 72  K_FLOAT || pExpr
68c0: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
68d0: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
68e0: 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70     Token *p = &p
68f0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  Expr->pLeft->tok
6900: 65 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  en;.        char
6910: 20 2a 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c   *z = sqliteMall
6920: 6f 63 28 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a  oc( p->n + 2 );.
6930: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
6940: 7a 2c 20 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e  z, "-%.*s", p->n
6950: 2c 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  , p->z);.       
6960: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
6970: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
6980: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  R ){.          s
6990: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
69a0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 61 74  , OP_Integer, at
69b0: 6f 69 28 7a 29 2c 20 30 29 3b 0a 20 20 20 20 20  oi(z), 0);.     
69c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
69d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
69e0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
69f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
6a00: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
6a10: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6a20: 20 2d 31 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b   -1, z, p->n+1);
6a30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
6a40: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  ree(z);.        
6a50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6a60: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
6a70: 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54  ough into TK_NOT
6a80: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
6a90: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
6aa0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
6ab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
6ac0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
6ad0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
6ae0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6af0: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b  Op(v, op, 0, 0);
6b00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6b10: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
6b20: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
6b30: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
6b40: 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20       int dest;. 
6b50: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6b60: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
6b70: 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  er, 1, 0);.     
6b80: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
6b90: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
6ba0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73  Left);.      des
6bb0: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75  t = sqliteVdbeCu
6bc0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32  rrentAddr(v) + 2
6bd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6be0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
6bf0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
6c00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6c10: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c  , OP_AddImm, -1,
6c20: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
6c30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6c40: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
6c50: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6c60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6c70: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
6c80: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 62  ->iAgg);.      b
6c90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6ca0: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
6cb0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
6cc0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
6cd0: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
6ce0: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pList;.      int
6cf0: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f   nExpr = pList ?
6d00: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
6d10: 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  0;.      FuncDef
6d20: 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 70 44   *pDef;.      pD
6d30: 65 66 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 46  ef = sqliteFindF
6d40: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
6d50: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
6d60: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6d70: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
6d80: 3e 74 6f 6b 65 6e 2e 6e 2c 20 6e 45 78 70 72 2c  >token.n, nExpr,
6d90: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
6da0: 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20  t( pDef!=0 );.  
6db0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
6dc0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
6dd0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
6de0: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  de(pParse, pList
6df0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
6e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
6e10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6e20: 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 6e 45 78  OP_Function, nEx
6e30: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
6e40: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
6e50: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
6e60: 44 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  Def, P3_POINTER)
6e70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6e80: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
6e90: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
6ea0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6eb0: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
6ec0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
6ed0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
6ee0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6ef0: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
6f00: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73  nt addr;.      s
6f10: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6f20: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
6f30: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
6f40: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
6f50: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
6f60: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
6f70: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
6f80: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 66  ddr(v);.      if
6f90: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
6fa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6fb0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6fc0: 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
6fd0: 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 32 29 3b  iTable, addr+2);
6fe0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7000: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 46  AddOp(v, OP_SetF
7010: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
7020: 62 6c 65 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  ble, addr+2);.  
7030: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7040: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7050: 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29  P_AddImm, -1, 0)
7060: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7070: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7080: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
7090: 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69    int lbl = sqli
70a0: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
70b0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
70c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
70d0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
70e0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
70f0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
7100: 70 45 78 70 72 2c 20 6c 62 6c 29 3b 0a 20 20 20  pExpr, lbl);.   
7110: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7120: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
7130: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
7140: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
7150: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20  abel(v, lbl);.  
7160: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7170: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
7180: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
7190: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
71a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
71b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
71c0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  }.    case TK_CA
71d0: 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  SE: {.      int 
71e0: 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a  expr_end_label;.
71f0: 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 5f 77        int next_w
7200: 68 65 6e 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20  hen_label;.     
7210: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 61   int i;..      a
7220: 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
7230: 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st);.      asser
7240: 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  t((pExpr->pList-
7250: 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30  >nExpr % 2) == 0
7260: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
7270: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
7280: 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
7290: 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d  expr_end_label =
72a0: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
72b0: 61 62 65 6c 28 70 50 61 72 73 65 2d 3e 70 56 64  abel(pParse->pVd
72c0: 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  be);.      if( p
72d0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
72e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
72f0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
7300: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
7310: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
7320: 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69  =0; i<pExpr->pLi
7330: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 3d 69 2b 32  st->nExpr; i=i+2
7340: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
7350: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
7360: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
7370: 76 65 4c 61 62 65 6c 28 70 50 61 72 73 65 2d 3e  veLabel(pParse->
7380: 70 56 64 62 65 2c 20 6e 65 78 74 5f 77 68 65 6e  pVdbe, next_when
7390: 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  _label);.       
73a0: 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 5f   }.        next_
73b0: 77 68 65 6e 5f 6c 61 62 65 6c 20 3d 20 73 71 6c  when_label = sql
73c0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
73d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 29 3b  (pParse->pVdbe);
73e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
73f0: 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pr->pLeft ){.   
7400: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
7410: 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70  eAddOp(pParse->p
7420: 56 64 62 65 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Vdbe, OP_Dup, 0,
7430: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
7440: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
7450: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69  arse, pExpr->pLi
7460: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
7470: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7480: 65 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73  eVdbeAddOp(pPars
7490: 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4e 65 2c  e->pVdbe, OP_Ne,
74a0: 20 30 2c 20 6e 65 78 74 5f 77 68 65 6e 5f 6c 61   0, next_when_la
74b0: 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  bel);.        }e
74c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
74d0: 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65  qliteExprIfFalse
74e0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
74f0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
7500: 72 2c 20 6e 65 78 74 5f 77 68 65 6e 5f 6c 61 62  r, next_when_lab
7510: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  el);.        }. 
7520: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
7530: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
7540: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7550: 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64  ddOp(pParse->pVd
7560: 62 65 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  be, OP_Pop, 1, 0
7570: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7580: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
7590: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
75a0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2b 31 5d  r->pList->a[i+1]
75b0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
75c0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
75d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
75e0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72  OP_Goto, 0, expr
75f0: 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20  _end_label);.   
7600: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7610: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
7620: 6c 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  l(pParse->pVdbe,
7630: 20 6e 65 78 74 5f 77 68 65 6e 5f 6c 61 62 65 6c   next_when_label
7640: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
7650: 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pr->pLeft ){.   
7660: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7670: 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64  ddOp(pParse->pVd
7680: 62 65 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  be, OP_Pop, 1, 0
7690: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
76a0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
76b0: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ht ){.        sq
76c0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
76d0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
76e0: 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ht);.      }else
76f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7700: 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65  VdbeAddOp(pParse
7710: 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 74 72 69  ->pVdbe, OP_Stri
7720: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
7730: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
7740: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
7750: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 65  pParse->pVdbe, e
7760: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a  xpr_end_label);.
7770: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
7780: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
7790: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
77a0: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
77b0: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
77c0: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
77d0: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
77e0: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
77f0: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
7800: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
7810: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
7820: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
7830: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
7840: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
7850: 74 65 45 78 70 72 49 66 54 72 75 65 28 50 61 72  teExprIfTrue(Par
7860: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
7870: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
7880: 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
7890: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
78a0: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
78b0: 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
78c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
78d0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
78e0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
78f0: 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _LT:       op = 
7900: 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Lt;       bre
7910: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7920: 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LE:       op = O
7930: 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Le;       brea
7940: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
7950: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
7960: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
7970: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
7980: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
7990: 47 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Ge;       break;
79a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
79b0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e         op = OP_N
79c0: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
79d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
79e0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
79f0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
7a00: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
7a10: 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e  L:   op = OP_IsN
7a20: 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ull;   break;.  
7a30: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
7a40: 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  L:  op = OP_NotN
7a50: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
7a60: 20 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b   default:  break
7a70: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
7a80: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
7a90: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
7aa0: 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
7ab0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
7ac0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
7ad0: 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70  iteExprIfFalse(p
7ae0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
7af0: 65 66 74 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  eft, d2);.      
7b00: 73 71 6c 69 74 65 45 78 70 72 49 66 54 72 75 65  sqliteExprIfTrue
7b10: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
7b20: 70 52 69 67 68 74 2c 20 64 65 73 74 29 3b 0a 20  pRight, dest);. 
7b30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
7b40: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
7b50: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
7b60: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7b70: 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73  TK_OR: {.      s
7b80: 71 6c 69 74 65 45 78 70 72 49 66 54 72 75 65 28  qliteExprIfTrue(
7b90: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
7ba0: 4c 65 66 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  Left, dest);.   
7bb0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54     sqliteExprIfT
7bc0: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
7bd0: 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 29  r->pRight, dest)
7be0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7bf0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7c00: 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  _NOT: {.      sq
7c10: 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28  liteExprIfFalse(
7c20: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
7c30: 4c 65 66 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  Left, dest);.   
7c40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7c50: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
7c60: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
7c70: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
7c80: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
7c90: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
7ca0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
7cb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
7cc0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
7cd0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
7ce0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
7cf0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
7d00: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
7d10: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7d20: 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74 29  (v, op, 0, dest)
7d30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7d40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7d50: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
7d60: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
7d70: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
7d80: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
7d90: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
7da0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7db0: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74  p(v, op, 0, dest
7dc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7dd0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
7de0: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_IN: {.      sq
7df0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
7e00: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
7e10: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
7e20: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
7e30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
7e40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f  beAddOp(v, OP_Fo
7e50: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
7e60: 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  le, dest);.     
7e70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7e80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7e90: 76 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64 2c 20  v, OP_SetFound, 
7ea0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
7eb0: 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  est);.      }.  
7ec0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7ed0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
7ee0: 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  WEEN: {.      in
7ef0: 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 56 64  t lbl = sqliteVd
7f00: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
7f10: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
7f20: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
7f30: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
7f40: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7f50: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
7f60: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
7f70: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
7f80: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
7f90: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
7fa0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7fb0: 70 28 76 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 6c  p(v, OP_Lt, 0, l
7fc0: 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  bl);.      sqlit
7fd0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
7fe0: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
7ff0: 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[1].pExpr);.   
8000: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8010: 4f 70 28 76 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20  Op(v, OP_Le, 0, 
8020: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
8030: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8040: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
8050: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8060: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
8070: 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73  v, lbl);.      s
8080: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8090: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
80a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
80b0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
80c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
80d0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
80e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
80f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8100: 20 4f 50 5f 49 66 2c 20 30 2c 20 64 65 73 74 29   OP_If, 0, dest)
8110: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8120: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
8130: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8140: 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
8150: 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
8160: 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
8170: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
8180: 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
8190: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
81a0: 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
81b0: 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
81c0: 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
81d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
81e0: 73 20 74 72 75 65 2e 0a 2a 2f 0a 76 6f 69 64 20  s true..*/.void 
81f0: 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73  sqliteExprIfFals
8200: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
8210: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
8220: 74 20 64 65 73 74 29 7b 0a 20 20 56 64 62 65 20  t dest){.  Vdbe 
8230: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
8240: 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
8250: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
8260: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
8270: 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  n;.  switch( pEx
8280: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
8290: 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20  se TK_LT:       
82a0: 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20  op = OP_Ge;     
82b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
82c0: 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f  e TK_LE:       o
82d0: 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20 20  p = OP_Gt;      
82e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
82f0: 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f 70   TK_GT:       op
8300: 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20   = OP_Le;       
8310: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8320: 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_GE:       op 
8330: 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62  = OP_Lt;       b
8340: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8350: 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_NE:       op =
8360: 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62 72   OP_Eq;       br
8370: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8380: 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _EQ:       op = 
8390: 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65  OP_Ne;       bre
83a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
83b0: 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f  ISNULL:   op = O
83c0: 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61  P_NotNull;  brea
83d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
83e0: 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50  OTNULL:  op = OP
83f0: 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b  _IsNull;   break
8400: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
8410: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69  break;.  }.  swi
8420: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
8430: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
8440: 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
8450: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
8460: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
8470: 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
8480: 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73  sqliteExprIfFals
8490: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
84a0: 3e 70 52 69 67 68 74 2c 20 64 65 73 74 29 3b 0a  >pRight, dest);.
84b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
84c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
84d0: 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
84e0: 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  2 = sqliteVdbeMa
84f0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
8500: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72    sqliteExprIfTr
8510: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
8520: 2d 3e 70 4c 65 66 74 2c 20 64 32 29 3b 0a 20 20  ->pLeft, d2);.  
8530: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
8540: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
8550: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
8560: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
8570: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
8580: 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
8590: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
85a0: 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
85b0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
85c0: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
85d0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
85e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
85f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8600: 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
8610: 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
8620: 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
8630: 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
8640: 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
8650: 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_EQ: {.      sq
8660: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
8670: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
8680: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
8690: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
86a0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
86b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
86c0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
86d0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
86e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
86f0: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
8700: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
8710: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
8720: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
8730: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
8740: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8750: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
8760: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
8770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8780: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
8790: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
87a0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
87b0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
87c0: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
87d0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
87e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
87f0: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45   OP_NotFound, pE
8800: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
8810: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
8820: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
8830: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
8840: 65 74 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70  etNotFound, pExp
8850: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29  r->iTable, dest)
8860: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8870: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8880: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
8890: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
88a0: 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dr;.      sqlite
88b0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
88c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
88d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
88e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
88f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
8900: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
8910: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
8920: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
8930: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
8940: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
8950: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
8960: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8970: 4f 50 5f 47 65 2c 20 30 2c 20 61 64 64 72 2b 33  OP_Ge, 0, addr+3
8980: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
8990: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
89a0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
89b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
89c0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
89d0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
89e0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
89f0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
8a00: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
8a10: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8a20: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 74 2c 20 30  ddOp(v, OP_Gt, 0
8a30: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
8a40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8a50: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
8a60: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
8a70: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
8a80: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8a90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 2c  AddOp(v, OP_Not,
8aa0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
8ab0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8ac0: 20 4f 50 5f 49 66 2c 20 30 2c 20 64 65 73 74 29   OP_If, 0, dest)
8ad0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8ae0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
8af0: 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
8b00: 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
8b10: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
8b20: 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f   Return TRUE (no
8b30: 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68  n-zero).** if th
8b40: 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
8b50: 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53   and return FALS
8b60: 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  E if they differ
8b70: 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a   in any way..*/.
8b80: 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72 43 6f  int sqliteExprCo
8b90: 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
8ba0: 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74  Expr *pB){.  int
8bb0: 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
8bc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
8bd0: 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ==0;.  }else if(
8be0: 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   pB==0 ){.    re
8bf0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
8c00: 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
8c10: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
8c20: 66 28 20 21 73 71 6c 69 74 65 45 78 70 72 43 6f  f( !sqliteExprCo
8c30: 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
8c40: 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65   pB->pLeft) ) re
8c50: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
8c60: 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65  qliteExprCompare
8c70: 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d  (pA->pRight, pB-
8c80: 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72  >pRight) ) retur
8c90: 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70  n 0;.  if( pA->p
8ca0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
8cb0: 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72  pB->pList==0 ) r
8cc0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
8cd0: 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70   pA->pList->nExp
8ce0: 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45  r!=pB->pList->nE
8cf0: 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  xpr ) return 0;.
8d00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
8d10: 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  A->pList->nExpr;
8d20: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
8d30: 20 21 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70   !sqliteExprComp
8d40: 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61  are(pA->pList->a
8d50: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70  [i].pExpr, pB->p
8d60: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
8d70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
8d80: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
8d90: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
8da0: 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pB->pList ){.  
8db0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8dc0: 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63    if( pA->pSelec
8dd0: 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74  t || pB->pSelect
8de0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
8df0: 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  f( pA->token.z )
8e00: 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  {.    if( pB->to
8e10: 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72  ken.z==0 ) retur
8e20: 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d  n 0;.    if( pB-
8e30: 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f  >token.n!=pA->to
8e40: 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20 30  ken.n ) return 0
8e50: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
8e60: 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74 6f 6b  StrNICmp(pA->tok
8e70: 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e  en.z, pB->token.
8e80: 7a 2c 20 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 29 21  z, pA->token.n)!
8e90: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8ea0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
8eb0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
8ec0: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
8ed0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
8ee0: 61 72 72 61 79 20 61 6e 64 20 72 65 74 75 72 6e  array and return
8ef0: 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73   its index..*/.s
8f00: 74 61 74 69 63 20 69 6e 74 20 61 70 70 65 6e 64  tatic int append
8f10: 41 67 67 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  AggInfo(Parse *p
8f20: 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 28 70  Parse){.  if( (p
8f30: 50 61 72 73 65 2d 3e 6e 41 67 67 20 26 20 30 78  Parse->nAgg & 0x
8f40: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  7)==0 ){.    int
8f50: 20 61 6d 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e   amt = pParse->n
8f60: 41 67 67 20 2b 20 38 3b 0a 20 20 20 20 41 67 67  Agg + 8;.    Agg
8f70: 45 78 70 72 20 2a 61 41 67 67 20 3d 20 73 71 6c  Expr *aAgg = sql
8f80: 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61 72 73  iteRealloc(pPars
8f90: 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73 69 7a  e->aAgg, amt*siz
8fa0: 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67  eof(pParse->aAgg
8fb0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
8fc0: 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Agg==0 ){.      
8fd0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
8fe0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67  .    pParse->aAg
8ff0: 67 20 3d 20 61 41 67 67 3b 0a 20 20 7d 0a 20 20  g = aAgg;.  }.  
9000: 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
9010: 61 41 67 67 5b 70 50 61 72 73 65 2d 3e 6e 41 67  aAgg[pParse->nAg
9020: 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  g], 0, sizeof(pP
9030: 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b  arse->aAgg[0]));
9040: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
9050: 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nAgg++;.}../*.
9060: 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67  ** Analyze the g
9070: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
9080: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
9090: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
90a0: 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
90b0: 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
90c0: 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
90d0: 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
90e0: 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20   array..** Make 
90f0: 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  additional entri
9100: 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  es to the pParse
9110: 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61  ->aAgg[] array a
9120: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  s necessary..**.
9130: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9140: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
9150: 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
9160: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
9170: 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
9180: 62 79 20 73 71 6c 69 74 65 45 78 70 72 52 65 73  by sqliteExprRes
9190: 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20 73 71  olveIds() and sq
91a0: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 29 2e  liteExprCheck().
91b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73  .**.** If errors
91c0: 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61 76 65   are seen, leave
91d0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
91e0: 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64  e in zErrMsg and
91f0: 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   return.** the n
9200: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
9210: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78  .*/.int sqliteEx
9220: 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
9230: 74 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  tes(Parse *pPars
9240: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
9250: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41 67 67 45  .  int i;.  AggE
9260: 78 70 72 20 2a 61 41 67 67 3b 0a 20 20 69 6e 74  xpr *aAgg;.  int
9270: 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66   nErr = 0;..  if
9280: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
9290: 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28  urn 0;.  switch(
92a0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
92b0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
92c0: 3a 20 7b 0a 20 20 20 20 20 20 61 41 67 67 20 3d  : {.      aAgg =
92d0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20   pParse->aAgg;. 
92e0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
92f0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
9300: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9310: 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20  aAgg[i].isAgg ) 
9320: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9330: 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e 70 45    if( aAgg[i].pE
9340: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  xpr->iTable==pEx
9350: 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20  pr->iTable.     
9360: 20 20 20 20 26 26 20 61 41 67 67 5b 69 5d 2e 70      && aAgg[i].p
9370: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
9380: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
9390: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
93a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
93b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
93c0: 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b  =pParse->nAgg ){
93d0: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70  .        i = app
93e0: 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73  endAggInfo(pPars
93f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
9400: 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  i<0 ) return 1;.
9410: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
9420: 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20  aAgg[i].isAgg = 
9430: 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  0;.        pPars
9440: 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  e->aAgg[i].pExpr
9450: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
9460: 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  }.      pExpr->i
9470: 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 62  Agg = i;.      b
9480: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9490: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
94a0: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41  TION: {.      aA
94b0: 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67  gg = pParse->aAg
94c0: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  g;.      for(i=0
94d0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
94e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
94f0: 69 66 28 20 21 61 41 67 67 5b 69 5d 2e 69 73 41  if( !aAgg[i].isA
9500: 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
9510: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
9520: 65 45 78 70 72 43 6f 6d 70 61 72 65 28 61 41 67  eExprCompare(aAg
9530: 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 78 70  g[i].pExpr, pExp
9540: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
9550: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
9560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9570: 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41  f( i>=pParse->nA
9580: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  gg ){.        i 
9590: 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28  = appendAggInfo(
95a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
95b0: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
95c0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  n 1;.        pPa
95d0: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41  rse->aAgg[i].isA
95e0: 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gg = 1;.        
95f0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
9600: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
9610: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
9620: 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20 3d 20 73  Agg[i].pFunc = s
9630: 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74 69 6f  qliteFindFunctio
9640: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
9650: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
9660: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
9670: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20  ->token.n,.     
9680: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
9690: 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c  List ? pExpr->pL
96a0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
96b0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
96c0: 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
96d0: 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  i;.      break;.
96e0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
96f0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
9700: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
9710: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
9720: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
9730: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
9740: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
9750: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9760: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
9770: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
9780: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
9790: 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41  liteExprAnalyzeA
97a0: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
97b0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
97c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
97d0: 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70  if( nErr==0 && p
97e0: 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  Expr->pList ){. 
97f0: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70         int n = p
9800: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
9810: 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pr;.        int 
9820: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
9830: 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69  =0; nErr==0 && i
9840: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
9850: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
9860: 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  eExprAnalyzeAggr
9870: 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
9880: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
9890: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
98a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
98b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
98c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
98d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
98e0: 65 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  e a user functio
98f0: 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d 65 20 61  n given a name a
9900: 6e 64 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 61  nd a number of a
9910: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 52 65 74  rguments..** Ret
9920: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
9930: 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74 72   the FuncDef str
9940: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
9950: 6e 65 73 20 74 68 61 74 0a 2a 2a 20 66 75 6e 63  nes that.** func
9960: 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75 72 6e 20  tion, or return 
9970: 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 75 6e 63  NULL if the func
9980: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  tion does not ex
9990: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
99a0: 65 20 63 72 65 61 74 65 46 6c 61 67 20 61 72 67  e createFlag arg
99b0: 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74  ument is true, t
99c0: 68 65 6e 20 61 20 6e 65 77 20 28 62 6c 61 6e 6b  hen a new (blank
99d0: 29 20 46 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72  ) FuncDef.** str
99e0: 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
99f0: 64 20 61 6e 64 20 6c 69 6b 65 64 20 69 6e 74 6f  d and liked into
9a00: 20 74 68 65 20 22 64 62 22 20 73 74 72 75 63 74   the "db" struct
9a10: 75 72 65 20 69 66 20 61 0a 2a 2a 20 6e 6f 20 6d  ure if a.** no m
9a20: 61 74 63 68 69 6e 67 20 66 75 6e 63 74 69 6f 6e  atching function
9a30: 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73   previously exis
9a40: 74 65 64 2e 20 20 57 68 65 6e 20 63 72 65 61 74  ted.  When creat
9a50: 65 46 6c 61 67 20 69 73 20 74 72 75 65 0a 2a 2a  eFlag is true.**
9a60: 20 61 6e 64 20 74 68 65 20 6e 41 72 67 20 70 61   and the nArg pa
9a70: 72 61 6d 65 74 65 72 20 69 73 20 2d 31 2c 20 74  rameter is -1, t
9a80: 68 65 6e 20 6f 6e 6c 79 20 61 20 66 75 6e 63 74  hen only a funct
9a90: 69 6f 6e 20 74 68 61 74 20 61 63 63 65 70 74 73  ion that accepts
9aa0: 0a 2a 2a 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f  .** any number o
9ab0: 66 20 61 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c  f arguments will
9ac0: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   be returned..**
9ad0: 0a 2a 2a 20 49 66 20 63 72 65 61 74 65 46 6c 61  .** If createFla
9ae0: 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 6e  g is false and n
9af0: 41 72 67 20 69 73 20 2d 31 2c 20 74 68 65 6e 20  Arg is -1, then 
9b00: 74 68 65 20 66 69 72 73 74 20 76 61 6c 69 64 0a  the first valid.
9b10: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e  ** function foun
9b20: 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  d is returned.  
9b30: 41 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 76 61  A function is va
9b40: 6c 69 64 20 69 66 20 65 69 74 68 65 72 20 78 46  lid if either xF
9b50: 75 6e 63 0a 2a 2a 20 6f 72 20 78 53 74 65 70 20  unc.** or xStep 
9b60: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  is non-zero..*/.
9b70: 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74 65 46  FuncDef *sqliteF
9b80: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  indFunction(.  s
9b90: 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20  qlite *db,      
9ba0: 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74    /* An open dat
9bb0: 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
9bc0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2f 2a   char *zName, /*
9bd0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e   Name of the fun
9be0: 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e 75 6c 6c  ction.  Not null
9bf0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a 2f 0a 20  -terminated */. 
9c00: 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20 20 20 20   int nName,     
9c10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9c20: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
9c30: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  he name */.  int
9c40: 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
9c50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
9c60: 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d 65 61 6e  uments.  -1 mean
9c70: 73 20 61 6e 79 20 6e 75 6d 62 65 72 20 2a 2f 0a  s any number */.
9c80: 20 20 69 6e 74 20 63 72 65 61 74 65 46 6c 61 67    int createFlag
9c90: 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6e       /* Create n
9ca0: 65 77 20 65 6e 74 72 79 20 69 66 20 74 72 75 65  ew entry if true
9cb0: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6f 74   and does not ot
9cc0: 68 65 72 77 69 73 65 20 65 78 69 73 74 20 2a 2f  herwise exist */
9cd0: 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70  .){.  FuncDef *p
9ce0: 46 69 72 73 74 2c 20 2a 70 2c 20 2a 70 4d 61 79  First, *p, *pMay
9cf0: 62 65 3b 0a 20 20 70 46 69 72 73 74 20 3d 20 70  be;.  pFirst = p
9d00: 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73 71 6c   = (FuncDef*)sql
9d10: 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62 2d  iteHashFind(&db-
9d20: 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  >aFunc, zName, n
9d30: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 20 26  Name);.  if( p &
9d40: 26 20 21 63 72 65 61 74 65 46 6c 61 67 20 26 26  & !createFlag &&
9d50: 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 77   nArg<0 ){.    w
9d60: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 78 46  hile( p && p->xF
9d70: 75 6e 63 3d 3d 30 20 26 26 20 70 2d 3e 78 53 74  unc==0 && p->xSt
9d80: 65 70 3d 3d 30 20 29 7b 20 70 20 3d 20 70 2d 3e  ep==0 ){ p = p->
9d90: 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 72 65 74  pNext; }.    ret
9da0: 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70 4d 61  urn p;.  }.  pMa
9db0: 79 62 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ybe = 0;.  while
9dc0: 28 20 70 20 26 26 20 70 2d 3e 6e 41 72 67 21 3d  ( p && p->nArg!=
9dd0: 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20  nArg ){.    if( 
9de0: 70 2d 3e 6e 41 72 67 3c 30 20 26 26 20 21 63 72  p->nArg<0 && !cr
9df0: 65 61 74 65 46 6c 61 67 20 26 26 20 28 70 2d 3e  eateFlag && (p->
9e00: 78 46 75 6e 63 20 7c 7c 20 70 2d 3e 78 53 74 65  xFunc || p->xSte
9e10: 70 29 20 29 20 70 4d 61 79 62 65 20 3d 20 70 3b  p) ) pMaybe = p;
9e20: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
9e30: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 26  t;.  }.  if( p &
9e40: 26 20 21 63 72 65 61 74 65 46 6c 61 67 20 26 26  & !createFlag &&
9e50: 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 26 26 20   p->xFunc==0 && 
9e60: 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29 7b 0a 20  p->xStep==0 ){. 
9e70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9e80: 0a 20 20 69 66 28 20 70 3d 3d 30 20 26 26 20 70  .  if( p==0 && p
9e90: 4d 61 79 62 65 20 29 7b 0a 20 20 20 20 61 73 73  Maybe ){.    ass
9ea0: 65 72 74 28 20 63 72 65 61 74 65 46 6c 61 67 3d  ert( createFlag=
9eb0: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
9ec0: 20 70 4d 61 79 62 65 3b 0a 20 20 7d 0a 20 20 69   pMaybe;.  }.  i
9ed0: 66 28 20 70 3d 3d 30 20 26 26 20 63 72 65 61 74  f( p==0 && creat
9ee0: 65 46 6c 61 67 20 26 26 20 28 70 20 3d 20 73 71  eFlag && (p = sq
9ef0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f  liteMalloc(sizeo
9f00: 66 28 2a 70 29 29 29 21 3d 30 20 29 7b 0a 20 20  f(*p)))!=0 ){.  
9f10: 20 20 70 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67    p->nArg = nArg
9f20: 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d  ;.    p->pNext =
9f30: 20 70 46 69 72 73 74 3b 0a 20 20 20 20 73 71 6c   pFirst;.    sql
9f40: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
9f50: 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c  b->aFunc, zName,
9f60: 20 6e 4e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 70   nName, (void*)p
9f70: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9f80: 70 3b 0a 7d 0a                                   p;.}.