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

Artifact 2c7535ba013b731ed73f12b6cc1cd5b466efb3e2:


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 30 20 32 30 30 32 2f 30 35 2f 31 39 20 32  .60 2002/05/19 2
0220: 33 3a 34 33 3a 31 34 20 64 61 6e 69 65 6c 6b 31  3:43:14 danielk1
0230: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  977 Exp $.*/.#in
0240: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0250: 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  .h".../*.** Cons
0260: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
0270: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
0280: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0290: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
02a0: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
02b0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
02c0: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
02d0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
02e0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
02f0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
0300: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
0310: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
0320: 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70  ts freed..*/.Exp
0330: 72 20 2a 73 71 6c 69 74 65 45 78 70 72 28 69 6e  r *sqliteExpr(in
0340: 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66  t op, Expr *pLef
0350: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  t, Expr *pRight,
0360: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
0370: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
0380: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
0390: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
03a0: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
03b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
03c0: 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66  eExprDelete(pLef
03d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  t);.    sqliteEx
03e0: 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29  prDelete(pRight)
03f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
0400: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d    }.  pNew->op =
0410: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
0420: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
0430: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
0440: 67 68 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ght;.  if( pToke
0450: 6e 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  n ){.    pNew->t
0460: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
0470: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
0480: 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a  w->token.z = 0;.
0490: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
04a0: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
04b0: 20 70 4c 65 66 74 20 26 26 20 70 52 69 67 68 74   pLeft && pRight
04c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78   ){.    sqliteEx
04d0: 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c  prSpan(pNew, &pL
04e0: 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67  eft->span, &pRig
04f0: 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d 65 6c  ht->span);.  }el
0500: 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 70  se{.    pNew->sp
0510: 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  an = pNew->token
0520: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
0530: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  New;.}../*.** Se
0540: 74 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  t the Expr.token
0550: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69   field of the gi
0560: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ven expression t
0570: 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65  o span all.** te
0580: 78 74 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  xt between the t
0590: 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e  wo given tokens.
05a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45  .*/.void sqliteE
05b0: 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45  xprSpan(Expr *pE
05c0: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66  xpr, Token *pLef
05d0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74  t, Token *pRight
05e0: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  ){.  if( pExpr )
05f0: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61  {.    pExpr->spa
0600: 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a  n.z = pLeft->z;.
0610: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
0620: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20  n = pRight->n + 
0630: 41 64 64 72 28 70 52 69 67 68 74 2d 3e 7a 29 20  Addr(pRight->z) 
0640: 2d 20 41 64 64 72 28 70 4c 65 66 74 2d 3e 7a 29  - Addr(pLeft->z)
0650: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
0660: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
0670: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
0680: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69  or a function wi
0690: 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61  th multiple.** a
06a0: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70  rguments..*/.Exp
06b0: 72 20 2a 73 71 6c 69 74 65 45 78 70 72 46 75 6e  r *sqliteExprFun
06c0: 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a  ction(ExprList *
06d0: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
06e0: 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70  oken){.  Expr *p
06f0: 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  New;.  pNew = sq
0700: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
0710: 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66  of(Expr) );.  if
0720: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0730: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
0740: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
0750: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
0760: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
0770: 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77  FUNCTION;.  pNew
0780: 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  ->pList = pList;
0790: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
07a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
07b0: 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65   = *pToken;.  }e
07c0: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  lse{.    pNew->t
07d0: 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  oken.z = 0;.    
07e0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  pNew->token.n = 
07f0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
0800: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pNew;.}../*.** R
0810: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
0820: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
0830: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
0840: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 45  liteExprDelete(E
0850: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
0860: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
0870: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 20 73  if( p->pLeft ) s
0880: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
0890: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
08a0: 20 70 2d 3e 70 52 69 67 68 74 20 29 20 73 71 6c   p->pRight ) sql
08b0: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d  iteExprDelete(p-
08c0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20  >pRight);.  if( 
08d0: 70 2d 3e 70 4c 69 73 74 20 29 20 73 71 6c 69 74  p->pList ) sqlit
08e0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
08f0: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 69 66 28  p->pList);.  if(
0900: 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 20 73 71   p->pSelect ) sq
0910: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
0920: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
0930: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
0940: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
0950: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 66  owing group of f
0960: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  unctions are use
0970: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 74  d to translate t
0980: 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 70 6f 69  he string.** poi
0990: 6e 74 65 72 73 20 6f 66 20 74 6f 6b 65 6e 73 20  nters of tokens 
09a0: 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  in expression fr
09b0: 6f 6d 20 6f 6e 65 20 62 75 66 66 65 72 20 74 6f  om one buffer to
09c0: 20 61 6e 6f 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20   another..**.** 
09d0: 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 65 20 45 78  Normally, the Ex
09e0: 70 72 2e 74 6f 6b 65 6e 2e 7a 20 61 6e 64 20 45  pr.token.z and E
09f0: 78 70 72 2e 73 70 61 6e 2e 7a 20 66 69 65 6c 64  xpr.span.z field
0a00: 73 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65  s point into the
0a10: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 69 6e 70  .** original inp
0a20: 75 74 20 62 75 66 66 65 72 20 6f 66 20 61 6e 20  ut buffer of an 
0a30: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
0a40: 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
0a50: 4f 4b 0a 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  OK.** since the 
0a60: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
0a70: 20 65 78 65 63 75 74 65 64 20 61 6e 64 20 74 68   executed and th
0a80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
0a90: 64 65 6c 65 74 65 64 0a 2a 2a 20 62 65 66 6f 72  deleted.** befor
0aa0: 65 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  e the input buff
0ab0: 65 72 20 69 73 20 66 72 65 65 64 2e 20 20 4d 61  er is freed.  Ma
0ac0: 6b 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e 73 20  king the tokens 
0ad0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
0ae0: 6f 72 69 67 69 6e 61 6c 20 69 6e 70 75 74 20 62  original input b
0af0: 75 66 66 65 72 20 73 61 76 65 73 20 6d 61 6e 79  uffer saves many
0b00: 20 63 61 6c 6c 73 20 74 6f 20 6d 61 6c 6c 6f 63   calls to malloc
0b10: 28 29 20 61 6e 64 20 74 68 75 73 20 68 65 6c 70  () and thus help
0b20: 73 0a 2a 2a 20 74 68 65 20 6c 69 62 72 61 72 79  s.** the library
0b30: 20 74 6f 20 72 75 6e 20 66 61 73 74 65 72 2e 20   to run faster. 
0b40: 0a 2a 2a 0a 2a 2a 20 42 75 74 20 73 6f 6d 65 74  .**.** But somet
0b50: 69 6d 65 73 20 77 65 20 6e 65 65 64 20 61 6e 20  imes we need an 
0b60: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 70 65  expression to pe
0b70: 72 73 69 73 74 20 70 61 73 74 20 74 68 65 20 74  rsist past the t
0b80: 69 6d 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ime when.** the 
0b90: 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20  input buffer is 
0ba0: 66 72 65 65 64 2e 20 20 28 45 78 61 6d 70 6c 65  freed.  (Example
0bb0: 3a 20 54 68 65 20 53 45 4c 45 43 54 20 63 6c 61  : The SELECT cla
0bc0: 75 73 65 20 6f 66 20 61 0a 2a 2a 20 43 52 45 41  use of a.** CREA
0bd0: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
0be0: 74 20 63 6f 6e 74 61 69 6e 73 20 65 78 70 72 65  t contains expre
0bf0: 73 73 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  ssions that must
0c00: 20 70 65 72 73 69 73 74 20 66 6f 72 0a 2a 2a 20   persist for.** 
0c10: 74 68 65 20 6c 69 66 65 20 6f 66 20 74 68 65 20  the life of the 
0c20: 76 69 65 77 2e 29 20 20 57 68 65 6e 20 74 68 61  view.)  When tha
0c30: 74 20 68 61 70 70 65 6e 73 20 77 65 20 68 61 76  t happens we hav
0c40: 65 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 70  e to make a.** p
0c50: 65 72 73 69 73 74 65 6e 74 20 63 6f 70 79 20 6f  ersistent copy o
0c60: 66 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  f the input buff
0c70: 65 72 20 61 6e 64 20 74 72 61 6e 73 6c 61 74 65  er and translate
0c80: 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   the Expr.token.
0c90: 7a 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 73 70  z.** and Expr.sp
0ca0: 61 6e 2e 7a 20 66 69 65 6c 64 73 20 74 6f 20 70  an.z fields to p
0cb0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 6f 70 79  oint to the copy
0cc0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
0cd0: 20 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 69 6e   .** original in
0ce0: 70 75 74 20 62 75 66 66 65 72 2e 20 20 54 68 65  put buffer.  The
0cf0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70   following group
0d00: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 68 61 6e   of routines han
0d10: 64 6c 65 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  dle that.** tran
0d20: 73 6c 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  slation..**.** T
0d30: 68 65 20 22 6f 66 66 73 65 74 22 20 70 61 72 61  he "offset" para
0d40: 6d 65 74 65 72 20 69 73 20 74 68 65 20 64 69 73  meter is the dis
0d50: 74 61 6e 63 65 20 66 72 6f 6d 20 74 68 65 20 6f  tance from the o
0d60: 72 69 67 69 6e 61 6c 20 69 6e 70 75 74 20 62 75  riginal input bu
0d70: 66 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  ffer.** to the p
0d80: 65 72 73 69 73 74 65 6e 74 20 63 6f 70 79 2e 20  ersistent copy. 
0d90: 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
0da0: 72 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b  recursively walk
0db0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 65   the entire.** e
0dc0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
0dd0: 6e 64 20 73 68 69 66 74 20 61 6c 6c 20 74 6f 6b  nd shift all tok
0de0: 65 6e 73 20 62 79 20 22 6f 66 66 73 65 74 22 20  ens by "offset" 
0df0: 61 6d 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  amount..**.** Th
0e00: 65 20 77 6f 72 6b 20 6f 66 20 66 69 67 75 72 69  e work of figuri
0e10: 6e 67 20 6f 75 74 20 74 68 65 20 61 70 70 72 6f  ng out the appro
0e20: 70 72 69 61 74 65 20 22 6f 66 66 73 65 74 22 20  priate "offset" 
0e30: 61 6e 64 20 6d 61 6b 69 6e 67 20 74 68 65 0a 2a  and making the.*
0e40: 2a 20 70 72 65 73 69 73 74 65 6e 74 20 63 6f 70  * presistent cop
0e50: 79 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 62  y of the input b
0e60: 75 66 66 65 72 20 69 73 20 64 6f 6e 65 20 62 79  uffer is done by
0e70: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
0e80: 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tine..*/.void sq
0e90: 6c 69 74 65 45 78 70 72 4d 6f 76 65 53 74 72 69  liteExprMoveStri
0ea0: 6e 67 73 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ngs(Expr *p, int
0eb0: 20 6f 66 66 73 65 74 29 7b 0a 20 20 69 66 28 20   offset){.  if( 
0ec0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
0ed0: 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20   if( p->token.z 
0ee0: 29 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 3d 20  ) p->token.z += 
0ef0: 6f 66 66 73 65 74 3b 0a 20 20 69 66 28 20 70 2d  offset;.  if( p-
0f00: 3e 73 70 61 6e 2e 7a 20 29 20 70 2d 3e 73 70 61  >span.z ) p->spa
0f10: 6e 2e 7a 20 2b 3d 20 6f 66 66 73 65 74 3b 0a 20  n.z += offset;. 
0f20: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 20   if( p->pLeft ) 
0f30: 73 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53 74  sqliteExprMoveSt
0f40: 72 69 6e 67 73 28 70 2d 3e 70 4c 65 66 74 2c 20  rings(p->pLeft, 
0f50: 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 70  offset);.  if( p
0f60: 2d 3e 70 52 69 67 68 74 20 29 20 73 71 6c 69 74  ->pRight ) sqlit
0f70: 65 45 78 70 72 4d 6f 76 65 53 74 72 69 6e 67 73  eExprMoveStrings
0f80: 28 70 2d 3e 70 52 69 67 68 74 2c 20 6f 66 66 73  (p->pRight, offs
0f90: 65 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  et);.  if( p->pL
0fa0: 69 73 74 20 29 20 73 71 6c 69 74 65 45 78 70 72  ist ) sqliteExpr
0fb0: 4c 69 73 74 4d 6f 76 65 53 74 72 69 6e 67 73 28  ListMoveStrings(
0fc0: 70 2d 3e 70 4c 69 73 74 2c 20 6f 66 66 73 65 74  p->pList, offset
0fd0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  );.  if( p->pSel
0fe0: 65 63 74 20 29 20 73 71 6c 69 74 65 53 65 6c 65  ect ) sqliteSele
0ff0: 63 74 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 2d  ctMoveStrings(p-
1000: 3e 70 53 65 6c 65 63 74 2c 20 6f 66 66 73 65 74  >pSelect, offset
1010: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
1020: 45 78 70 72 4c 69 73 74 4d 6f 76 65 53 74 72 69  ExprListMoveStri
1030: 6e 67 73 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ngs(ExprList *pL
1040: 69 73 74 2c 20 69 6e 74 20 6f 66 66 73 65 74 29  ist, int offset)
1050: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1060: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1070: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1080: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1090: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  ++){.    sqliteE
10a0: 78 70 72 4d 6f 76 65 53 74 72 69 6e 67 73 28 70  xprMoveStrings(p
10b0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10c0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 7d 0a 7d  , offset);.  }.}
10d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 65 6c 65  .void sqliteSele
10e0: 63 74 4d 6f 76 65 53 74 72 69 6e 67 73 28 53 65  ctMoveStrings(Se
10f0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 69  lect *pSelect, i
1100: 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 69 66  nt offset){.  if
1110: 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 72  ( pSelect==0 ) r
1120: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 45  eturn;.  sqliteE
1130: 78 70 72 4c 69 73 74 4d 6f 76 65 53 74 72 69 6e  xprListMoveStrin
1140: 67 73 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  gs(pSelect->pELi
1150: 73 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 73  st, offset);.  s
1160: 71 6c 69 74 65 45 78 70 72 4d 6f 76 65 53 74 72  qliteExprMoveStr
1170: 69 6e 67 73 28 70 53 65 6c 65 63 74 2d 3e 70 57  ings(pSelect->pW
1180: 68 65 72 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  here, offset);. 
1190: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 4d   sqliteExprListM
11a0: 6f 76 65 53 74 72 69 6e 67 73 28 70 53 65 6c 65  oveStrings(pSele
11b0: 63 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 6f 66  ct->pGroupBy, of
11c0: 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 45  fset);.  sqliteE
11d0: 78 70 72 4d 6f 76 65 53 74 72 69 6e 67 73 28 70  xprMoveStrings(p
11e0: 53 65 6c 65 63 74 2d 3e 70 48 61 76 69 6e 67 2c  Select->pHaving,
11f0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 73 71 6c 69   offset);.  sqli
1200: 74 65 45 78 70 72 4c 69 73 74 4d 6f 76 65 53 74  teExprListMoveSt
1210: 72 69 6e 67 73 28 70 53 65 6c 65 63 74 2d 3e 70  rings(pSelect->p
1220: 4f 72 64 65 72 42 79 2c 20 6f 66 66 73 65 74 29  OrderBy, offset)
1230: 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74  ;.  sqliteSelect
1240: 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 53 65 6c  MoveStrings(pSel
1250: 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 6f 66 66  ect->pPrior, off
1260: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  set);.}../*.** T
1270: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f  he following gro
1280: 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d  up of routines m
1290: 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20  ake deep copies 
12a0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  of expressions,.
12b0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
12c0: 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61  sts, ID lists, a
12d0: 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd select statem
12e0: 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65  ents.  The copie
12f0: 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65  s can.** be dele
1300: 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61  ted (by being pa
1310: 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65  ssed to their re
1320: 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65  spective ...Dele
1330: 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a  te() routines).*
1340: 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74  * without effect
1350: 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
1360: 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 2c 20 68  s..**.** Note, h
1370: 6f 77 65 76 65 72 2c 20 74 68 61 74 20 74 68 65  owever, that the
1380: 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 61 6e   Expr.token.z an
1390: 64 20 45 78 70 72 2e 73 70 61 6e 2e 7a 20 66 69  d Expr.span.z fi
13a0: 65 6c 64 73 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  elds point to.**
13b0: 20 73 74 72 69 6e 67 20 73 70 61 63 65 20 74 68   string space th
13c0: 61 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  at is allocated 
13d0: 73 65 70 61 72 61 74 65 6c 79 20 66 72 6f 6d 20  separately from 
13e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
13f0: 72 65 65 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 20  ree.** itself.  
1400: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 64  These routines d
1410: 6f 20 4e 4f 54 20 64 75 70 6c 69 63 61 74 65 20  o NOT duplicate 
1420: 74 68 61 74 20 73 74 72 69 6e 67 20 73 70 61 63  that string spac
1430: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70  e..**.** The exp
1440: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 61 6e 64  ression list and
1450: 20 49 44 20 6c 69 73 74 20 72 65 74 75 72 6e 20   ID list return 
1460: 62 79 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73  by sqliteExprLis
1470: 74 44 75 70 28 29 20 61 6e 64 20 0a 2a 2a 20 73  tDup() and .** s
1480: 71 6c 69 74 65 49 64 4c 69 73 74 44 75 70 28 29  qliteIdListDup()
1490: 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74   can not be furt
14a0: 68 65 72 20 65 78 70 61 6e 64 65 64 20 62 79 20  her expanded by 
14b0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
14c0: 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 45 78 70  .** to sqliteExp
14d0: 72 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6f 72  rListAppend() or
14e0: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70   sqliteIdListApp
14f0: 65 6e 64 28 29 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  end()..**.** Any
1500: 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65   tables that the
1510: 20 49 44 20 6c 69 73 74 20 6d 69 67 68 74 20 70   ID list might p
1520: 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20  oint to are not 
1530: 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45  duplicated..*/.E
1540: 78 70 72 20 2a 73 71 6c 69 74 65 45 78 70 72 44  xpr *sqliteExprD
1550: 75 70 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 45  up(Expr *p){.  E
1560: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28  xpr *pNew;.  if(
1570: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
1580: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
1590: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
15a0: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
15b0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
15c0: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
15d0: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65  >op;.  pNew->pLe
15e0: 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 44  ft = sqliteExprD
15f0: 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  up(p->pLeft);.  
1600: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
1610: 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 2d 3e  qliteExprDup(p->
1620: 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d  pRight);.  pNew-
1630: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45  >pList = sqliteE
1640: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4c  xprListDup(p->pL
1650: 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 54  ist);.  pNew->iT
1660: 61 62 6c 65 20 3d 20 70 2d 3e 69 54 61 62 6c 65  able = p->iTable
1670: 3b 0a 20 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d  ;.  pNew->iColum
1680: 6e 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  n = p->iColumn;.
1690: 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 70    pNew->iAgg = p
16a0: 2d 3e 69 41 67 67 3b 0a 20 20 70 4e 65 77 2d 3e  ->iAgg;.  pNew->
16b0: 74 6f 6b 65 6e 20 3d 20 70 2d 3e 74 6f 6b 65 6e  token = p->token
16c0: 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d  ;.  pNew->span =
16d0: 20 70 2d 3e 73 70 61 6e 3b 0a 20 20 70 4e 65 77   p->span;.  pNew
16e0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
16f0: 74 65 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70  teSelectDup(p->p
1700: 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72  Select);.  retur
1710: 6e 20 70 4e 65 77 3b 0a 7d 0a 45 78 70 72 4c 69  n pNew;.}.ExprLi
1720: 73 74 20 2a 73 71 6c 69 74 65 45 78 70 72 4c 69  st *sqliteExprLi
1730: 73 74 44 75 70 28 45 78 70 72 4c 69 73 74 20 2a  stDup(ExprList *
1740: 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  p){.  ExprList *
1750: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
1760: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1770: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
1780: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
1790: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
17a0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
17b0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
17c0: 6e 45 78 70 72 20 3d 20 70 2d 3e 6e 45 78 70 72  nExpr = p->nExpr
17d0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
17e0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e  liteMalloc( p->n
17f0: 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  Expr*sizeof(p->a
1800: 5b 30 5d 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  [0]) );.  for(i=
1810: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
1820: 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ++){.    pNew->a
1830: 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69  [i].pExpr = sqli
1840: 74 65 45 78 70 72 44 75 70 28 70 2d 3e 61 5b 69  teExprDup(p->a[i
1850: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 70 4e  ].pExpr);.    pN
1860: 65 77 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  ew->a[i].zName =
1870: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 2d   sqliteStrDup(p-
1880: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
1890: 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 73 6f 72    pNew->a[i].sor
18a0: 74 4f 72 64 65 72 20 3d 20 70 2d 3e 61 5b 69 5d  tOrder = p->a[i]
18b0: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
18c0: 70 4e 65 77 2d 3e 61 5b 69 5d 2e 69 73 41 67 67  pNew->a[i].isAgg
18d0: 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73 41 67 67   = p->a[i].isAgg
18e0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d  ;.    pNew->a[i]
18f0: 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  .done = 0;.  }. 
1900: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1910: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 49 64  IdList *sqliteId
1920: 4c 69 73 74 44 75 70 28 49 64 4c 69 73 74 20 2a  ListDup(IdList *
1930: 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e  p){.  IdList *pN
1940: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
1950: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1960: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
1970: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
1980: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
1990: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
19a0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
19b0: 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  d = p->nId;.  pN
19c0: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61  ew->a = sqliteMa
19d0: 6c 6c 6f 63 28 20 70 2d 3e 6e 49 64 2a 73 69 7a  lloc( p->nId*siz
19e0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
19f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
1a00: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  nId; i++){.    p
1a10: 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  New->a[i].zName 
1a20: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
1a30: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
1a40: 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 7a 41     pNew->a[i].zA
1a50: 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 53 74 72  lias = sqliteStr
1a60: 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  Dup(p->a[i].zAli
1a70: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  as);.    pNew->a
1a80: 5b 69 5d 2e 69 64 78 20 3d 20 70 2d 3e 61 5b 69  [i].idx = p->a[i
1a90: 5d 2e 69 64 78 3b 0a 20 20 20 20 70 4e 65 77 2d  ].idx;.    pNew-
1aa0: 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 30 3b 0a  >a[i].pTab = 0;.
1ab0: 20 20 20 20 70 4e 65 77 2d 3e 61 5b 69 5d 2e 70      pNew->a[i].p
1ac0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53  Select = sqliteS
1ad0: 65 6c 65 63 74 44 75 70 28 70 2d 3e 61 5b 69 5d  electDup(p->a[i]
1ae0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20  .pSelect);.  }. 
1af0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1b00: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 53 65  Select *sqliteSe
1b10: 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74 20 2a  lectDup(Select *
1b20: 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e  p){.  Select *pN
1b30: 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ew;.  if( p==0 )
1b40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
1b50: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
1b60: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
1b70: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
1b80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
1b90: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70  ->isDistinct = p
1ba0: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
1bb0: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
1bc0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70  qliteExprListDup
1bd0: 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  (p->pEList);.  p
1be0: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
1bf0: 74 65 49 64 4c 69 73 74 44 75 70 28 70 2d 3e 70  teIdListDup(p->p
1c00: 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  Src);.  pNew->pW
1c10: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 45 78 70  here = sqliteExp
1c20: 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29 3b  rDup(p->pWhere);
1c30: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
1c40: 79 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69  y = sqliteExprLi
1c50: 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75 70 42  stDup(p->pGroupB
1c60: 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  y);.  pNew->pHav
1c70: 69 6e 67 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ing = sqliteExpr
1c80: 44 75 70 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b  Dup(p->pHaving);
1c90: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
1ca0: 79 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69  y = sqliteExprLi
1cb0: 73 74 44 75 70 28 70 2d 3e 70 4f 72 64 65 72 42  stDup(p->pOrderB
1cc0: 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  y);.  pNew->op =
1cd0: 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e   p->op;.  pNew->
1ce0: 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 53  pPrior = sqliteS
1cf0: 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 50 72 69  electDup(p->pPri
1d00: 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 69  or);.  pNew->nLi
1d10: 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b  mit = p->nLimit;
1d20: 0a 20 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74  .  pNew->nOffset
1d30: 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20   = p->nOffset;. 
1d40: 20 70 4e 65 77 2d 3e 7a 53 65 6c 65 63 74 20 3d   pNew->zSelect =
1d50: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   0;.  return pNe
1d60: 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  w;.}.../*.** Add
1d70: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
1d80: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
1d90: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
1da0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
1db0: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
1dc0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
1dd0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
1de0: 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  st..*/.ExprList 
1df0: 2a 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41  *sqliteExprListA
1e00: 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20 2a  ppend(ExprList *
1e10: 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78  pList, Expr *pEx
1e20: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  pr, Token *pName
1e30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1e40: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
1e50: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1e60: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
1e70: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
1e80: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
1e90: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
1ea0: 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20  Delete(pExpr);. 
1eb0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1ec0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
1ed0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 37  pList->nExpr & 7
1ee0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
1ef0: 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
1f00: 20 2b 20 38 3b 0a 20 20 20 20 73 74 72 75 63 74   + 8;.    struct
1f10: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1f20: 61 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  a;.    a = sqlit
1f30: 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
1f40: 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73  a, n*sizeof(pLis
1f50: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
1f60: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( a==0 ){.     
1f70: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
1f80: 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  e(pExpr);.      
1f90: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20  return pList;.  
1fa0: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
1fb0: 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = a;.  }.  if( 
1fc0: 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29  pExpr || pName )
1fd0: 7b 0a 20 20 20 20 69 20 3d 20 70 4c 69 73 74 2d  {.    i = pList-
1fe0: 3e 6e 45 78 70 72 2b 2b 3b 0a 20 20 20 20 70 4c  >nExpr++;.    pL
1ff0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
2000: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 69  = pExpr;.    pLi
2010: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
2020: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d   0;.    if( pNam
2030: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
2040: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69  eSetNString(&pLi
2050: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
2060: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
2070: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  >n, 0);.      sq
2080: 6c 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73  liteDequote(pLis
2090: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
20a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20b0: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
20c0: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
20d0: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
20e0: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
20f0: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
2100: 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  e(ExprList *pLis
2110: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
2120: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
2130: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
2140: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
2150: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
2160: 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73  eExprDelete(pLis
2170: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
2180: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2190: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
21a0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
21b0: 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  ree(pList->a);. 
21c0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
21d0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  t);.}../*.** Wal
21e0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
21f0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
2200: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
2210: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
2220: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
2230: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 2e  olves variables.
2240: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78  .*/.int sqliteEx
2250: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  prIsConstant(Exp
2260: 72 20 2a 70 29 7b 0a 20 20 73 77 69 74 63 68 28  r *p){.  switch(
2270: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
2280: 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61  se TK_ID:.    ca
2290: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
22a0: 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20    case TK_DOT:. 
22b0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
22c0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
22d0: 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ER:.    case TK_
22e0: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
22f0: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20  TK_STRING:.     
2300: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 64   return 1;.    d
2310: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
2320: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20  if( p->pLeft && 
2330: 21 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e  !sqliteExprIsCon
2340: 73 74 61 6e 74 28 70 2d 3e 70 4c 65 66 74 29 20  stant(p->pLeft) 
2350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2360: 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20    if( p->pRight 
2370: 26 26 20 21 73 71 6c 69 74 65 45 78 70 72 49 73  && !sqliteExprIs
2380: 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 52 69 67  Constant(p->pRig
2390: 68 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ht) ) return 0;.
23a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69        if( p->pLi
23b0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  st ){.        in
23c0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
23d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 4c 69 73 74  (i=0; i<p->pList
23e0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
23f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
2400: 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61  liteExprIsConsta
2410: 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  nt(p->pList->a[i
2420: 5d 2e 70 45 78 70 72 29 20 29 20 72 65 74 75 72  ].pExpr) ) retur
2430: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
2440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2450: 75 72 6e 20 70 2d 3e 70 4c 65 66 74 21 3d 30 20  urn p->pLeft!=0 
2460: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 21 3d 30 20  || p->pRight!=0 
2470: 7c 7c 20 28 70 2d 3e 70 4c 69 73 74 20 26 26 20  || (p->pList && 
2480: 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  p->pList->nExpr>
2490: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
24a0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
24b0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
24c0: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
24d0: 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63  ng is a row-id c
24e0: 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  olumn name..*/.s
24f0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
2500: 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
2510: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
2520: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 22  liteStrICmp(z, "
2530: 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72  _ROWID_")==0 ) r
2540: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
2550: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20  qliteStrICmp(z, 
2560: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
2570: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
2580: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 22  liteStrICmp(z, "
2590: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
25a0: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
25b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
25c0: 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20  outine walks an 
25d0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
25e0: 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66  and resolves ref
25f0: 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61  erences to.** ta
2600: 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f  ble columns.  No
2610: 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  des of the form 
2620: 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f  ID.ID or ID reso
2630: 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69  lve into an.** i
2640: 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c  ndex to the tabl
2650: 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c  e in the table l
2660: 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e  ist and a column
2670: 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a   offset.  The .*
2680: 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f  * Expr.opcode fo
2690: 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20  r such nodes is 
26a0: 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  changed to TK_CO
26b0: 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e  LUMN.  The Expr.
26c0: 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20  iTable.** value 
26d0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
26e0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72  e index of the r
26f0: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20  eferenced table 
2700: 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70  in pTabList.** p
2710: 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20 76  lus the "base" v
2720: 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65 20  alue.  The base 
2730: 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d  value will ultim
2740: 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65  ately become the
2750: 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20  .** VDBE cursor 
2760: 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72  number for a cur
2770: 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e  sor that is poin
2780: 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65  ting into the re
2790: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c  ferenced.** tabl
27a0: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
27b0: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68  lumn value is ch
27c0: 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64  anged to the ind
27d0: 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
27e0: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65   .** of the refe
27f0: 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54  renced table.  T
2800: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
2810: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70  value for the sp
2820: 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63  ecial.** ROWID c
2830: 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e  olumn is -1.  An
2840: 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  y INTEGER PRIMAR
2850: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20  Y KEY column is 
2860: 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61  tried as an.** a
2870: 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a  lias for ROWID..
2880: 2a 2a 0a 2a 2a 20 57 65 20 61 6c 73 6f 20 63 68  **.** We also ch
2890: 65 63 6b 20 66 6f 72 20 69 6e 73 74 61 6e 63 65  eck for instance
28a0: 73 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  s of the IN oper
28b0: 61 74 6f 72 2e 20 20 49 4e 20 63 6f 6d 65 73 20  ator.  IN comes 
28c0: 69 6e 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a  in two.** forms:
28d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
28e0: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
28f0: 73 74 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20  st).** and.**   
2900: 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e 20          expr IN 
2910: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a  (SELECT ...).**.
2920: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
2930: 6d 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20  m is handled by 
2940: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 68  creating a set h
2950: 6f 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74 0a  olding the list.
2960: 2a 2a 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61  ** of allowed va
2970: 6c 75 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e  lues.  The secon
2980: 64 20 66 6f 72 6d 20 63 61 75 73 65 73 20 74 68  d form causes th
2990: 65 20 53 45 4c 45 43 54 20 74 6f 20 67 65 6e 65  e SELECT to gene
29a0: 72 61 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f  rate .** a tempo
29b0: 72 61 72 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  rary table..**.*
29c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
29d0: 6c 73 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20 73 63  lso looks for sc
29e0: 61 6c 61 72 20 53 45 4c 45 43 54 73 20 74 68 61  alar SELECTs tha
29f0: 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 61 6e  t are part of an
2a00: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
2a10: 49 66 20 69 74 20 66 69 6e 64 73 20 61 6e 79 2c  If it finds any,
2a20: 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 63 6f   it generates co
2a30: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
2a40: 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73 65  value of that se
2a50: 6c 65 63 74 0a 2a 2a 20 69 6e 74 6f 20 61 20 6d  lect.** into a m
2a60: 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  emory cell..**.*
2a70: 2a 20 55 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e  * Unknown column
2a80: 73 20 6f 72 20 74 61 62 6c 65 73 20 70 72 6f 76  s or tables prov
2a90: 6f 6b 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 54  oke an error.  T
2aa0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
2ab0: 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  rns.** the numbe
2ac0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
2ad0: 20 61 6e 64 20 6c 65 61 76 65 73 20 61 6e 20 65   and leaves an e
2ae0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e 20  rror message on 
2af0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2b00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78  .*/.int sqliteEx
2b10: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 0a 20 20  prResolveIds(.  
2b20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2b30: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
2b40: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
2b50: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
2b60: 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
2b70: 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74  number for first
2b80: 20 65 6e 74 72 79 20 69 6e 20 70 54 61 62 4c 69   entry in pTabLi
2b90: 73 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  st */.  IdList *
2ba0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
2bb0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65  st of tables use
2bc0: 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 63 6f 6c  d to resolve col
2bd0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 45  umn names */.  E
2be0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
2bf0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78 70    /* List of exp
2c00: 72 65 73 73 69 6f 6e 73 20 75 73 65 64 20 74 6f  ressions used to
2c10: 20 72 65 73 6f 6c 76 65 20 22 41 53 22 20 2a 2f   resolve "AS" */
2c20: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
2c30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
2c40: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
2c50: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20  alyzed. */.){.  
2c60: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20  if( pExpr==0 || 
2c70: 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 20 72 65  pTabList==0 ) re
2c80: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
2c90: 28 20 62 61 73 65 2b 70 54 61 62 4c 69 73 74 2d  ( base+pTabList-
2ca0: 3e 6e 49 64 3c 3d 70 50 61 72 73 65 2d 3e 6e 54  >nId<=pParse->nT
2cb0: 61 62 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  ab );.  switch( 
2cc0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
2cd0: 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74   /* A lone ident
2ce0: 69 66 69 65 72 2e 20 20 54 72 79 20 61 6e 64 20  ifier.  Try and 
2cf0: 6d 61 74 63 68 20 69 74 20 61 73 20 66 6f 6c 6c  match it as foll
2d00: 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ows:.    **.    
2d10: 2a 2a 20 20 20 20 20 31 2e 20 20 54 6f 20 74 68  **     1.  To th
2d20: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
2d30: 6d 6e 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  mn of one of the
2d40: 20 74 61 62 6c 65 73 20 69 6e 20 70 54 61 62 4c   tables in pTabL
2d50: 69 73 74 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ist.    **.    *
2d60: 2a 20 20 20 20 20 32 2e 20 20 54 6f 20 74 68 65  *     2.  To the
2d70: 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 61   right side of a
2d80: 6e 20 41 53 20 6b 65 79 77 6f 72 64 20 69 6e 20  n AS keyword in 
2d90: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  the column list 
2da0: 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  of.    **       
2db0: 20 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65    a SELECT state
2dc0: 6d 65 6e 74 2e 20 20 28 46 6f 72 20 65 78 61 6d  ment.  (For exam
2dd0: 70 6c 65 2c 20 6d 61 74 63 68 20 61 67 61 69 6e  ple, match again
2de0: 73 74 20 27 78 27 20 69 6e 0a 20 20 20 20 2a 2a  st 'x' in.    **
2df0: 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
2e00: 20 61 2b 62 20 41 53 20 27 78 27 20 46 52 4f 4d   a+b AS 'x' FROM
2e10: 20 74 31 22 2e 29 0a 20 20 20 20 2a 2a 0a 20 20   t1".).    **.  
2e20: 20 20 2a 2a 20 20 20 20 20 33 2e 20 20 4f 6e 65    **     3.  One
2e30: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
2e40: 6e 61 6d 65 73 20 22 52 4f 57 49 44 22 2c 20 22  names "ROWID", "
2e50: 4f 49 44 22 2c 20 6f 72 20 22 5f 52 4f 57 49 44  OID", or "_ROWID
2e60: 5f 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  _"..    */.    c
2e70: 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20  ase TK_ID: {.   
2e80: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20     int cnt = 0; 
2e90: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ea0: 66 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  f matches */.   
2eb0: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
2ec0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2ed0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 68  nter */.      ch
2ee0: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 61 73 73  ar *z;.      ass
2ef0: 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ert( pExpr->toke
2f00: 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d  n.z );.      z =
2f10: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
2f20: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
2f30: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
2f40: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
2f50: 6f 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 69 66  ote(z);.      if
2f60: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
2f70: 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  1;.      for(i=0
2f80: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 49  ; i<pTabList->nI
2f90: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; i++){.       
2fa0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
2fb0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
2fc0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
2fd0: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  b;.        if( p
2fe0: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
2ff0: 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
3000: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
3010: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
3020: 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
3030: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3040: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
3050: 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  Cmp(pTab->aCol[j
3060: 5d 2e 7a 4e 61 6d 65 2c 20 7a 29 3d 3d 30 20 29  ].zName, z)==0 )
3070: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  {.            cn
3080: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
3090: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
30a0: 20 69 20 2b 20 62 61 73 65 3b 0a 20 20 20 20 20   i + base;.     
30b0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54         if( j==pT
30c0: 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
30d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
30e0: 62 73 74 69 74 75 74 65 20 74 68 65 20 72 65 63  bstitute the rec
30f0: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
3100: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
3110: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20  RY KEY */.      
3120: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
3130: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
3140: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
3160: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
3170: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
3180: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
3190: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
31a0: 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  N;.          }. 
31b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31c0: 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  .      if( cnt==
31d0: 30 20 26 26 20 70 45 4c 69 73 74 21 3d 30 20 29  0 && pEList!=0 )
31e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  {.        int j;
31f0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
3200: 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; j<pEList->nExp
3210: 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
3220: 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70     char *zAs = p
3230: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  EList->a[j].zNam
3240: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
3250: 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74   zAs!=0 && sqlit
3260: 65 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 29  eStrICmp(zAs, z)
3270: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
3280: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
3290: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
32a0: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
32b0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
32c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
32d0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
32e0: 41 53 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AS;.            
32f0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
3300: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
3310: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
3320: 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 45 4c  qliteExprDup(pEL
3330: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
3340: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3350: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
3360: 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  .      if( cnt==
3370: 30 20 26 26 20 73 71 6c 69 74 65 49 73 52 6f 77  0 && sqliteIsRow
3380: 69 64 28 7a 29 20 29 7b 0a 20 20 20 20 20 20 20  id(z) ){.       
3390: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
33a0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45  = -1;.        pE
33b0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 62 61  xpr->iTable = ba
33c0: 73 65 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 20  se;.        cnt 
33d0: 3d 20 31 20 2b 20 28 70 54 61 62 4c 69 73 74 2d  = 1 + (pTabList-
33e0: 3e 6e 49 64 3e 31 29 3b 0a 20 20 20 20 20 20 20  >nId>1);.       
33f0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
3400: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 7d 0a  COLUMN;.      }.
3410: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
3420: 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  (z);.      if( c
3430: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nt==0 ){.       
3440: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
3450: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3460: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  sg, "no such col
3470: 75 6d 6e 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20  umn: ", -1,  .  
3480: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
3490: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
34a0: 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20  oken.n, 0);.    
34b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
34c0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ++;.        retu
34d0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 1;.      }els
34e0: 65 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a 20  e if( cnt>1 ){. 
34f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
3500: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
3510: 3e 7a 45 72 72 4d 73 67 2c 20 22 61 6d 62 69 67  >zErrMsg, "ambig
3520: 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uous column name
3530: 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20  : ", -1,  .     
3540: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
3550: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
3560: 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  n.n, 0);.       
3570: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3580: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3590: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
35a0: 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 20   break; .    }. 
35b0: 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65   .    /* A table
35c0: 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e   name and column
35d0: 20 6e 61 6d 65 3a 20 20 49 44 2e 49 44 20 2a 2f   name:  ID.ID */
35e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
35f0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e  : {.      int cn
3600: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
3610: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3620: 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
3630: 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b   int cntTab = 0;
3640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3650: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3660: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
3670: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
3680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
3690: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
36a0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a    Expr *pLeft, *
36b0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 4c 65  pRight;    /* Le
36c0: 66 74 20 61 6e 64 20 72 69 67 68 74 20 73 75 62  ft and right sub
36d0: 62 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20  branches of the 
36e0: 65 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 63 68  expr */.      ch
36f0: 61 72 20 2a 7a 4c 65 66 74 2c 20 2a 7a 52 69 67  ar *zLeft, *zRig
3700: 68 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  ht;    /* Text o
3710: 66 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  f an identifier 
3720: 2a 2f 0a 0a 20 20 20 20 20 20 70 4c 65 66 74 20  */..      pLeft 
3730: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
3740: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
3750: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
3760: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
3770: 74 20 26 26 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d  t && pLeft->op==
3780: 54 4b 5f 49 44 20 26 26 20 70 4c 65 66 74 2d 3e  TK_ID && pLeft->
3790: 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20  token.z );.     
37a0: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 20   assert( pRight 
37b0: 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  && pRight->op==T
37c0: 4b 5f 49 44 20 26 26 20 70 52 69 67 68 74 2d 3e  K_ID && pRight->
37d0: 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20  token.z );.     
37e0: 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 53   zLeft = sqliteS
37f0: 74 72 4e 44 75 70 28 70 4c 65 66 74 2d 3e 74 6f  trNDup(pLeft->to
3800: 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f  ken.z, pLeft->to
3810: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7a 52  ken.n);.      zR
3820: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 53 74 72  ight = sqliteStr
3830: 4e 44 75 70 28 70 52 69 67 68 74 2d 3e 74 6f 6b  NDup(pRight->tok
3840: 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e 74 6f  en.z, pRight->to
3850: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 69 66  ken.n);.      if
3860: 28 20 7a 4c 65 66 74 3d 3d 30 20 7c 7c 20 7a 52  ( zLeft==0 || zR
3870: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
3880: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c     sqliteFree(zL
3890: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eft);.        sq
38a0: 6c 69 74 65 46 72 65 65 28 7a 52 69 67 68 74 29  liteFree(zRight)
38b0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
38c0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
38d0: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
38e0: 7a 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  zLeft);.      sq
38f0: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67  liteDequote(zRig
3900: 68 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ht);.      pExpr
3910: 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20  ->iTable = -1;. 
3920: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
3930: 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69  pTabList->nId; i
3940: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
3950: 20 6a 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   j;.        char
3960: 20 2a 7a 54 61 62 3b 0a 20 20 20 20 20 20 20 20   *zTab;.        
3970: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
3980: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
3990: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  b;.        if( p
39a0: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
39b0: 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
39c0: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
39d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
39e0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
39f0: 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
3a00: 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73    zTab = pTabLis
3a10: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a  t->a[i].zAlias;.
3a20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
3a30: 20 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20           zTab = 
3a40: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
3a50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
3a60: 66 28 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 73 71  f( zTab==0 || sq
3a70: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 54 61 62  liteStrICmp(zTab
3a80: 2c 20 7a 4c 65 66 74 29 21 3d 30 20 29 20 63 6f  , zLeft)!=0 ) co
3a90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
3aa0: 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b  if( 0==(cntTab++
3ab0: 29 20 29 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ) ) pExpr->iTabl
3ac0: 65 20 3d 20 69 20 2b 20 62 61 73 65 3b 0a 20 20  e = i + base;.  
3ad0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3ae0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
3af0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
3b00: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70   sqliteStrICmp(p
3b10: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
3b20: 6d 65 2c 20 7a 52 69 67 68 74 29 3d 3d 30 20 29  me, zRight)==0 )
3b30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  {.            cn
3b40: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
3b50: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
3b60: 20 69 20 2b 20 62 61 73 65 3b 0a 20 20 20 20 20   i + base;.     
3b70: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54         if( j==pT
3b80: 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
3b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
3ba0: 62 73 74 69 74 75 74 65 20 74 68 65 20 72 65 63  bstitute the rec
3bb0: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
3bc0: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
3bd0: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20  RY KEY */.      
3be0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
3bf0: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
3c00: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
3c20: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
3c30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
3c40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
3c60: 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61       /* If we ha
3c70: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72  ve not already r
3c80: 65 73 6f 6c 76 65 64 20 74 68 69 73 20 2a 2e 2a  esolved this *.*
3c90: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
3ca0: 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 20 20 20  n maybe .       
3cb0: 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20  * it is a new.* 
3cc0: 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72  or old.* trigger
3cd0: 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65   argument refere
3ce0: 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nce */.      if(
3cf0: 20 63 6e 74 20 3d 3d 20 30 20 26 26 20 70 50 61   cnt == 0 && pPa
3d00: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 21  rse->trigStack !
3d10: 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 54  = 0 ){.        T
3d20: 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72  riggerStack *pTr
3d30: 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61  iggerStack = pPa
3d40: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a  rse->trigStack;.
3d50: 20 20 20 20 20 20 20 20 69 6e 74 20 74 20 3d 20          int t = 
3d60: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  0;.        if( p
3d70: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
3d80: 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71  wIdx != -1 && sq
3d90: 6c 69 74 65 53 74 72 49 43 6d 70 28 22 6e 65 77  liteStrICmp("new
3da0: 22 2c 20 7a 4c 65 66 74 29 20 3d 3d 20 30 20 29  ", zLeft) == 0 )
3db0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
3dc0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
3dd0: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64  ggerStack->newId
3de0: 78 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74  x;.          cnt
3df0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
3e00: 20 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20   t = 1;.        
3e10: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  }.        if( pT
3e20: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
3e30: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
3e40: 69 74 65 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  iteStrICmp("old"
3e50: 2c 20 7a 4c 65 66 74 29 20 3d 3d 20 30 20 29 7b  , zLeft) == 0 ){
3e60: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
3e70: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67  ->iTable = pTrig
3e80: 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78  gerStack->oldIdx
3e90: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 54  ;.          cntT
3ea0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
3eb0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
3ec0: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 20  ..        if( t 
3ed0: 29 7b 20 0a 09 20 20 69 6e 74 20 6a 3b 0a 20 20  ){ ..  int j;.  
3ee0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
3ef0: 20 6a 20 3c 20 70 54 72 69 67 67 65 72 53 74 61   j < pTriggerSta
3f00: 63 6b 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ck->pTab->nCol; 
3f10: 6a 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20  j++) {.         
3f20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
3f30: 49 43 6d 70 28 70 54 72 69 67 67 65 72 53 74 61  ICmp(pTriggerSta
3f40: 63 6b 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  ck->pTab->aCol[j
3f50: 5d 2e 7a 4e 61 6d 65 2c 20 7a 52 69 67 68 74 29  ].zName, zRight)
3f60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
3f70: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
3f80: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
3f90: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  >iColumn = j;.  
3fa0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3fb0: 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 20        }..}.     
3fc0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 63 6e   }..      if( cn
3fd0: 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d  t==0 && cntTab==
3fe0: 31 20 26 26 20 73 71 6c 69 74 65 49 73 52 6f 77  1 && sqliteIsRow
3ff0: 69 64 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  id(zRight) ){.  
4000: 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20        cnt = 1;. 
4010: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
4020: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
4030: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
4040: 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 20  Free(zLeft);.   
4050: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52     sqliteFree(zR
4060: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ight);.      if(
4070: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   cnt==0 ){.     
4080: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
4090: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
40a0: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 63  rMsg, "no such c
40b0: 6f 6c 75 6d 6e 3a 20 22 2c 20 2d 31 2c 20 20 0a  olumn: ", -1,  .
40c0: 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 2d            pLeft-
40d0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d  >token.z, pLeft-
40e0: 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 2e 22 2c 20 31  >token.n, ".", 1
40f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 52 69  , .          pRi
4100: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52  ght->token.z, pR
4110: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30  ight->token.n, 0
4120: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
4130: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
4140: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
4150: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6e 74     }else if( cnt
4160: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >1 ){.        sq
4170: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
4180: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
4190: 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75   "ambiguous colu
41a0: 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 2d 31 2c 20  mn name: ", -1, 
41b0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 66   .          pLef
41c0: 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66  t->token.z, pLef
41d0: 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 2e 22 2c  t->token.n, ".",
41e0: 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 70 52   1,.          pR
41f0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  ight->token.z, p
4200: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  Right->token.n, 
4210: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
4220: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
4230: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4240: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4250: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65  teExprDelete(pLe
4260: 66 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ft);.      pExpr
4270: 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  ->pLeft = 0;.   
4280: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
4290: 65 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20  ete(pRight);.   
42a0: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
42b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 45 78 70   = 0;.      pExp
42c0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
42d0: 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  N;.      break;.
42e0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
42f0: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 56  TK_IN: {.      V
4300: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47  dbe *v = sqliteG
4310: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
4320: 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29        if( v==0 )
4330: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
4340: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52   if( sqliteExprR
4350: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
4360: 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74  , base, pTabList
4370: 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d  , pEList, pExpr-
4380: 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20  >pLeft) ){.     
4390: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
43a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
43b0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
43c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
43d0: 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
43e0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
43f0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
4400: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
4410: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
4420: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
4430: 65 63 74 20 69 6e 74 6f 20 61 20 74 65 6d 70 6f  ect into a tempo
4440: 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
4450: 74 61 62 6c 65 2e 20 20 54 68 65 20 63 75 72 73  table.  The curs
4460: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
4470: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
4480: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 20   has already.   
4490: 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 70 75 74       ** been put
44a0: 20 69 6e 20 69 54 61 62 6c 65 20 62 79 20 73 71   in iTable by sq
44b0: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
44c0: 6e 53 65 6c 65 63 74 28 29 2e 0a 20 20 20 20 20  nSelect()..     
44d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45     */.        pE
44e0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
44f0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
4500: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4510: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
4520: 54 65 6d 70 2c 20 70 45 78 70 72 2d 3e 69 54 61  Temp, pExpr->iTa
4530: 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ble, 1);.       
4540: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50   sqliteSelect(pP
4550: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
4560: 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 70  lect, SRT_Set, p
4570: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
4580: 30 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  0,0);.      }els
4590: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69  e if( pExpr->pLi
45a0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
45b0: 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
45c0: 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
45d0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
45e0: 20 20 20 2a 2a 20 43 72 65 61 74 65 20 61 20 73     ** Create a s
45f0: 65 74 20 74 6f 20 70 75 74 20 74 68 65 20 65 78  et to put the ex
4600: 70 72 6c 69 73 74 20 76 61 6c 75 65 73 20 69 6e  prlist values in
4610: 2e 20 20 54 68 65 20 53 65 74 20 69 64 20 69 73  .  The Set id is
4620: 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20   stored.        
4630: 2a 2a 20 69 6e 20 69 54 61 62 6c 65 2e 0a 20 20  ** in iTable..  
4640: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
4650: 20 69 6e 74 20 69 2c 20 69 53 65 74 3b 0a 20 20   int i, iSet;.  
4660: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
4670: 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e  <pExpr->pList->n
4680: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
4690: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20        Expr *pE2 
46a0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
46b0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
46c0: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
46d0: 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  eExprIsConstant(
46e0: 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
46f0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
4700: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
4710: 72 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rMsg,.          
4720: 20 20 20 20 22 72 69 67 68 74 2d 68 61 6e 64 20      "right-hand 
4730: 73 69 64 65 20 6f 66 20 49 4e 20 6f 70 65 72 61  side of IN opera
4740: 74 6f 72 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  tor must be cons
4750: 74 61 6e 74 22 2c 20 30 29 3b 0a 20 20 20 20 20  tant", 0);.     
4760: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
4770: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
4780: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
4790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
47a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
47b0: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
47c0: 45 32 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  E2, 0, 0) ){.   
47d0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
47e0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
47f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4800: 20 69 53 65 74 20 3d 20 70 45 78 70 72 2d 3e 69   iSet = pExpr->i
4810: 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
4820: 6e 53 65 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nSet++;.        
4830: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72  for(i=0; i<pExpr
4840: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  ->pList->nExpr; 
4850: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
4860: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70  Expr *pE2 = pExp
4870: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
4880: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
4890: 73 77 69 74 63 68 28 20 70 45 32 2d 3e 6f 70 20  switch( pE2->op 
48a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
48b0: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
48c0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
48d0: 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20  K_INTEGER:.     
48e0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 53         case TK_S
48f0: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 20  TRING: {.       
4900: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
4910: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
4920: 70 28 76 2c 20 4f 50 5f 53 65 74 49 6e 73 65 72  p(v, OP_SetInser
4930: 74 2c 20 69 53 65 74 2c 20 30 29 3b 0a 20 20 20  t, iSet, 0);.   
4940: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
4950: 74 28 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e 7a 20  t( pE2->token.z 
4960: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
4970: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
4980: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 45 32  eP3(v, addr, pE2
4990: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 32 2d 3e  ->token.z, pE2->
49a0: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
49b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
49c0: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61  beDequoteP3(v, a
49d0: 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
49e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
49f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4a00: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
4a20: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
4a30: 72 73 65 2c 20 70 45 32 29 3b 0a 20 20 20 20 20  rse, pE2);.     
4a40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
4a50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4a60: 65 74 49 6e 73 65 72 74 2c 20 69 53 65 74 2c 20  etInsert, iSet, 
4a70: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
4a80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4aa0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
4ab0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
4ac0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
4ad0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
4ae0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73       /* This has
4af0: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
4b00: 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74  SELECT.  Generat
4b10: 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
4b20: 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65  e.      ** value
4b30: 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20   of this select 
4b40: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  in a memory cell
4b50: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20   and record the 
4b60: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  number.      ** 
4b70: 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
4b80: 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20  ll in iColumn.. 
4b90: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45       */.      pE
4ba0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
4bb0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
4bc0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
4bd0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
4be0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52  xpr->pSelect, SR
4bf0: 54 5f 4d 65 6d 2c 20 70 45 78 70 72 2d 3e 69 43  T_Mem, pExpr->iC
4c00: 6f 6c 75 6d 6e 2c 30 2c 30 2c 30 29 20 29 7b 0a  olumn,0,0,0) ){.
4c10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
4c20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4c30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4c40: 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 65 6c 73    /* For all els
4c50: 65 2c 20 6a 75 73 74 20 72 65 63 75 72 73 69 76  e, just recursiv
4c60: 65 6c 79 20 77 61 6c 6b 20 74 68 65 20 74 72 65  ely walk the tre
4c70: 65 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74  e */.    default
4c80: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
4c90: 78 70 72 2d 3e 70 4c 65 66 74 0a 20 20 20 20 20  xpr->pLeft.     
4ca0: 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 52 65   && sqliteExprRe
4cb0: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
4cc0: 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73 74 2c   base, pTabList,
4cd0: 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e   pEList, pExpr->
4ce0: 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20  pLeft) ){.      
4cf0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4d00: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
4d10: 78 70 72 2d 3e 70 52 69 67 68 74 20 0a 20 20 20  xpr->pRight .   
4d20: 20 20 20 26 26 20 73 71 6c 69 74 65 45 78 70 72     && sqliteExpr
4d30: 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
4d40: 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69 73  e, base, pTabLis
4d50: 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72  t, pEList, pExpr
4d60: 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  ->pRight) ){.   
4d70: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4d80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4d90: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
4da0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
4db0: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
4dc0: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
4dd0: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  >pList;.        
4de0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
4df0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
4e00: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
4e10: 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  Arg = pList->a[i
4e20: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
4e30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
4e40: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
4e50: 73 65 2c 20 62 61 73 65 2c 20 70 54 61 62 4c 69  se, base, pTabLi
4e60: 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 41 72 67  st, pEList, pArg
4e70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
4e80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
4e90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
4ea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4eb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4ec0: 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 63 68  ../*.** Error ch
4ed0: 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  eck the function
4ee0: 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69  s in an expressi
4ef0: 6f 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61  on.  Make sure a
4f00: 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e  ll.** function n
4f10: 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69  ames are recogni
4f20: 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63  zed and all func
4f30: 74 69 6f 6e 73 20 68 61 76 65 20 74 68 65 20 63  tions have the c
4f40: 6f 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62 65 72  orrect.** number
4f50: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
4f60: 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  Leave an error m
4f70: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
4f80: 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69 66 20  ->zErrMsg.** if 
4f90: 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73  anything is amis
4fa0: 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  s.  Return the n
4fb0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
4fc0: 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41 67 67  .**.** if pIsAgg
4fd0: 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61 6e 64   is not null and
4fe0: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
4ff0: 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
5000: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28 6c 69   function.** (li
5010: 6b 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72 20 6d  ke count(*) or m
5020: 61 78 28 76 61 6c 75 65 29 29 20 74 68 65 6e 20  ax(value)) then 
5030: 77 72 69 74 65 20 61 20 31 20 69 6e 74 6f 20 2a  write a 1 into *
5040: 70 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20 73  pIsAgg..*/.int s
5050: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 50  qliteExprCheck(P
5060: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
5070: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 61  pr *pExpr, int a
5080: 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20 2a 70 49  llowAgg, int *pI
5090: 73 41 67 67 29 7b 0a 20 20 69 6e 74 20 6e 45 72  sAgg){.  int nEr
50a0: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 78  r = 0;.  if( pEx
50b0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
50c0: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
50d0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
50e0: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
50f0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  .      int n = p
5100: 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45  Expr->pList ? pE
5110: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
5120: 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r : 0;.      int
5130: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
5140: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f  0;.      int wro
5150: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b  ng_num_args = 0;
5160: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67  .      int is_ag
5170: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  g = 0;.      int
5180: 20 69 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65   i;.      FuncDe
5190: 66 20 2a 70 44 65 66 3b 0a 0a 20 20 20 20 20 20  f *pDef;..      
51a0: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 46 69 6e  pDef = sqliteFin
51b0: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
51c0: 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 70  ->db,.         p
51d0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
51e0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 6e  Expr->token.n, n
51f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
5200: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
5210: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
5220: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
5230: 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
5240: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
5250: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
5260: 2e 6e 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  .n, -1, 0);.    
5270: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
5280: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f  ){.          no_
5290: 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20  such_func = 1;. 
52a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
52b0: 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75          wrong_nu
52c0: 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20  m_args = 1;.    
52d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
52e0: 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  e{.        is_ag
52f0: 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d  g = pDef->xFunc=
5300: 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  =0;.      }.    
5310: 20 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20    if( is_agg && 
5320: 21 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20  !allowAgg ){.   
5330: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
5340: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
5350: 45 72 72 4d 73 67 2c 20 22 6d 69 73 75 73 65 20  ErrMsg, "misuse 
5360: 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  of aggregate fun
5370: 63 74 69 6f 6e 20 22 2c 20 2d 31 2c 0a 20 20 20  ction ", -1,.   
5380: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
5390: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
53a0: 6f 6b 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c  oken.n, "()", 2,
53b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
53c0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
53d0: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
53e0: 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b       is_agg = 0;
53f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
5400: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b   no_such_func ){
5410: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
5420: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
5430: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
5440: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 22  such function: "
5450: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
5460: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
5470: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
5480: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
5490: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
54a0: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
54b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f     }else if( wro
54c0: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20  ng_num_args ){. 
54d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
54e0: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
54f0: 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20  >zErrMsg, .     
5500: 20 20 20 20 20 20 22 77 72 6f 6e 67 20 6e 75 6d        "wrong num
5510: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
5520: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 22 2c 2d   to function ",-
5530: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 45  1,.           pE
5540: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
5550: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 28  xpr->token.n, "(
5560: 29 22 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  )", 2, 0);.     
5570: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5580: 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  +;.        nErr+
5590: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
55a0: 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 45   if( is_agg ) pE
55b0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
55c0: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20  _FUNCTION;.     
55d0: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 70   if( is_agg && p
55e0: 49 73 41 67 67 20 29 20 2a 70 49 73 41 67 67 20  IsAgg ) *pIsAgg 
55f0: 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 1;.      for(i
5600: 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69  =0; nErr==0 && i
5610: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
5620: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45    nErr = sqliteE
5630: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
5640: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
5650: 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20  [i].pExpr,.     
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 41            allowA
5680: 67 67 20 26 26 20 21 69 73 5f 61 67 67 2c 20 70  gg && !is_agg, p
5690: 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a  IsAgg);.      }.
56a0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
56b0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
56c0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
56d0: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
56e0: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
56f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
5700: 66 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49  ft, allowAgg, pI
5710: 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sAgg);.      }. 
5720: 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30       if( nErr==0
5730: 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
5740: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72  t ){.        nEr
5750: 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 43 68  r = sqliteExprCh
5760: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70  eck(pParse, pExp
5770: 72 2d 3e 70 52 69 67 68 74 2c 20 61 6c 6c 6f 77  r->pRight, allow
5780: 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20  Agg, pIsAgg);.  
5790: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
57a0: 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72  nErr==0 && pExpr
57b0: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
57c0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
57d0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  ->pList->nExpr;.
57e0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
57f0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
5800: 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20  nErr==0 && i<n; 
5810: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
5820: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70  Expr *pE2 = pExp
5830: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
5840: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
5850: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70  nErr = sqliteExp
5860: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
5870: 45 32 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49  E2, allowAgg, pI
5880: 73 41 67 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  sAgg);.        }
5890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
58a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
58b0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d    return nErr;.}
58c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
58d0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
58e0: 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
58f0: 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
5900: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
5910: 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65  and leave the re
5920: 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  sult on the top 
5930: 6f 66 20 73 74 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  of stack..*/.voi
5940: 64 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65  d sqliteExprCode
5950: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5960: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
5970: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
5980: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
5990: 70 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  p;.  if( v==0 ||
59a0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
59b0: 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  rn;.  switch( pE
59c0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
59d0: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20  ase TK_PLUS:    
59e0: 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20 20 20   op = OP_Add;   
59f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
5a00: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 20  se TK_MINUS:    
5a10: 6f 70 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74  op = OP_Subtract
5a20: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
5a30: 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 20 6f  e TK_STAR:     o
5a40: 70 20 3d 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3b  p = OP_Multiply;
5a50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5a60: 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 20 6f 70   TK_SLASH:    op
5a70: 20 3d 20 4f 50 5f 44 69 76 69 64 65 3b 20 20 20   = OP_Divide;   
5a80: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5a90: 54 4b 5f 41 4e 44 3a 20 20 20 20 20 20 6f 70 20  TK_AND:      op 
5aa0: 3d 20 4f 50 5f 41 6e 64 3b 20 20 20 20 20 20 62  = OP_And;      b
5ab0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
5ac0: 4b 5f 4f 52 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_OR:       op =
5ad0: 20 4f 50 5f 4f 72 3b 20 20 20 20 20 20 20 62 72   OP_Or;       br
5ae0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
5af0: 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _LT:       op = 
5b00: 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Lt;       bre
5b10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
5b20: 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LE:       op = O
5b30: 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Le;       brea
5b40: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
5b50: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
5b60: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
5b70: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
5b80: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
5b90: 47 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Ge;       break;
5ba0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
5bb0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e         op = OP_N
5bc0: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
5bd0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
5be0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
5bf0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
5c00: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
5c10: 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e  L:   op = OP_IsN
5c20: 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ull;   break;.  
5c30: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
5c40: 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  L:  op = OP_NotN
5c50: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
5c60: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
5c70: 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 3b 20     op = OP_Not; 
5c80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5c90: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
5ca0: 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 67 61 74 69    op = OP_Negati
5cb0: 76 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ve; break;.    c
5cc0: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
5cd0: 20 6f 70 20 3d 20 4f 50 5f 42 69 74 41 6e 64 3b   op = OP_BitAnd;
5ce0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
5cf0: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 20  se TK_BITOR:    
5d00: 6f 70 20 3d 20 4f 50 5f 42 69 74 4f 72 3b 20 20  op = OP_BitOr;  
5d10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5d20: 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 20 6f  e TK_BITNOT:   o
5d30: 70 20 3d 20 4f 50 5f 42 69 74 4e 6f 74 3b 20 20  p = OP_BitNot;  
5d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5d50: 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 20 6f 70   TK_LSHIFT:   op
5d60: 20 3d 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3b   = OP_ShiftLeft;
5d70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5d80: 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 20 6f  e TK_RSHIFT:   o
5d90: 70 20 3d 20 4f 50 5f 53 68 69 66 74 52 69 67 68  p = OP_ShiftRigh
5da0: 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  t; break;.    ca
5db0: 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 20  se TK_REM:      
5dc0: 6f 70 20 3d 20 4f 50 5f 52 65 6d 61 69 6e 64 65  op = OP_Remainde
5dd0: 72 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  r;  break;.    d
5de0: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
5df0: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78   }.  switch( pEx
5e00: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
5e10: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
5e20: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
5e30: 2d 3e 75 73 65 41 67 67 20 29 7b 0a 20 20 20 20  ->useAgg ){.    
5e40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5e50: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74  dOp(v, OP_AggGet
5e60: 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67  , 0, pExpr->iAgg
5e70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
5e80: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
5e90: 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
5ea0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5eb0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45  v, OP_Column, pE
5ec0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
5ed0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
5ee0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5ef0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5f00: 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20  Op(v, OP_Recno, 
5f10: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
5f20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5f30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5f40: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
5f50: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
5f60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5f70: 5f 49 6e 74 65 67 65 72 2c 20 61 74 6f 69 28 70  _Integer, atoi(p
5f80: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 2c 20  Expr->token.z), 
5f90: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
5fa0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
5fb0: 2d 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  -1, pExpr->token
5fc0: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
5fd0: 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .n);.      break
5fe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
5ff0: 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
6000: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6010: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
6020: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73   0, 0);.      as
6030: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
6040: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 73 71  en.z );.      sq
6050: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
6060: 28 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e 74  (v, -1, pExpr->t
6070: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
6080: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62  oken.n);.      b
6090: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
60a0: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
60b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
60c0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
60d0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
60e0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73   0, 0);.      as
60f0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
6100: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 73 71  en.z );.      sq
6110: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
6120: 28 76 2c 20 61 64 64 72 2c 20 70 45 78 70 72 2d  (v, addr, pExpr-
6130: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
6140: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
6150: 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f   sqliteVdbeDequo
6160: 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20  teP3(v, addr);. 
6170: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6180: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
6190: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
61a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
61b0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
61c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
61d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
61e0: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
61f0: 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
6200: 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
6210: 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
6220: 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
6230: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
6240: 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
6250: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
6260: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
6270: 53 4c 41 53 48 3a 20 7b 0a 20 20 20 20 20 20 73  SLASH: {.      s
6280: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
6290: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
62a0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
62b0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
62c0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
62d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
62e0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
62f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
6300: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6310: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
6320: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
6330: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
6340: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
6350: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
6360: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
6370: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
6380: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
6390: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
63a0: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
63b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
63c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
63d0: 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 73  ONCAT: {.      s
63e0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
63f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
6400: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
6410: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
6420: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
6430: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6440: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
6450: 6e 63 61 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20  ncat, 2, 0);.   
6460: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6470: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
6480: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
6490: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
64a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
64b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
64c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
64d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
64e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
64f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
6500: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20  teger, 1, 0);.  
6510: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
6520: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
6530: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
6540: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
6550: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
6560: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 64 65 73  ight);.      des
6570: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75  t = sqliteVdbeCu
6580: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32  rrentAddr(v) + 2
6590: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
65a0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
65b0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
65c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
65d0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c  , OP_AddImm, -1,
65e0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
65f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6600: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
6610: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
6620: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  r->pLeft );.    
6630: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
6640: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
6650: 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   || pExpr->pLeft
6660: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
6670: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65   ){.        Toke
6680: 6e 20 2a 70 20 3d 20 26 70 45 78 70 72 2d 3e 70  n *p = &pExpr->p
6690: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
66a0: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73       char *z = s
66b0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e  qliteMalloc( p->
66c0: 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20  n + 2 );.       
66d0: 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e   sprintf(z, "-%.
66e0: 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29  *s", p->n, p->z)
66f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
6700: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
6710: 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
6720: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
6730: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
6740: 74 65 67 65 72 2c 20 61 74 6f 69 28 7a 29 2c 20  teger, atoi(z), 
6750: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
6760: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
6770: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6780: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
6790: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
67a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
67b0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c  angeP3(v, -1, z,
67c0: 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20   p->n+1);.      
67d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
67e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
67f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
6800: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e   Fall through in
6810: 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20  to TK_NOT */.   
6820: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
6830: 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
6840: 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
6850: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
6860: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
6870: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
6880: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
6890: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
68a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
68b0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
68c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
68d0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NULL: {.      in
68e0: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 73 71  t dest;.      sq
68f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6900: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
6910: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
6920: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
6930: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
6940: 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c        dest = sql
6950: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
6960: 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20  dr(v) + 2;.     
6970: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6980: 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74 29  (v, op, 0, dest)
6990: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
69a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
69b0: 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  dImm, -1, 0);.  
69c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
69d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
69e0: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
69f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6a00: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c  Op(v, OP_AggGet,
6a10: 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29   0, pExpr->iAgg)
6a20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6a30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
6a40: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
6a50: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
6a60: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
6a70: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
6a80: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20        int nExpr 
6a90: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
6aa0: 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
6ab0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
6ac0: 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
6ad0: 6c 69 74 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e  liteFindFunction
6ae0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
6b10: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
6b20: 6e 2c 20 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  n, nExpr, 0);.  
6b30: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66      assert( pDef
6b40: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  !=0 );.      for
6b50: 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
6b60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
6b70: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
6b80: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
6b90: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
6ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6bb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 75 6e 63  AddOp(v, OP_Func
6bc0: 74 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 30 29 3b  tion, nExpr, 0);
6bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6be0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
6bf0: 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33   (char*)pDef, P3
6c00: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20  _POINTER);.     
6c10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6c20: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
6c30: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6c40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6c50: 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e  MemLoad, pExpr->
6c60: 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  iColumn, 0);.   
6c70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6c80: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
6c90: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
6ca0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6cb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
6cc0: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20  teger, 1, 0);.  
6cd0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
6ce0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
6cf0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
6d00: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
6d10: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
6d20: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
6d30: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
6d40: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6d50: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  ddOp(v, OP_Found
6d60: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
6d70: 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20   addr+2);.      
6d80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
6d90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6da0: 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70  , OP_SetFound, p
6db0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64  Expr->iTable, ad
6dc0: 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dr+2);.      }. 
6dd0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6de0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
6df0: 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  m, -1, 0);.     
6e00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6e10: 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
6e20: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  N: {.      int l
6e30: 62 6c 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  bl = sqliteVdbeM
6e40: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
6e50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6e60: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
6e70: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
6e80: 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65  qliteExprIfFalse
6e90: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
6ea0: 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lbl);.      sqli
6eb0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6ec0: 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b  P_AddImm, 1, 0);
6ed0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6ee0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
6ef0: 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 62 72 65   lbl);.      bre
6f00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6f10: 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20  se TK_AS: {.    
6f20: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
6f30: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
6f40: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72  pLeft);.      br
6f50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6f60: 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20  ase TK_CASE: {. 
6f70: 20 20 20 20 20 69 6e 74 20 65 78 70 72 5f 65 6e       int expr_en
6f80: 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20 69  d_label;.      i
6f90: 6e 74 20 6e 65 78 74 5f 77 68 65 6e 5f 6c 61 62  nt next_when_lab
6fa0: 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  el;.      int i;
6fb0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ..      assert(p
6fc0: 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  Expr->pList);.  
6fd0: 20 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70      assert((pExp
6fe0: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
6ff0: 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20  % 2) == 0);.    
7000: 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
7010: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
7020: 29 3b 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e  );.      expr_en
7030: 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  d_label = sqlite
7040: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
7050: 61 72 73 65 2d 3e 70 56 64 62 65 29 3b 0a 20 20  arse->pVdbe);.  
7060: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
7070: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
7080: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
7090: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
70a0: 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eft);.      }.  
70b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
70c0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
70d0: 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  pr; i=i+2){.    
70e0: 20 20 20 20 69 66 28 20 69 21 3d 30 20 29 7b 0a      if( i!=0 ){.
70f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7100: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
7110: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
7120: 6e 65 78 74 5f 77 68 65 6e 5f 6c 61 62 65 6c 29  next_when_label)
7130: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7140: 20 20 20 20 6e 65 78 74 5f 77 68 65 6e 5f 6c 61      next_when_la
7150: 62 65 6c 20 3d 20 73 71 6c 69 74 65 56 64 62 65  bel = sqliteVdbe
7160: 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
7170: 2d 3e 70 56 64 62 65 29 3b 0a 20 20 20 20 20 20  ->pVdbe);.      
7180: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
7190: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
71a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
71b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
71c0: 50 5f 44 75 70 2c 20 30 2c 20 31 29 3b 0a 20 20  P_Dup, 0, 1);.  
71d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
71e0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
71f0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
7200: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
7210: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7220: 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62  dOp(pParse->pVdb
7230: 65 2c 20 4f 50 5f 4e 65 2c 20 30 2c 20 6e 65 78  e, OP_Ne, 0, nex
7240: 74 5f 77 68 65 6e 5f 6c 61 62 65 6c 29 3b 0a 20  t_when_label);. 
7250: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7260: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
7270: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
7280: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
7290: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 65 78 74  a[i].pExpr, next
72a0: 5f 77 68 65 6e 5f 6c 61 62 65 6c 29 3b 0a 20 20  _when_label);.  
72b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
72c0: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
72d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
72e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 70 50  liteVdbeAddOp(pP
72f0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
7300: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
7310: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
7320: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
7330: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
7340: 74 2d 3e 61 5b 69 2b 31 5d 2e 70 45 78 70 72 29  t->a[i+1].pExpr)
7350: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7360: 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65  VdbeAddOp(pParse
7370: 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 47 6f 74 6f  ->pVdbe, OP_Goto
7380: 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61  , 0, expr_end_la
7390: 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bel);.      }.  
73a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
73b0: 73 6f 6c 76 65 4c 61 62 65 6c 28 70 50 61 72 73  solveLabel(pPars
73c0: 65 2d 3e 70 56 64 62 65 2c 20 6e 65 78 74 5f 77  e->pVdbe, next_w
73d0: 68 65 6e 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20  hen_label);.    
73e0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
73f0: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
7400: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 70 50  liteVdbeAddOp(pP
7410: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
7420: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
7430: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
7440: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
7450: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
7460: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
7470: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
7480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7490: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
74a0: 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  Op(pParse->pVdbe
74b0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
74c0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
74d0: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
74e0: 6c 76 65 4c 61 62 65 6c 28 70 50 61 72 73 65 2d  lveLabel(pParse-
74f0: 3e 70 56 64 62 65 2c 20 65 78 70 72 5f 65 6e 64  >pVdbe, expr_end
7500: 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  _label);.    }. 
7510: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a     break;.  }.}.
7520: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
7530: 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
7540: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
7550: 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
7560: 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
7570: 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
7580: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7590: 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
75a0: 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
75b0: 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
75c0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
75d0: 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a  on is false..*/.
75e0: 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 49  void sqliteExprI
75f0: 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61  fTrue(Parse *pPa
7600: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
7610: 2c 20 69 6e 74 20 64 65 73 74 29 7b 0a 20 20 56  , int dest){.  V
7620: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
7630: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
7640: 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30   = 0;.  if( v==0
7650: 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72   || pExpr==0 ) r
7660: 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28  eturn;.  switch(
7670: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
7680: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20    case TK_LT:   
7690: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20      op = OP_Lt; 
76a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
76b0: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20   case TK_LE:    
76c0: 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20     op = OP_Le;  
76d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
76e0: 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20  case TK_GT:     
76f0: 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20    op = OP_Gt;   
7700: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
7710: 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20  ase TK_GE:      
7720: 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20   op = OP_Ge;    
7730: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
7740: 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20  se TK_NE:       
7750: 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20  op = OP_Ne;     
7760: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7770: 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f  e TK_EQ:       o
7780: 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20  p = OP_Eq;      
7790: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
77a0: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70   TK_ISNULL:   op
77b0: 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20   = OP_IsNull;   
77c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
77d0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20  TK_NOTNULL:  op 
77e0: 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62  = OP_NotNull;  b
77f0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
7800: 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  t:  break;.  }. 
7810: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
7820: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
7830: 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
7840: 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 56 64  nt d2 = sqliteVd
7850: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
7860: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
7870: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
7880: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
7890: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
78a0: 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
78b0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
78c0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
78d0: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
78e0: 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
78f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7900: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
7910: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
7920: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
7930: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
7940: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
7950: 74 65 45 78 70 72 49 66 54 72 75 65 28 70 50 61  teExprIfTrue(pPa
7960: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
7970: 68 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ht, dest);.     
7980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7990: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
79a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
79b0: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
79c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
79d0: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
79e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
79f0: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
7a00: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
7a10: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
7a20: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
7a30: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
7a40: 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
7a50: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
7a60: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
7a70: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
7a80: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
7a90: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
7aa0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
7ab0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
7ac0: 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   0, dest);.     
7ad0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7ae0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
7af0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
7b00: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
7b10: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
7b20: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
7b30: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
7b40: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
7b50: 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
7b60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7b70: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
7b80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
7b90: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
7ba0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
7bb0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
7bc0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
7bd0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7be0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
7bf0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
7c00: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
7c10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
7c20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
7c30: 65 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  etFound, pExpr->
7c40: 69 54 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20  iTable, dest);. 
7c50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7c60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7c70: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
7c80: 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d  .      int lbl =
7c90: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
7ca0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
7cb0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
7cc0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
7cd0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
7ce0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7cf0: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
7d00: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
7d10: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
7d20: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
7d30: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
7d40: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7d50: 5f 4c 74 2c 20 30 2c 20 6c 62 6c 29 3b 0a 20 20  _Lt, 0, lbl);.  
7d60: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
7d70: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
7d80: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
7d90: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
7da0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7db0: 50 5f 4c 65 2c 20 30 2c 20 64 65 73 74 29 3b 0a  P_Le, 0, dest);.
7dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7dd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
7de0: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
7df0: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
7e00: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29  lveLabel(v, lbl)
7e10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
7e20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
7e30: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
7e40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7e50: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
7e60: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
7e70: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
7e80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7e90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c  eAddOp(v, OP_If,
7ea0: 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   0, dest);.     
7eb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7ec0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
7ed0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
7ee0: 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
7ef0: 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
7f00: 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
7f10: 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
7f20: 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
7f30: 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
7f40: 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
7f50: 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
7f60: 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
7f70: 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
7f80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45  .*/.void sqliteE
7f90: 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
7fa0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
7fb0: 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 29  pExpr, int dest)
7fc0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
7fd0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
7fe0: 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28  nt op = 0;.  if(
7ff0: 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
8000: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77  0 ) return;.  sw
8010: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
8020: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  ){.    case TK_L
8030: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
8040: 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Ge;       break
8050: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
8060: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
8070: 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Gt;       break;
8080: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
8090: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c         op = OP_L
80a0: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
80b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
80c0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74        op = OP_Lt
80d0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
80e0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20     case TK_NE:  
80f0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b       op = OP_Eq;
8100: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8110: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20    case TK_EQ:   
8120: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20      op = OP_Ne; 
8130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8140: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
8150: 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75     op = OP_NotNu
8160: 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ll;  break;.    
8170: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
8180: 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c    op = OP_IsNull
8190: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  ;   break;.    d
81a0: 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b 0a  efault:  break;.
81b0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45    }.  switch( pE
81c0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
81d0: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
81e0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
81f0: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
8200: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
8210: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
8220: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
8230: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
8240: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
8250: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8260: 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
8270: 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
8280: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
8290: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
82a0: 65 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  eExprIfTrue(pPar
82b0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
82c0: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
82d0: 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70  iteExprIfFalse(p
82e0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
82f0: 69 67 68 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  ight, dest);.   
8300: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
8310: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
8320: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8330: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
8340: 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  _NOT: {.      sq
8350: 6c 69 74 65 45 78 70 72 49 66 54 72 75 65 28 70  liteExprIfTrue(p
8360: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
8370: 65 66 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  eft, dest);.    
8380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8390: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
83a0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
83b0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
83c0: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
83d0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
83e0: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
83f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
8400: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
8410: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8420: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
8430: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
8440: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
8450: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8460: 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74 29 3b  v, op, 0, dest);
8470: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8480: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8490: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
84a0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
84b0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
84c0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
84d0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
84e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
84f0: 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74 29  (v, op, 0, dest)
8500: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8510: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
8520: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _IN: {.      sql
8530: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
8540: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
8550: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
8560: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
8570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
8580: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
8590: 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
85a0: 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20  able, dest);.   
85b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
85c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
85d0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 6f 74 46 6f  p(v, OP_SetNotFo
85e0: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
85f0: 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  le, dest);.     
8600: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
8610: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8620: 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
8630: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
8640: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
8650: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
8660: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
8670: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8680: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
8690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
86a0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
86b0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
86c0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61  .pExpr);.      a
86d0: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
86e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
86f0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8700: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20  AddOp(v, OP_Ge, 
8710: 30 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20  0, addr+3);.    
8720: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8730: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
8740: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8750: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8760: 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a  Goto, 0, dest);.
8770: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
8780: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
8790: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
87a0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
87b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
87c0: 20 4f 50 5f 47 74 2c 20 30 2c 20 64 65 73 74 29   OP_Gt, 0, dest)
87d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
87e0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
87f0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
8800: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
8810: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
8820: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8830: 2c 20 4f 50 5f 4e 6f 74 2c 20 30 2c 20 30 29 3b  , OP_Not, 0, 0);
8840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8850: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c  eAddOp(v, OP_If,
8860: 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   0, dest);.     
8870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8880: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  }.}../*.** Do a 
8890: 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
88a0: 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
88b0: 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
88c0: 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29   TRUE (non-zero)
88d0: 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20  .** if they are 
88e0: 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65  identical and re
88f0: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
8900: 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
8910: 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   way..*/.int sql
8920: 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 45  iteExprCompare(E
8930: 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70  xpr *pA, Expr *p
8940: 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  B){.  int i;.  i
8950: 66 28 20 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20  f( pA==0 ){.    
8960: 72 65 74 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20  return pB==0;.  
8970: 7d 65 6c 73 65 20 69 66 28 20 70 42 3d 3d 30 20  }else if( pB==0 
8980: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
8990: 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
89a0: 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75  p!=pB->op ) retu
89b0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
89c0: 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70  iteExprCompare(p
89d0: 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
89e0: 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
89f0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 45 78  .  if( !sqliteEx
8a00: 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
8a10: 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
8a20: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
8a30: 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b  if( pA->pList ){
8a40: 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69  .    if( pB->pLi
8a50: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
8a60: 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c  ;.    if( pA->pL
8a70: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e  ist->nExpr!=pB->
8a80: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72  pList->nExpr ) r
8a90: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72  eturn 0;.    for
8aa0: 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73  (i=0; i<pA->pLis
8ab0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
8ac0: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
8ad0: 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  eExprCompare(pA-
8ae0: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
8af0: 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61  pr, pB->pList->a
8b00: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
8b10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
8b20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8b30: 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c  }else if( pB->pL
8b40: 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ist ){.    retur
8b50: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
8b60: 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42  A->pSelect || pB
8b70: 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ->pSelect ) retu
8b80: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
8b90: 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69  token.z ){.    i
8ba0: 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d  f( pB->token.z==
8bb0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8bc0: 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e    if( pB->token.
8bd0: 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29  n!=pA->token.n )
8be0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
8bf0: 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  f( sqliteStrNICm
8c00: 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  p(pA->token.z, p
8c10: 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 41 2d 3e  B->token.z, pA->
8c20: 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65  token.n)!=0 ) re
8c30: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
8c40: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
8c50: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
8c60: 6e 74 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  nt to the pParse
8c70: 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61  ->aAgg[] array a
8c80: 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20 69 6e  nd return its in
8c90: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dex..*/.static i
8ca0: 6e 74 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f  nt appendAggInfo
8cb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
8cc0: 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
8cd0: 6e 41 67 67 20 26 20 30 78 37 29 3d 3d 30 20 29  nAgg & 0x7)==0 )
8ce0: 7b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  {.    int amt = 
8cf0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 2b 20 38  pParse->nAgg + 8
8d00: 3b 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 61  ;.    AggExpr *a
8d10: 41 67 67 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  Agg = sqliteReal
8d20: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61 41 67 67  loc(pParse->aAgg
8d30: 2c 20 61 6d 74 2a 73 69 7a 65 6f 66 28 70 50 61  , amt*sizeof(pPa
8d40: 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a  rse->aAgg[0]));.
8d50: 20 20 20 20 69 66 28 20 61 41 67 67 3d 3d 30 20      if( aAgg==0 
8d60: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8d70: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  -1;.    }.    pP
8d80: 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 61 41 67  arse->aAgg = aAg
8d90: 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  g;.  }.  memset(
8da0: 26 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 70 50  &pParse->aAgg[pP
8db0: 61 72 73 65 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20  arse->nAgg], 0, 
8dc0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
8dd0: 41 67 67 5b 30 5d 29 29 3b 0a 20 20 72 65 74 75  Agg[0]));.  retu
8de0: 72 6e 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 2b  rn pParse->nAgg+
8df0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  +;.}../*.** Anal
8e00: 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78  yze the given ex
8e10: 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
8e20: 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
8e30: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
8e40: 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
8e50: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
8e60: 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73  ded to the pPars
8e70: 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e  e->aAgg[] array.
8e80: 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f  .** Make additio
8e90: 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74  nal entries to t
8ea0: 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
8eb0: 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73  ] array as neces
8ec0: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
8ed0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
8ee0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
8ef0: 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
8f00: 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
8f10: 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
8f20: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
8f30: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 45 78 70  () and sqliteExp
8f40: 72 43 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20  rCheck()..**.** 
8f50: 49 66 20 65 72 72 6f 72 73 20 61 72 65 20 73 65  If errors are se
8f60: 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  en, leave an err
8f70: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45  or message in zE
8f80: 72 72 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e  rrMsg and return
8f90: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
8fa0: 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  f errors..*/.int
8fb0: 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79   sqliteExprAnaly
8fc0: 7a 65 41 67 67 72 65 67 61 74 65 73 28 50 61 72  zeAggregates(Par
8fd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
8fe0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
8ff0: 69 3b 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41  i;.  AggExpr *aA
9000: 67 67 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  gg;.  int nErr =
9010: 20 30 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72   0;..  if( pExpr
9020: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
9030: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9040: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
9050: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
9060: 20 20 20 61 41 67 67 20 3d 20 70 50 61 72 73 65     aAgg = pParse
9070: 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f  ->aAgg;.      fo
9080: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
9090: 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nAgg; i++){.   
90a0: 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d       if( aAgg[i]
90b0: 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  .isAgg ) continu
90c0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  e;.        if( a
90d0: 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 54  Agg[i].pExpr->iT
90e0: 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
90f0: 62 6c 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  ble.         && 
9100: 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69  aAgg[i].pExpr->i
9110: 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
9120: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
9130: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9140: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9150: 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65     if( i>=pParse
9160: 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20  ->nAgg ){.      
9170: 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49    i = appendAggI
9180: 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20  nfo(pParse);.   
9190: 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 72       if( i<0 ) r
91a0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
91b0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
91c0: 2e 69 73 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  .isAgg = 0;.    
91d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
91e0: 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70  [i].pExpr = pExp
91f0: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
9200: 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69   pExpr->iAgg = i
9210: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9220: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
9230: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
9240: 0a 20 20 20 20 20 20 61 41 67 67 20 3d 20 70 50  .      aAgg = pP
9250: 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20  arse->aAgg;.    
9260: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
9270: 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b  rse->nAgg; i++){
9280: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 41  .        if( !aA
9290: 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f  gg[i].isAgg ) co
92a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
92b0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 6f  if( sqliteExprCo
92c0: 6d 70 61 72 65 28 61 41 67 67 5b 69 5d 2e 70 45  mpare(aAgg[i].pE
92d0: 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20  xpr, pExpr) ){. 
92e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
92f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9300: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70  }.      if( i>=p
9310: 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20  Parse->nAgg ){. 
9320: 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e         i = appen
9330: 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29  dAggInfo(pParse)
9340: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
9350: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
9360: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
9370: 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b  gg[i].isAgg = 1;
9380: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
9390: 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d  >aAgg[i].pExpr =
93a0: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
93b0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
93c0: 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 46 69  pFunc = sqliteFi
93d0: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
93e0: 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
93f0: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
9400: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
9410: 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  .n,.            
9420: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20   pExpr->pList ? 
9430: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
9440: 78 70 72 20 3a 20 30 2c 20 30 29 3b 0a 20 20 20  xpr : 0, 0);.   
9450: 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72     }.      pExpr
9460: 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20  ->iAgg = i;.    
9470: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9480: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
9490: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
94a0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
94b0: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70  nErr = sqliteExp
94c0: 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
94d0: 65 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  es(pParse, pExpr
94e0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
94f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72  }.      if( nErr
9500: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
9510: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
9520: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70  nErr = sqliteExp
9530: 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
9540: 65 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  es(pParse, pExpr
9550: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
9560: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72   }.      if( nEr
9570: 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  r==0 && pExpr->p
9580: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
9590: 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70  int n = pExpr->p
95a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
95b0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
95c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72      for(i=0; nEr
95d0: 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b  r==0 && i<n; i++
95e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72  ){.          nEr
95f0: 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 41 6e  r = sqliteExprAn
9600: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
9610: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9620: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
9630: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9640: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
9650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9660: 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a  turn nErr;.}../*
9670: 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 20 75 73 65  .** Locate a use
9680: 72 20 66 75 6e 63 74 69 6f 6e 20 67 69 76 65 6e  r function given
9690: 20 61 20 6e 61 6d 65 20 61 6e 64 20 61 20 6e 75   a name and a nu
96a0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
96b0: 73 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  s..** Return a p
96c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75  ointer to the Fu
96d0: 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20  ncDef structure 
96e0: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 61  that defines tha
96f0: 74 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  t.** function, o
9700: 72 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  r return NULL if
9710: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
9720: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a  es not exist..**
9730: 0a 2a 2a 20 49 66 20 74 68 65 20 63 72 65 61 74  .** If the creat
9740: 65 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  eFlag argument i
9750: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 6e  s true, then a n
9760: 65 77 20 28 62 6c 61 6e 6b 29 20 46 75 6e 63 44  ew (blank) FuncD
9770: 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ef.** structure 
9780: 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6c  is created and l
9790: 69 6b 65 64 20 69 6e 74 6f 20 74 68 65 20 22 64  iked into the "d
97a0: 62 22 20 73 74 72 75 63 74 75 72 65 20 69 66 20  b" structure if 
97b0: 61 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 69 6e 67  a.** no matching
97c0: 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 76 69 6f   function previo
97d0: 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20 20 57  usly existed.  W
97e0: 68 65 6e 20 63 72 65 61 74 65 46 6c 61 67 20 69  hen createFlag i
97f0: 73 20 74 72 75 65 0a 2a 2a 20 61 6e 64 20 74 68  s true.** and th
9800: 65 20 6e 41 72 67 20 70 61 72 61 6d 65 74 65 72  e nArg parameter
9810: 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c   is -1, then onl
9820: 79 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  y a function tha
9830: 74 20 61 63 63 65 70 74 73 0a 2a 2a 20 61 6e 79  t accepts.** any
9840: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
9850: 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 72 65 74  ents will be ret
9860: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
9870: 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 66 61  createFlag is fa
9880: 6c 73 65 20 61 6e 64 20 6e 41 72 67 20 69 73 20  lse and nArg is 
9890: 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  -1, then the fir
98a0: 73 74 20 76 61 6c 69 64 0a 2a 2a 20 66 75 6e 63  st valid.** func
98b0: 74 69 6f 6e 20 66 6f 75 6e 64 20 69 73 20 72 65  tion found is re
98c0: 74 75 72 6e 65 64 2e 20 20 41 20 66 75 6e 63 74  turned.  A funct
98d0: 69 6f 6e 20 69 73 20 76 61 6c 69 64 20 69 66 20  ion is valid if 
98e0: 65 69 74 68 65 72 20 78 46 75 6e 63 0a 2a 2a 20  either xFunc.** 
98f0: 6f 72 20 78 53 74 65 70 20 69 73 20 6e 6f 6e 2d  or xStep is non-
9900: 7a 65 72 6f 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66  zero..*/.FuncDef
9910: 20 2a 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63   *sqliteFindFunc
9920: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 20 2a  tion(.  sqlite *
9930: 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  db,        /* An
9940: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a   open database *
9950: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9960: 7a 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f  zName, /* Name o
9970: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20  f the function. 
9980: 20 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e   Not null-termin
9990: 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ated */.  int nN
99a0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ame,         /* 
99b0: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
99c0: 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65  ters in the name
99d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
99e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
99f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
9a00: 20 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20 6e    -1 means any n
9a10: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  umber */.  int c
9a20: 72 65 61 74 65 46 6c 61 67 20 20 20 20 20 2f 2a  reateFlag     /*
9a30: 20 43 72 65 61 74 65 20 6e 65 77 20 65 6e 74 72   Create new entr
9a40: 79 20 69 66 20 74 72 75 65 20 61 6e 64 20 64 6f  y if true and do
9a50: 65 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65  es not otherwise
9a60: 20 65 78 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46   exist */.){.  F
9a70: 75 6e 63 44 65 66 20 2a 70 46 69 72 73 74 2c 20  uncDef *pFirst, 
9a80: 2a 70 2c 20 2a 70 4d 61 79 62 65 3b 0a 20 20 70  *p, *pMaybe;.  p
9a90: 46 69 72 73 74 20 3d 20 70 20 3d 20 28 46 75 6e  First = p = (Fun
9aa0: 63 44 65 66 2a 29 73 71 6c 69 74 65 48 61 73 68  cDef*)sqliteHash
9ab0: 46 69 6e 64 28 26 64 62 2d 3e 61 46 75 6e 63 2c  Find(&db->aFunc,
9ac0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
9ad0: 20 20 69 66 28 20 70 20 26 26 20 21 63 72 65 61    if( p && !crea
9ae0: 74 65 46 6c 61 67 20 26 26 20 6e 41 72 67 3c 30  teFlag && nArg<0
9af0: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
9b00: 20 26 26 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   && p->xFunc==0 
9b10: 26 26 20 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29  && p->xStep==0 )
9b20: 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20  { p = p->pNext; 
9b30: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a  }.    return p;.
9b40: 20 20 7d 0a 20 20 70 4d 61 79 62 65 20 3d 20 30    }.  pMaybe = 0
9b50: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
9b60: 70 2d 3e 6e 41 72 67 21 3d 6e 41 72 67 20 29 7b  p->nArg!=nArg ){
9b70: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67  .    if( p->nArg
9b80: 3c 30 20 26 26 20 21 63 72 65 61 74 65 46 6c 61  <0 && !createFla
9b90: 67 20 26 26 20 28 70 2d 3e 78 46 75 6e 63 20 7c  g && (p->xFunc |
9ba0: 7c 20 70 2d 3e 78 53 74 65 70 29 20 29 20 70 4d  | p->xStep) ) pM
9bb0: 61 79 62 65 20 3d 20 70 3b 0a 20 20 20 20 70 20  aybe = p;.    p 
9bc0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
9bd0: 20 20 69 66 28 20 70 20 26 26 20 21 63 72 65 61    if( p && !crea
9be0: 74 65 46 6c 61 67 20 26 26 20 70 2d 3e 78 46 75  teFlag && p->xFu
9bf0: 6e 63 3d 3d 30 20 26 26 20 70 2d 3e 78 53 74 65  nc==0 && p->xSte
9c00: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  p==0 ){.    retu
9c10: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
9c20: 70 3d 3d 30 20 26 26 20 70 4d 61 79 62 65 20 29  p==0 && pMaybe )
9c30: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 72  {.    assert( cr
9c40: 65 61 74 65 46 6c 61 67 3d 3d 30 20 29 3b 0a 20  eateFlag==0 );. 
9c50: 20 20 20 72 65 74 75 72 6e 20 70 4d 61 79 62 65     return pMaybe
9c60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30  ;.  }.  if( p==0
9c70: 20 26 26 20 63 72 65 61 74 65 46 6c 61 67 20 26   && createFlag &
9c80: 26 20 28 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c  & (p = sqliteMal
9c90: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 29 29 29  loc(sizeof(*p)))
9ca0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41  !=0 ){.    p->nA
9cb0: 72 67 20 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70  rg = nArg;.    p
9cc0: 2d 3e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74  ->pNext = pFirst
9cd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  ;.    sqliteHash
9ce0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 46 75 6e  Insert(&db->aFun
9cf0: 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  c, zName, nName,
9d00: 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a   (void*)p);.  }.
9d10: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a          return p;.}.