/ Hex Artifact Content
Login

Artifact 86eaf80e4d893ba184afc965a53a8dffda209ad4:


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 31 31 30 20 32 30 30 34 2f 30 32 2f 32 32 20  .110 2004/02/22 
0220: 31 38 3a 34 30 3a 35 37 20 64 72 68 20 45 78 70  18:40:57 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
0270: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
0280: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
0290: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
02a0: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
02b0: 72 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f  r this node is o
02c0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
02d0: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  iteMalloc().  Th
02e0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
02f0: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
0300: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
0310: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
0320: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
0330: 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  eed..*/.Expr *sq
0340: 6c 69 74 65 45 78 70 72 28 69 6e 74 20 6f 70 2c  liteExpr(int op,
0350: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
0360: 70 72 20 2a 70 52 69 67 68 74 2c 20 54 6f 6b 65  pr *pRight, Toke
0370: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
0380: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  pr *pNew;.  pNew
0390: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
03a0: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
03b0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
03c0: 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61  {.    /* When ma
03d0: 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 77 65 20 6c  lloc fails, we l
03e0: 65 61 6b 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  eak memory from 
03f0: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
0400: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
0410: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70  ;.  }.  pNew->op
0420: 20 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70   = op;.  pNew->p
0430: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
0440: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70  pNew->pRight = p
0450: 52 69 67 68 74 3b 0a 20 20 69 66 28 20 70 54 6f  Right;.  if( pTo
0460: 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ken ){.    asser
0470: 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d  t( pToken->dyn==
0480: 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  0 );.    pNew->t
0490: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
04a0: 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d      pNew->span =
04b0: 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73   *pToken;.  }els
04c0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
04d0: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d  New->token.dyn==
04e0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
04f0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d   pNew->token.z==
0500: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
0510: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d   pNew->token.n==
0520: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  0 );.    if( pLe
0530: 66 74 20 26 26 20 70 52 69 67 68 74 20 29 7b 0a  ft && pRight ){.
0540: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
0550: 53 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66  Span(pNew, &pLef
0560: 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74  t->span, &pRight
0570: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c  ->span);.    }el
0580: 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
0590: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
05a0: 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  en;.    }.  }.  
05b0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
05c0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
05d0: 70 72 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f 66  pr.span field of
05e0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
05f0: 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c  ssion to span al
0600: 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74 77 65 65  l.** text betwee
0610: 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20  n the two given 
0620: 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20  tokens..*/.void 
0630: 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 45  sqliteExprSpan(E
0640: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
0650: 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20  n *pLeft, Token 
0660: 2a 70 52 69 67 68 74 29 7b 0a 20 20 61 73 73 65  *pRight){.  asse
0670: 72 74 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b  rt( pRight!=0 );
0680: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
0690: 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 4e 6f 74 65  !=0 );.  /* Note
06a0: 3a 20 70 45 78 70 72 20 6d 69 67 68 74 20 62 65  : pExpr might be
06b0: 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61 20 70   NULL due to a p
06c0: 72 69 6f 72 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  rior malloc fail
06d0: 75 72 65 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ure */.  if( pEx
06e0: 70 72 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20  pr && pRight->z 
06f0: 26 26 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20  && pLeft->z ){. 
0700: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 64 79     if( pLeft->dy
0710: 6e 3d 3d 30 20 26 26 20 70 52 69 67 68 74 2d 3e  n==0 && pRight->
0720: 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dyn==0 ){.      
0730: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
0740: 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 20 20  pLeft->z;.      
0750: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20  pExpr->span.n = 
0760: 70 52 69 67 68 74 2d 3e 6e 20 2b 20 41 64 64 72  pRight->n + Addr
0770: 28 70 52 69 67 68 74 2d 3e 7a 29 20 2d 20 41 64  (pRight->z) - Ad
0780: 64 72 28 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20  dr(pLeft->z);.  
0790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
07a0: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  Expr->span.z = 0
07b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
07c0: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
07d0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
07e0: 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74  node for a funct
07f0: 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c  ion with multipl
0800: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a  e.** arguments..
0810: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 45  */.Expr *sqliteE
0820: 78 70 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  xprFunction(Expr
0830: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
0840: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
0850: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65  xpr *pNew;.  pNe
0860: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
0870: 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29  ( sizeof(Expr) )
0880: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
0890: 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ){.    /* sqlite
08a0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
08b0: 4c 69 73 74 29 3b 20 2f 2f 20 4c 65 61 6b 20 70  List); // Leak p
08c0: 4c 69 73 74 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  List when malloc
08d0: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
08e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
08f0: 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43  ew->op = TK_FUNC
0900: 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  TION;.  pNew->pL
0910: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 69  ist = pList;.  i
0920: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
0930: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
0940: 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70  >dyn==0 );.    p
0950: 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54  New->token = *pT
0960: 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oken;.  }else{. 
0970: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a     pNew->token.z
0980: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
0990: 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74  ->span = pNew->t
09a0: 6f 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70  oken;.  return p
09b0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  New;.}../*.** Re
09c0: 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65  cursively delete
09d0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
09e0: 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ree..*/.void sql
09f0: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 45 78  iteExprDelete(Ex
0a00: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
0a10: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
0a20: 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29  f( p->span.dyn )
0a30: 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61   sqliteFree((cha
0a40: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20  r*)p->span.z);. 
0a50: 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79   if( p->token.dy
0a60: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
0a70: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
0a80: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 44  );.  sqliteExprD
0a90: 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b  elete(p->pLeft);
0aa0: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c  .  sqliteExprDel
0ab0: 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  ete(p->pRight);.
0ac0: 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74    sqliteExprList
0ad0: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74 29  Delete(p->pList)
0ae0: 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74  ;.  sqliteSelect
0af0: 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63  Delete(p->pSelec
0b00: 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
0b10: 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  (p);.}.../*.** T
0b20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f  he following gro
0b30: 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d  up of routines m
0b40: 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20  ake deep copies 
0b50: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  of expressions,.
0b60: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
0b70: 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61  sts, ID lists, a
0b80: 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd select statem
0b90: 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65  ents.  The copie
0ba0: 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65  s can.** be dele
0bb0: 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61  ted (by being pa
0bc0: 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65  ssed to their re
0bd0: 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65  spective ...Dele
0be0: 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a  te() routines).*
0bf0: 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74  * without effect
0c00: 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
0c10: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70  s..**.** The exp
0c20: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44  ression list, ID
0c30: 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73  , and source lis
0c40: 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c  ts return by sql
0c50: 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 29  iteExprListDup()
0c60: 2c 0a 2a 2a 20 73 71 6c 69 74 65 49 64 4c 69 73  ,.** sqliteIdLis
0c70: 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69  tDup(), and sqli
0c80: 74 65 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  teSrcListDup() c
0c90: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
0ca0: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
0cb0: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
0cc0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
0cd0: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
0ce0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
0cf0: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
0d00: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
0d10: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
0d20: 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72  licated..*/.Expr
0d30: 20 2a 73 71 6c 69 74 65 45 78 70 72 44 75 70 28   *sqliteExprDup(
0d40: 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72  Expr *p){.  Expr
0d50: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
0d60: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0d70: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
0d80: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
0d90: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
0da0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
0db0: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20  .  memcpy(pNew, 
0dc0: 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  p, sizeof(*pNew)
0dd0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
0de0: 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e  n.z!=0 ){.    pN
0df0: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 73 71  ew->token.z = sq
0e00: 6c 69 74 65 53 74 72 44 75 70 28 70 2d 3e 74 6f  liteStrDup(p->to
0e10: 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 70 4e 65 77  ken.z);.    pNew
0e20: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b  ->token.dyn = 1;
0e30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
0e40: 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65  sert( pNew->toke
0e50: 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  n.z==0 );.  }.  
0e60: 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  pNew->span.z = 0
0e70: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20  ;.  pNew->pLeft 
0e80: 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  = sqliteExprDup(
0e90: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65  p->pLeft);.  pNe
0ea0: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
0eb0: 74 65 45 78 70 72 44 75 70 28 70 2d 3e 70 52 69  teExprDup(p->pRi
0ec0: 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  ght);.  pNew->pL
0ed0: 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ist = sqliteExpr
0ee0: 4c 69 73 74 44 75 70 28 70 2d 3e 70 4c 69 73 74  ListDup(p->pList
0ef0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65  );.  pNew->pSele
0f00: 63 74 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63  ct = sqliteSelec
0f10: 74 44 75 70 28 70 2d 3e 70 53 65 6c 65 63 74 29  tDup(p->pSelect)
0f20: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
0f30: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 54 6f  .}.void sqliteTo
0f40: 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70  kenCopy(Token *p
0f50: 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d  To, Token *pFrom
0f60: 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79  ){.  if( pTo->dy
0f70: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
0f80: 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20  char*)pTo->z);. 
0f90: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b   if( pFrom->z ){
0fa0: 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46  .    pTo->n = pF
0fb0: 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d  rom->n;.    pTo-
0fc0: 3e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  >z = sqliteStrND
0fd0: 75 70 28 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72  up(pFrom->z, pFr
0fe0: 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d  om->n);.    pTo-
0ff0: 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  >dyn = 1;.  }els
1000: 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20  e{.    pTo->z = 
1010: 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73  0;.  }.}.ExprLis
1020: 74 20 2a 73 71 6c 69 74 65 45 78 70 72 4c 69 73  t *sqliteExprLis
1030: 74 44 75 70 28 45 78 70 72 4c 69 73 74 20 2a 70  tDup(ExprList *p
1040: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
1050: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
1060: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1070: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
1080: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1090: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
10a0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
10b0: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
10c0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
10d0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45  rn 0;.  pNew->nE
10e0: 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  xpr = pNew->nAll
10f0: 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20  oc = p->nExpr;. 
1100: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
1110: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1120: 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66   p->nExpr*sizeof
1130: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 66  (p->a[0]) );.  f
1140: 6f 72 28 69 3d 30 3b 20 70 49 74 65 6d 20 26 26  or(i=0; pItem &&
1150: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
1160: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1170: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20  Expr *pNewExpr, 
1180: 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70  *pOldExpr;.    p
1190: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e  Item->pExpr = pN
11a0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 45  ewExpr = sqliteE
11b0: 78 70 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20  xprDup(pOldExpr 
11c0: 3d 20 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  = p->a[i].pExpr)
11d0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78  ;.    if( pOldEx
11e0: 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26  pr->span.z!=0 &&
11f0: 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20   pNewExpr ){.   
1200: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b     /* Always mak
1210: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
1220: 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76  span for top-lev
1230: 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  el expressions i
1240: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  n the.      ** e
1250: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
1260: 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45   The logic in SE
1270: 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20  LECT processing 
1280: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a  that determines.
1290: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d        ** the nam
12a0: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  es of columns in
12b0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
12c0: 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72  needs this infor
12d0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
12e0: 73 71 6c 69 74 65 54 6f 6b 65 6e 43 6f 70 79 28  sqliteTokenCopy(
12f0: 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c  &pNewExpr->span,
1300: 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e   &pOldExpr->span
1310: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1320: 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30  ert( pNewExpr==0
1330: 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70   || pNewExpr->sp
1340: 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20  an.z!=0 .       
1350: 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72       || pOldExpr
1360: 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73  ->span.z==0 || s
1370: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
1380: 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  led );.    pItem
1390: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
13a0: 53 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a  StrDup(p->a[i].z
13b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
13c0: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 2d  ->sortOrder = p-
13d0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
13e0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67  .    pItem->isAg
13f0: 67 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73 41 67  g = p->a[i].isAg
1400: 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  g;.    pItem->do
1410: 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ne = 0;.  }.  re
1420: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 72 63  turn pNew;.}.Src
1430: 4c 69 73 74 20 2a 73 71 6c 69 74 65 53 72 63 4c  List *sqliteSrcL
1440: 69 73 74 44 75 70 28 53 72 63 4c 69 73 74 20 2a  istDup(SrcList *
1450: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
1460: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
1470: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
1480: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
1490: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
14a0: 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72  of(*p) + (p->nSr
14b0: 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e  c>0 ? sizeof(p->
14c0: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63  a[0]) * (p->nSrc
14d0: 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  -1) : 0);.  pNew
14e0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
14f0: 61 77 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  aw( nByte );.  i
1500: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
1510: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
1520: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
1530: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
1540: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
1550: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
1560: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1570: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
1580: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
1590: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
15a0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
15b0: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65  p->a[i];.    pNe
15c0: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
15d0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
15e0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pOldItem->zDatab
15f0: 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ase);.    pNewIt
1600: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
1610: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
1620: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
1630: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
1640: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
1650: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
1660: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
1670: 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49  jointype = pOldI
1680: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
1690: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
16a0: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
16b0: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e  >iCursor;.    pN
16c0: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ewItem->pTab = 0
16d0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
16e0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
16f0: 53 65 6c 65 63 74 44 75 70 28 70 4f 6c 64 49 74  SelectDup(pOldIt
1700: 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
1710: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
1720: 3d 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28  = sqliteExprDup(
1730: 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  pOldItem->pOn);.
1740: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
1750: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 49 64 4c  sing = sqliteIdL
1760: 69 73 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  istDup(pOldItem-
1770: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  >pUsing);.  }.  
1780: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
1790: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 49 64 4c  dList *sqliteIdL
17a0: 69 73 74 44 75 70 28 49 64 4c 69 73 74 20 2a 70  istDup(IdList *p
17b0: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
17c0: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  w;.  int i;.  if
17d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
17e0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
17f0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
1800: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
1810: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
1820: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
1830: 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  nId = pNew->nAll
1840: 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  oc = p->nId;.  p
1850: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d  New->a = sqliteM
1860: 61 6c 6c 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64  allocRaw( p->nId
1870: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
1880: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
1890: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
18a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
18b0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
18c0: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
18d0: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
18e0: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
18f0: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
1900: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
1910: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65  p->a[i];.    pNe
1920: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
1930: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64  qliteStrDup(pOld
1940: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
1950: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
1960: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
1970: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
1980: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
1990: 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28 53 65  liteSelectDup(Se
19a0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65  lect *p){.  Sele
19b0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  ct *pNew;.  if( 
19c0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
19d0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
19e0: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
19f0: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
1a00: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
1a10: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73  0;.  pNew->isDis
1a20: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
1a30: 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  tinct;.  pNew->p
1a40: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  EList = sqliteEx
1a50: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 45 4c  prListDup(p->pEL
1a60: 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ist);.  pNew->pS
1a70: 72 63 20 3d 20 73 71 6c 69 74 65 53 72 63 4c 69  rc = sqliteSrcLi
1a80: 73 74 44 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a  stDup(p->pSrc);.
1a90: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
1aa0: 20 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70   sqliteExprDup(p
1ab0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65  ->pWhere);.  pNe
1ac0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
1ad0: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
1ae0: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
1af0: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
1b00: 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 2d  sqliteExprDup(p-
1b10: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65  >pHaving);.  pNe
1b20: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
1b30: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
1b40: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
1b50: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
1b60: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1b70: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44   = sqliteSelectD
1b80: 75 70 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  up(p->pPrior);. 
1b90: 20 70 4e 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20   pNew->nLimit = 
1ba0: 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 70 4e 65  p->nLimit;.  pNe
1bb0: 77 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e  w->nOffset = p->
1bc0: 6e 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d  nOffset;.  pNew-
1bd0: 3e 7a 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  >zSelect = 0;.  
1be0: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d  pNew->iLimit = -
1bf0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  1;.  pNew->iOffs
1c00: 65 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  et = -1;.  retur
1c10: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pNew;.}.../*.*
1c20: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
1c30: 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ent to the end o
1c40: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
1c50: 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20  list.  If pList 
1c60: 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
1c70: 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74  NULL, then creat
1c80: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
1c90: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72  on list..*/.Expr
1ca0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 45 78 70 72  List *sqliteExpr
1cb0: 4c 69 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c  ListAppend(ExprL
1cc0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72  ist *pList, Expr
1cd0: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
1ce0: 70 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c  pName){.  if( pL
1cf0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1d00: 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
1d10: 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  oc( sizeof(ExprL
1d20: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1d30: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1d40: 20 20 2f 2a 20 73 71 6c 69 74 65 45 78 70 72 44    /* sqliteExprD
1d50: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f  elete(pExpr); //
1d60: 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20   Leak memory if 
1d70: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
1d80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1d90: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1da0: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d  ( pList->nAlloc=
1db0: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  =0 );.  }.  if( 
1dc0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70  pList->nAlloc<=p
1dd0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
1de0: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
1df0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
1e00: 2a 32 20 2b 20 34 3b 0a 20 20 20 20 70 4c 69 73  *2 + 4;.    pLis
1e10: 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65 61  t->a = sqliteRea
1e20: 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70  lloc(pList->a, p
1e30: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a  List->nAlloc*siz
1e40: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
1e50: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
1e60: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->a==0 ){.      
1e70: 2f 2a 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c  /* sqliteExprDel
1e80: 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f 20 4c  ete(pExpr); // L
1e90: 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  eak memory if ma
1ea0: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
1eb0: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
1ec0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
1ed0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
1ee0: 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a  rn pList;.    }.
1ef0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
1f00: 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69  ist->a!=0 );.  i
1f10: 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d  f( pExpr || pNam
1f20: 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
1f30: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1f40: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
1f50: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
1f60: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
1f70: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
1f80: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
1f90: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
1fa0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20  ;.    if( pName 
1fb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
1fc0: 65 74 4e 53 74 72 69 6e 67 28 26 70 49 74 65 6d  etNString(&pItem
1fd0: 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ->zName, pName->
1fe0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b  z, pName->n, 0);
1ff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71  .      sqliteDeq
2000: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
2010: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
2020: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
2030: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
2040: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
2050: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
2060: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
2070: 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a  elete(ExprList *
2080: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
2090: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
20a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
20b0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
20c0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
20d0: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
20e0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
20f0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  r);.    sqliteFr
2100: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
2110: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
2120: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
2130: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2140: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
2150: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
2160: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
2170: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
2180: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
2190: 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74  t.** and 0 if it
21a0: 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62   involves variab
21b0: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
21c0: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
21d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
21e0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
21f0: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
2200: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
2210: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
2220: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
2230: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
2240: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
2250: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
2260: 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  iteExprIsConstan
2270: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 73 77  t(Expr *p){.  sw
2280: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
2290: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
22a0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
22b0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  N:.    case TK_D
22c0: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
22d0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
22e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
22f0: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
2300: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
2310: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
2320: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
2330: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
2340: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20   TK_VARIABLE:.  
2350: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2360: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
2370: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
2380: 26 26 20 21 73 71 6c 69 74 65 45 78 70 72 49 73  && !sqliteExprIs
2390: 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 65 66  Constant(p->pLef
23a0: 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
23b0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67       if( p->pRig
23c0: 68 74 20 26 26 20 21 73 71 6c 69 74 65 45 78 70  ht && !sqliteExp
23d0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70  rIsConstant(p->p
23e0: 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
23f0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
2400: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
2410: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
2420: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 4c  for(i=0; i<p->pL
2430: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
2440: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2450: 21 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e  !sqliteExprIsCon
2460: 73 74 61 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e  stant(p->pList->
2470: 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 72 65  a[i].pExpr) ) re
2480: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
2490: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
24a0: 72 65 74 75 72 6e 20 70 2d 3e 70 4c 65 66 74 21  return p->pLeft!
24b0: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 21  =0 || p->pRight!
24c0: 3d 30 20 7c 7c 20 28 70 2d 3e 70 4c 69 73 74 20  =0 || (p->pList 
24d0: 26 26 20 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  && p->pList->nEx
24e0: 70 72 3e 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pr>0);.    }.  }
24f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2500: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 67 69 76  /*.** If the giv
2510: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  en expression co
2520: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
2530: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
2540: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
2550: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
2560: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
2570: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
2580: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
2590: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
25a0: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
25b0: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
25c0: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
25d0: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
25e0: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
25f0: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
2600: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
2610: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
2620: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
2630: 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e 74 65  sqliteExprIsInte
2640: 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
2650: 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69   *pValue){.  swi
2660: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
2670: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
2680: 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  R: {.      if( s
2690: 71 6c 69 74 65 46 69 74 73 49 6e 33 32 42 69 74  qliteFitsIn32Bit
26a0: 73 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 20 29 7b  s(p->token.z) ){
26b0: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
26c0: 20 3d 20 61 74 6f 69 28 70 2d 3e 74 6f 6b 65 6e   = atoi(p->token
26d0: 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  .z);.        ret
26e0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
26f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2700: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
2710: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 63 6f  RING: {.      co
2720: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 2d  nst char *z = p-
2730: 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  >token.z;.      
2740: 69 6e 74 20 6e 20 3d 20 70 2d 3e 74 6f 6b 65 6e  int n = p->token
2750: 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  .n;.      if( n>
2760: 30 20 26 26 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29  0 && z[0]=='-' )
2770: 7b 20 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d 0a 20 20  { z++; n--; }.  
2780: 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26      while( n>0 &
2790: 26 20 2a 7a 20 26 26 20 69 73 64 69 67 69 74 28  & *z && isdigit(
27a0: 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d 3b  *z) ){ z++; n--;
27b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d   }.      if( n==
27c0: 30 20 26 26 20 73 71 6c 69 74 65 46 69 74 73 49  0 && sqliteFitsI
27d0: 6e 33 32 42 69 74 73 28 70 2d 3e 74 6f 6b 65 6e  n32Bits(p->token
27e0: 2e 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  .z) ){.        *
27f0: 70 56 61 6c 75 65 20 3d 20 61 74 6f 69 28 70 2d  pValue = atoi(p-
2800: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20  >token.z);.     
2810: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2820: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
2830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2840: 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
2850: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2860: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
2870: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
2880: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2890: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
28a0: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
28b0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 49 73  if( sqliteExprIs
28c0: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
28d0: 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20  , &v) ){.       
28e0: 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20   *pValue = -v;. 
28f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2900: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
2910: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2920: 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a  default: break;.
2930: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2940: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2950: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
2960: 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f  n string is a ro
2970: 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  w-id column name
2980: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49  ..*/.int sqliteI
2990: 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61  sRowid(const cha
29a0: 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c  r *z){.  if( sql
29b0: 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  iteStrICmp(z, "_
29c0: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
29d0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
29e0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 22  liteStrICmp(z, "
29f0: 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
2a00: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
2a10: 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f  iteStrICmp(z, "O
2a20: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
2a30: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
2a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
2a50: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
2a60: 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  umn of the form 
2a70: 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20  X.Y.Z or Y.Z or 
2a80: 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a  just Z, look up.
2a90: 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e 20  ** that name in 
2aa0: 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72 63  the set of sourc
2ab0: 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  e tables in pSrc
2ac0: 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74 68  List and make th
2ad0: 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70 72  e pExpr .** expr
2ae0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65  ession node refe
2af0: 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20 73  r back to that s
2b00: 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  ource column.  T
2b10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
2b20: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
2b30: 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a   to pExpr:.**.**
2b40: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 20      pExpr->iDb  
2b50: 20 20 20 20 20 20 20 20 20 53 65 74 20 74 68 65           Set the
2b60: 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61 44   index in db->aD
2b70: 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62  b[] of the datab
2b80: 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20  ase holding.**  
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 20 20 20 20 74 68 65 20 74 61 62 6c 65         the table
2bb0: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  ..**    pExpr->i
2bc0: 54 61 62 6c 65 20 20 20 20 20 20 20 20 53 65 74  Table        Set
2bd0: 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20 6e   to the cursor n
2be0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
2bf0: 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20  ble obtained.** 
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53 72          from pSr
2c20: 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78  cList..**    pEx
2c30: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20  pr->iColumn     
2c40: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f 6c    Set to the col
2c50: 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69  umn number withi
2c60: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
2c70: 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79     pExpr->dataTy
2c80: 70 65 20 20 20 20 20 20 53 65 74 20 74 6f 20 74  pe      Set to t
2c90: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  he appropriate d
2ca0: 61 74 61 20 74 79 70 65 20 66 6f 72 20 74 68 65  ata type for the
2cb0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 70   column..**    p
2cc0: 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
2cd0: 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f      Set to TK_CO
2ce0: 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70  LUMN..**    pExp
2cf0: 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20  r->pLeft        
2d00: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
2d10: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
2d20: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20  s deleted.**    
2d30: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20  pExpr->pRight   
2d40: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
2d50: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
2d60: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  to is deleted..*
2d70: 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65  *.** The pDbToke
2d80: 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  n is the name of
2d90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74   the database (t
2da0: 68 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76  he "X").  This v
2db0: 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e  alue may be.** N
2dc0: 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ULL meaning that
2dd0: 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20   name is of the 
2de0: 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20  form Y.Z or Z.  
2df0: 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61  Any available da
2e00: 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65  tabase.** can be
2e10: 20 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62   used.  The pTab
2e20: 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  leToken is the n
2e30: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
2e40: 20 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69   (the "Y").  Thi
2e50: 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62  s.** value can b
2e60: 65 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b  e NULL if pDbTok
2e70: 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  en is also NULL.
2e80: 20 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e    If pTableToken
2e90: 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d   is NULL it.** m
2ea0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f  eans that the fo
2eb0: 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69  rm of the name i
2ec0: 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  s Z and that col
2ed0: 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61  umns from any ta
2ee0: 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ble.** can be us
2ef0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
2f00: 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20   name cannot be 
2f10: 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67  resolved unambig
2f20: 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e  uously, leave an
2f30: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
2f40: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
2f50: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
2f60: 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e    Return zero on
2f70: 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
2f80: 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61  tic int lookupNa
2f90: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
2fa0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
2fb0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
2fc0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62   */.  Token *pDb
2fd0: 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61  Token,     /* Na
2fe0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2ff0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
3000: 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ble, or NULL */.
3010: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54    Token *pTableT
3020: 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  oken,  /* Name o
3030: 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  f table containi
3040: 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55  ng column, or NU
3050: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
3060: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20  ColumnToken, /* 
3070: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
3080: 6d 6e 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  mn. */.  SrcList
3090: 20 2a 70 53 72 63 4c 69 73 74 2c 20 20 20 2f 2a   *pSrcList,   /*
30a0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
30b0: 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20  used to resolve 
30c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
30d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
30e0: 73 74 2c 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  st,    /* List o
30f0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  f expressions us
3100: 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 22 41  ed to resolve "A
3110: 53 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  S" */.  Expr *pE
3120: 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr          /* 
3130: 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e  Make this EXPR n
3140: 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ode point to the
3150: 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e   selected column
3160: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
3170: 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  Db = 0;       /*
3180: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
3190: 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20  abase.  The "X" 
31a0: 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68  in X.Y.Z */.  ch
31b0: 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20  ar *zTab = 0;   
31c0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
31d0: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59  e table.  The "Y
31e0: 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  " in X.Y.Z or Y.
31f0: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  Z */.  char *zCo
3200: 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  l = 0;      /* N
3210: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
3220: 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20  n.  The "Z" */. 
3230: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
3240: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
3250: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
3260: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  cnt = 0;        
3270: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
3280: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
3290: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  mes */.  int cnt
32a0: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Tab = 0;      /*
32b0: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
32c0: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  ing table names 
32d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  */.  sqlite *db 
32e0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
32f0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
3300: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  /..  assert( pCo
3310: 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f  lumnToken && pCo
3320: 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20  lumnToken->z ); 
3330: 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e  /* The Z in X.Y.
3340: 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  Z cannot be NULL
3350: 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 54 6f 6b   */.  if( pDbTok
3360: 65 6e 20 26 26 20 70 44 62 54 6f 6b 65 6e 2d 3e  en && pDbToken->
3370: 7a 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 73  z ){.    zDb = s
3380: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 44 62  qliteStrNDup(pDb
3390: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 44 62 54 6f 6b  Token->z, pDbTok
33a0: 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  en->n);.    sqli
33b0: 74 65 44 65 71 75 6f 74 65 28 7a 44 62 29 3b 0a  teDequote(zDb);.
33c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62    }else{.    zDb
33d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
33e0: 70 54 61 62 6c 65 54 6f 6b 65 6e 20 26 26 20 70  pTableToken && p
33f0: 54 61 62 6c 65 54 6f 6b 65 6e 2d 3e 7a 20 29 7b  TableToken->z ){
3400: 0a 20 20 20 20 7a 54 61 62 20 3d 20 73 71 6c 69  .    zTab = sqli
3410: 74 65 53 74 72 4e 44 75 70 28 70 54 61 62 6c 65  teStrNDup(pTable
3420: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 61 62 6c 65  Token->z, pTable
3430: 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 73  Token->n);.    s
3440: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 54 61  qliteDequote(zTa
3450: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
3460: 20 61 73 73 65 72 74 28 20 7a 44 62 3d 3d 30 20   assert( zDb==0 
3470: 29 3b 0a 20 20 20 20 7a 54 61 62 20 3d 20 30 3b  );.    zTab = 0;
3480: 0a 20 20 7d 0a 20 20 7a 43 6f 6c 20 3d 20 73 71  .  }.  zCol = sq
3490: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 43 6f 6c  liteStrNDup(pCol
34a0: 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 43 6f  umnToken->z, pCo
34b0: 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20  lumnToken->n);. 
34c0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
34d0: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Col);.  if( sqli
34e0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
34f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
3500: 3b 20 20 2f 2a 20 4c 65 61 6b 20 6d 65 6d 6f 72  ;  /* Leak memor
3510: 79 20 28 7a 44 62 20 61 6e 64 20 7a 54 61 62 29  y (zDb and zTab)
3520: 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
3530: 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
3540: 28 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c  ( zTab==0 || pEL
3550: 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 45 78  ist==0 );..  pEx
3560: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b  pr->iTable = -1;
3570: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
3580: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
3590: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
35a0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
35b0: 65 6d 20 3d 20 26 70 53 72 63 4c 69 73 74 2d 3e  em = &pSrcList->
35c0: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
35d0: 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
35e0: 54 61 62 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  Tab;.    Column 
35f0: 2a 70 43 6f 6c 3b 0a 0a 20 20 20 20 69 66 28 20  *pCol;..    if( 
3600: 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pTab==0 ) contin
3610: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
3620: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
3630: 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a      if( zTab ){.
3640: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
3650: 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
3660: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
3670: 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  e = pItem->zAlia
3680: 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  s;.        if( s
3690: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 54 61  qliteStrICmp(zTa
36a0: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
36b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
36c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36d0: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
36e0: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
36f0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
3700: 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ame==0 || sqlite
3710: 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65  StrICmp(zTabName
3720: 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e  , zTab)!=0 ) con
3730: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
3740: 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c  f( zDb!=0 && sql
3750: 69 74 65 53 74 72 49 43 6d 70 28 64 62 2d 3e 61  iteStrICmp(db->a
3760: 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e  Db[pTab->iDb].zN
3770: 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a  ame, zDb)!=0 ){.
3780: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
3790: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
37a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
37b0: 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b  if( 0==(cntTab++
37c0: 29 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  ) ){.      pExpr
37d0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d  ->iTable = pItem
37e0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
37f0: 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54   pExpr->iDb = pT
3800: 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 7d 0a 20  ab->iDb;.    }. 
3810: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c     for(j=0, pCol
3820: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70  =pTab->aCol; j<p
3830: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20  Tab->nCol; j++, 
3840: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  pCol++){.      i
3850: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
3860: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
3870: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
3880: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
3890: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
38a0: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
38b0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
38c0: 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
38d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73  .        /* Subs
38e0: 74 69 74 75 74 65 20 74 68 65 20 72 6f 77 69 64  titute the rowid
38f0: 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72   (column -1) for
3900: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
3910: 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20  MARY KEY */.    
3920: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
3930: 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50  mn = j==pTab->iP
3940: 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20  Key ? -1 : j;.  
3950: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74        pExpr->dat
3960: 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 73 6f  aType = pCol->so
3970: 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49 54 45  rtOrder & SQLITE
3980: 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 3b 0a 20 20  _SO_TYPEMASK;.  
3990: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
39a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
39b0: 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
39c0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f  not already reso
39d0: 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74  lved the name, t
39e0: 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 2a 2a 20  hen maybe .  ** 
39f0: 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72  it is a new.* or
3a00: 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61   old.* trigger a
3a10: 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  rgument referenc
3a20: 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 44 62  e.  */.  if( zDb
3a30: 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26  ==0 && zTab!=0 &
3a40: 26 20 63 6e 74 3d 3d 30 20 26 26 20 70 50 61 72  & cnt==0 && pPar
3a50: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d 30  se->trigStack!=0
3a60: 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 53   ){.    TriggerS
3a70: 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74  tack *pTriggerSt
3a80: 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72  ack = pParse->tr
3a90: 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 54 61 62  igStack;.    Tab
3aa0: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
3ab0: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
3ac0: 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d  ack->newIdx != -
3ad0: 31 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43  1 && sqliteStrIC
3ae0: 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29 20  mp("new", zTab) 
3af0: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 70 45  == 0 ){.      pE
3b00: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54  xpr->iTable = pT
3b10: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77  riggerStack->new
3b20: 49 64 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Idx;.      asser
3b30: 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  t( pTriggerStack
3b40: 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ->pTab );.      
3b50: 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53  pTab = pTriggerS
3b60: 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20  tack->pTab;.    
3b70: 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69 67 67  }else if( pTrigg
3b80: 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20  erStack->oldIdx 
3b90: 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 53  != -1 && sqliteS
3ba0: 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54  trICmp("old", zT
3bb0: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
3bc0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
3bd0: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
3be0: 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 61  >oldIdx;.      a
3bf0: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53  ssert( pTriggerS
3c00: 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20  tack->pTab );.  
3c10: 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69 67      pTab = pTrig
3c20: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a  gerStack->pTab;.
3c30: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
3c40: 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20 69 6e  Tab ){ .      in
3c50: 74 20 6a 3b 0a 20 20 20 20 20 20 43 6f 6c 75 6d  t j;.      Colum
3c60: 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  n *pCol = pTab->
3c70: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 0a 20 20 20  aCol;.      .   
3c80: 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20     pExpr->iDb = 
3c90: 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20  pTab->iDb;.     
3ca0: 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20   cntTab++;.     
3cb0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20 70 54   for(j=0; j < pT
3cc0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
3cd0: 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20  Col++) {.       
3ce0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
3cf0: 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
3d00: 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zCol)==0 ){.    
3d10: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
3d20: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
3d30: 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d  olumn = j==pTab-
3d40: 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b  >iPKey ? -1 : j;
3d50: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
3d60: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 70 43 6f  ->dataType = pCo
3d70: 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 53  l->sortOrder & S
3d80: 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d 41 53  QLITE_SO_TYPEMAS
3d90: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  K;.          bre
3da0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
3db0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3dc0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 65 72 68 61  .  /*.  ** Perha
3dd0: 70 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20 61  ps the name is a
3de0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
3df0: 65 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 69  e ROWID.  */.  i
3e00: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74  f( cnt==0 && cnt
3e10: 54 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  Tab==1 && sqlite
3e20: 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b  IsRowid(zCol) ){
3e30: 0a 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20  .    cnt = 1;.  
3e40: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
3e50: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 45 78 70 72   = -1;.    pExpr
3e60: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c  ->dataType = SQL
3e70: 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 7d 0a  ITE_SO_NUM;.  }.
3e80: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
3e90: 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68  e input is of th
3ea0: 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e  e form Z (not Y.
3eb0: 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e  Z or X.Y.Z) then
3ec0: 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20 2a 2a   the name Z.  **
3ed0: 20 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f 20   might refer to 
3ee0: 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c  an result-set al
3ef0: 69 61 73 2e 20 20 54 68 69 73 20 68 61 70 70 65  ias.  This happe
3f00: 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ns, for example,
3f10: 20 77 68 65 6e 0a 20 20 2a 2a 20 77 65 20 61 72   when.  ** we ar
3f20: 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65  e resolving name
3f30: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
3f40: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c  lause of the fol
3f50: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a  lowing command:.
3f60: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
3f70: 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20 46 52  LECT a+b AS x FR
3f80: 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20 78  OM table WHERE x
3f90: 3c 31 30 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  <10;.  **.  ** I
3fa0: 6e 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  n cases like thi
3fb0: 73 2c 20 72 65 70 6c 61 63 65 20 70 45 78 70 72  s, replace pExpr
3fc0: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
3fd0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
3fe0: 68 61 74 0a 20 20 2a 2a 20 66 6f 72 6d 73 20 74  hat.  ** forms t
3ff0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e  he result set en
4000: 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68  try ("a+b" in th
4010: 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72  e example) and r
4020: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
4030: 79 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  y..  ** Note tha
4040: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
4050: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
4060: 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  et should have a
4070: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a  lready been.  **
4080: 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65   resolved by the
4090: 20 74 69 6d 65 20 74 68 65 20 57 48 45 52 45 20   time the WHERE 
40a0: 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76  clause is resolv
40b0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ed..  */.  if( c
40c0: 6e 74 3d 3d 30 20 26 26 20 70 45 4c 69 73 74 21  nt==0 && pEList!
40d0: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  =0 ){.    for(j=
40e0: 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; j<pEList->nEx
40f0: 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
4100: 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69  char *zAs = pELi
4110: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
4120: 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30        if( zAs!=0
4130: 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d   && sqliteStrICm
4140: 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20  p(zAs, zCol)==0 
4150: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
4160: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
4170: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
4180: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
4190: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
41a0: 5f 41 53 3b 0a 20 20 20 20 20 20 20 20 70 45 78  _AS;.        pEx
41b0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  pr->iColumn = j;
41c0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
41d0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78  pLeft = sqliteEx
41e0: 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b  prDup(pEList->a[
41f0: 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  j].pExpr);.     
4200: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43     sqliteFree(zC
4210: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ol);.        ass
4220: 65 72 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20  ert( zTab==0 && 
4230: 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  zDb==0 );.      
4240: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
4250: 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 7d 0a 0a    }.    } .  }..
4260: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61    /*.  ** If X a
4270: 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69  nd Y are NULL (i
4280: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66  n other words if
4290: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
42a0: 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20   name Z is.  ** 
42b0: 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68  supplied) and th
42c0: 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20  e value of Z is 
42d0: 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62  enclosed in doub
42e0: 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a  le-quotes, then.
42f0: 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69    ** Z is a stri
4300: 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74  ng literal if it
4310: 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61   doesn't match a
4320: 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  ny column names.
4330: 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63    In that.  ** c
4340: 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
4350: 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
4360: 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61  y and not make a
4370: 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20  ny changes to.  
4380: 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2f 0a 20  ** pExpr..  */. 
4390: 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a   if( cnt==0 && z
43a0: 54 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d  Tab==0 && pColum
43b0: 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22  nToken->z[0]=='"
43c0: 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ' ){.    sqliteF
43d0: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72  ree(zCol);.    r
43e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
43f0: 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d  /*.  ** cnt==0 m
4400: 65 61 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e  eans there was n
4410: 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31  ot match.  cnt>1
4420: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65 72   means there wer
4430: 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f  e two or.  ** mo
4440: 72 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74  re matches.  Eit
4450: 68 65 72 20 77 61 79 2c 20 77 65 20 68 61 76 65  her way, we have
4460: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a   an error..  */.
4470: 20 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a    if( cnt!=1 ){.
4480: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b      char *z = 0;
4490: 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  .    char *zErr;
44a0: 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d  .    zErr = cnt=
44b0: 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f  =0 ? "no such co
44c0: 6c 75 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62  lumn: %s" : "amb
44d0: 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61  iguous column na
44e0: 6d 65 3a 20 25 73 22 3b 0a 20 20 20 20 69 66 28  me: %s";.    if(
44f0: 20 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71   zDb ){.      sq
4500: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a  liteSetString(&z
4510: 2c 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62  , zDb, ".", zTab
4520: 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b  , ".", zCol, 0);
4530: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
4540: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
4550: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  iteSetString(&z,
4560: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
4570: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
4580: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
4590: 65 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20  eStrDup(zCol);. 
45a0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45     }.    sqliteE
45b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
45c0: 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71  zErr, z);.    sq
45d0: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 7d  liteFree(z);.  }
45e0: 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
45f0: 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  and return.  */.
4600: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44 62    sqliteFree(zDb
4610: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
4620: 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46  zTab);.  sqliteF
4630: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c  ree(zCol);.  sql
4640: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 45  iteExprDelete(pE
4650: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  xpr->pLeft);.  p
4660: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
4670: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c  .  sqliteExprDel
4680: 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ete(pExpr->pRigh
4690: 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69  t);.  pExpr->pRi
46a0: 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72  ght = 0;.  pExpr
46b0: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
46c0: 3b 0a 20 20 73 71 6c 69 74 65 41 75 74 68 52 65  ;.  sqliteAuthRe
46d0: 61 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ad(pParse, pExpr
46e0: 2c 20 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 72  , pSrcList);.  r
46f0: 65 74 75 72 6e 20 63 6e 74 21 3d 31 3b 0a 7d 0a  eturn cnt!=1;.}.
4700: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4710: 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78 70  ine walks an exp
4720: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64  ression tree and
4730: 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72 65   resolves refere
4740: 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65  nces to.** table
4750: 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65 73   columns.  Nodes
4760: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 49 44 2e   of the form ID.
4770: 49 44 20 6f 72 20 49 44 20 72 65 73 6f 6c 76 65  ID or ID resolve
4780: 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65   into an.** inde
4790: 78 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  x to the table i
47a0: 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73 74  n the table list
47b0: 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e 20 6f 66   and a column of
47c0: 66 73 65 74 2e 20 20 54 68 65 20 0a 2a 2a 20 45  fset.  The .** E
47d0: 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f 72 20 73  xpr.opcode for s
47e0: 75 63 68 20 6e 6f 64 65 73 20 69 73 20 63 68 61  uch nodes is cha
47f0: 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  nged to TK_COLUM
4800: 4e 2e 20 20 54 68 65 20 45 78 70 72 2e 69 54 61  N.  The Expr.iTa
4810: 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  ble.** value is 
4820: 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69  changed to the i
4830: 6e 64 65 78 20 6f 66 20 74 68 65 20 72 65 66 65  ndex of the refe
4840: 72 65 6e 63 65 64 20 74 61 62 6c 65 20 69 6e 20  renced table in 
4850: 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70 6c 75 73  pTabList.** plus
4860: 20 74 68 65 20 22 62 61 73 65 22 20 76 61 6c 75   the "base" valu
4870: 65 2e 20 20 54 68 65 20 62 61 73 65 20 76 61 6c  e.  The base val
4880: 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65  ue will ultimate
4890: 6c 79 20 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a  ly become the.**
48a0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
48b0: 62 65 72 20 66 6f 72 20 61 20 63 75 72 73 6f 72  ber for a cursor
48c0: 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e   that is pointin
48d0: 67 20 69 6e 74 6f 20 74 68 65 20 72 65 66 65 72  g into the refer
48e0: 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c 65 2e 20  enced.** table. 
48f0: 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d   The Expr.iColum
4900: 6e 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  n value is chang
4910: 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ed to the index 
4920: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a  of the column .*
4930: 2a 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e  * of the referen
4940: 63 65 64 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ced table.  The 
4950: 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c  Expr.iColumn val
4960: 75 65 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ue for the speci
4970: 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63 6f 6c 75  al.** ROWID colu
4980: 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e 79 20 49  mn is -1.  Any I
4990: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
49a0: 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20 74 72 69  EY column is tri
49b0: 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61 6c 69 61  ed as an.** alia
49c0: 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a  s for ROWID..**.
49d0: 2a 2a 20 57 65 20 61 6c 73 6f 20 63 68 65 63 6b  ** We also check
49e0: 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
49f0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
4a00: 72 2e 20 20 49 4e 20 63 6f 6d 65 73 20 69 6e 20  r.  IN comes in 
4a10: 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a  two.** forms:.**
4a20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78  .**           ex
4a30: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
4a40: 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  .** and.**      
4a50: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
4a60: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
4a70: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
4a80: 73 20 68 61 6e 64 6c 65 64 20 62 79 20 63 72 65  s handled by cre
4a90: 61 74 69 6e 67 20 61 20 73 65 74 20 68 6f 6c 64  ating a set hold
4aa0: 69 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20  ing the list.** 
4ab0: 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65  of allowed value
4ac0: 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66  s.  The second f
4ad0: 6f 72 6d 20 63 61 75 73 65 73 20 74 68 65 20 53  orm causes the S
4ae0: 45 4c 45 43 54 20 74 6f 20 67 65 6e 65 72 61 74  ELECT to generat
4af0: 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  e .** a temporar
4b00: 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  y table..**.** T
4b10: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
4b20: 20 6c 6f 6f 6b 73 20 66 6f 72 20 73 63 61 6c 61   looks for scala
4b30: 72 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 61  r SELECTs that a
4b40: 72 65 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  re part of an ex
4b50: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20  pression..** If 
4b60: 69 74 20 66 69 6e 64 73 20 61 6e 79 2c 20 69 74  it finds any, it
4b70: 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
4b80: 74 6f 20 77 72 69 74 65 20 74 68 65 20 76 61 6c  to write the val
4b90: 75 65 20 6f 66 20 74 68 61 74 20 73 65 6c 65 63  ue of that selec
4ba0: 74 0a 2a 2a 20 69 6e 74 6f 20 61 20 6d 65 6d 6f  t.** into a memo
4bb0: 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 55  ry cell..**.** U
4bc0: 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 73 20 6f  nknown columns o
4bd0: 72 20 74 61 62 6c 65 73 20 70 72 6f 76 6f 6b 65  r tables provoke
4be0: 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20   an error.  The 
4bf0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
4c00: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
4c10: 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 61 6e  f errors seen an
4c20: 64 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  d leaves an erro
4c30: 72 20 6d 65 73 73 61 67 65 20 6f 6e 20 70 50 61  r message on pPa
4c40: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
4c50: 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72 52  .int sqliteExprR
4c60: 65 73 6f 6c 76 65 49 64 73 28 0a 20 20 50 61 72  esolveIds(.  Par
4c70: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4c80: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
4c90: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
4ca0: 73 74 20 2a 70 53 72 63 4c 69 73 74 2c 20 2f 2a  st *pSrcList, /*
4cb0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
4cc0: 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20  used to resolve 
4cd0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
4ce0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
4cf0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
4d00: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 65 64  expressions used
4d10: 20 74 6f 20 72 65 73 6f 6c 76 65 20 22 41 53 22   to resolve "AS"
4d20: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
4d30: 72 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r        /* The 
4d40: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
4d50: 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b   analyzed. */.){
4d60: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
4d70: 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 53 72   pExpr==0 || pSr
4d80: 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  cList==0 ) retur
4d90: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
4da0: 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
4db0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
4dc0: 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b  rt( pSrcList->a[
4dd0: 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26  i].iCursor>=0 &&
4de0: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
4df0: 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e  iCursor<pParse->
4e00: 6e 54 61 62 20 29 3b 0a 20 20 7d 0a 20 20 73 77  nTab );.  }.  sw
4e10: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
4e20: 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65  ){.    /* Double
4e30: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20  -quoted strings 
4e40: 28 65 78 3a 20 22 61 62 63 22 29 20 61 72 65 20  (ex: "abc") are 
4e50: 75 73 65 64 20 61 73 20 69 64 65 6e 74 69 66 69  used as identifi
4e60: 65 72 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f  ers if.    ** po
4e70: 73 73 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69  ssible.  Otherwi
4e80: 73 65 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61  se they remain a
4e90: 73 20 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67  s strings.  Sing
4ea0: 6c 65 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a  le-quoted.    **
4eb0: 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61   strings (ex: 'a
4ec0: 62 63 27 29 20 61 72 65 20 61 6c 77 61 79 73 20  bc') are always 
4ed0: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e  string literals.
4ee0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4ef0: 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
4f00: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74      if( pExpr->t
4f10: 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20  oken.z[0]=='\'' 
4f20: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f  ) break;.      /
4f30: 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  * Fall thru into
4f40: 20 74 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20   the TK_ID case 
4f50: 69 66 20 74 68 69 73 20 69 73 20 61 20 64 6f 75  if this is a dou
4f60: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
4f70: 67 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f  g */.    }.    /
4f80: 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66  * A lone identif
4f90: 69 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ier is the name 
4fa0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 64 2e 0a 20 20  of a columnd..  
4fb0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
4fc0: 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _ID: {.      if(
4fd0: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72   lookupName(pPar
4fe0: 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70 72  se, 0, 0, &pExpr
4ff0: 2d 3e 74 6f 6b 65 6e 2c 20 70 53 72 63 4c 69 73  ->token, pSrcLis
5000: 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72  t, pEList, pExpr
5010: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
5020: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
5030: 20 20 20 20 20 62 72 65 61 6b 3b 20 0a 20 20 20       break; .   
5040: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74   }.  .    /* A t
5050: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f  able name and co
5060: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49  lumn name:     I
5070: 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61  D.ID.    ** Or a
5080: 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65   database, table
5090: 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44   and column:  ID
50a0: 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20  .ID.ID.    */.  
50b0: 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b    case TK_DOT: {
50c0: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43  .      Token *pC
50d0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b  olumn;.      Tok
50e0: 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20  en *pTable;.    
50f0: 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20    Token *pDb;.  
5100: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
5110: 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  ;..      pRight 
5120: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
5130: 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68  .      if( pRigh
5140: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  t->op==TK_ID ){.
5150: 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b          pDb = 0;
5160: 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20  .        pTable 
5170: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
5180: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
5190: 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68  pColumn = &pRigh
51a0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
51b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
51c0: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
51d0: 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20  p==TK_DOT );.   
51e0: 20 20 20 20 20 70 44 62 20 3d 20 26 70 45 78 70       pDb = &pExp
51f0: 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  r->pLeft->token;
5200: 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20  .        pTable 
5210: 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74  = &pRight->pLeft
5220: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
5230: 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67   pColumn = &pRig
5240: 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65  ht->pRight->toke
5250: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
5260: 20 69 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28   if( lookupName(
5270: 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70 54 61  pParse, pDb, pTa
5280: 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 53  ble, pColumn, pS
5290: 72 63 4c 69 73 74 2c 20 30 2c 20 70 45 78 70 72  rcList, 0, pExpr
52a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
52b0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
52c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
52d0: 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  }..    case TK_I
52e0: 4e 3a 20 7b 0a 20 20 20 20 20 20 56 64 62 65 20  N: {.      Vdbe 
52f0: 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64  *v = sqliteGetVd
5300: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
5310: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
5320: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 69 66 28  urn 1;.      if(
5330: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
5340: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 53  veIds(pParse, pS
5350: 72 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  rcList, pEList, 
5360: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b  pExpr->pLeft) ){
5370: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5380: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
5390: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
53a0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
53b0: 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
53c0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
53d0: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
53e0: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
53f0: 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
5400: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
5410: 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 61  he select into a
5420: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
5430: 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68     ** table.  Th
5440: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
5450: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
5460: 20 74 61 62 6c 65 20 68 61 73 20 61 6c 72 65 61   table has alrea
5470: 64 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  dy.        ** be
5480: 65 6e 20 70 75 74 20 69 6e 20 69 54 61 62 6c 65  en put in iTable
5490: 20 62 79 20 73 71 6c 69 74 65 45 78 70 72 52 65   by sqliteExprRe
54a0: 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 29 2e  solveInSelect().
54b0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
54c0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
54d0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
54e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ++;.        sqli
54f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5500: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 70 45 78 70  P_OpenTemp, pExp
5510: 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20  r->iTable, 1);. 
5520: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c         sqliteSel
5530: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
5540: 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  r->pSelect, SRT_
5550: 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Set, pExpr->iTab
5560: 6c 65 2c 20 30 2c 30 2c 30 29 3b 0a 20 20 20 20  le, 0,0,0);.    
5570: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
5580: 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  r->pList ){.    
5590: 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
55a0: 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
55b0: 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a  list).        **
55c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65 61  .        ** Crea
55d0: 74 65 20 61 20 73 65 74 20 74 6f 20 70 75 74 20  te a set to put 
55e0: 74 68 65 20 65 78 70 72 6c 69 73 74 20 76 61 6c  the exprlist val
55f0: 75 65 73 20 69 6e 2e 20 20 54 68 65 20 53 65 74  ues in.  The Set
5600: 20 69 64 20 69 73 20 73 74 6f 72 65 64 0a 20 20   id is stored.  
5610: 20 20 20 20 20 20 2a 2a 20 69 6e 20 69 54 61 62        ** in iTab
5620: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
5630: 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 69 53         int i, iS
5640: 65 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  et;.        for(
5650: 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c  i=0; i<pExpr->pL
5660: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
5670: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
5680: 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70   *pE2 = pExpr->p
5690: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
56a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
56b0: 21 73 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e  !sqliteExprIsCon
56c0: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
56d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
56e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
56f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
5700: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
5710: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d  of IN operator m
5720: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 22  ust be constant"
5730: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
5740: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
5750: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
5760: 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  f( sqliteExprChe
5770: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20  ck(pParse, pE2, 
5780: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  0, 0) ){.       
5790: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
57a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
57b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 53 65     }.        iSe
57c0: 74 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  t = pExpr->iTabl
57d0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  e = pParse->nSet
57e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ++;.        for(
57f0: 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c  i=0; i<pExpr->pL
5800: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
5810: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
5820: 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70   *pE2 = pExpr->p
5830: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
5840: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74  ;.          swit
5850: 63 68 28 20 70 45 32 2d 3e 6f 70 20 29 7b 0a 20  ch( pE2->op ){. 
5860: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
5870: 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20  TK_FLOAT:.      
5880: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e        case TK_IN
5890: 54 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20 20  TEGER:.         
58a0: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
58b0: 47 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  G: {.           
58c0: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
58d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
58e0: 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 69   OP_SetInsert, i
58f0: 53 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Set, 0);.       
5900: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5910: 45 32 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20  E2->token.z );. 
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
5930: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
5940: 76 2c 20 61 64 64 72 2c 20 70 45 32 2d 3e 74 6f  v, addr, pE2->to
5950: 6b 65 6e 2e 7a 2c 20 70 45 32 2d 3e 74 6f 6b 65  ken.z, pE2->toke
5960: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n.n);.          
5970: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
5980: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
5990: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
59a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
59b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
59c0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
59d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
59e0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
59f0: 20 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20   pE2);.         
5a00: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
5a10: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 49 6e  ddOp(v, OP_SetIn
5a20: 73 65 72 74 2c 20 69 53 65 74 2c 20 30 29 3b 0a  sert, iSet, 0);.
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
5a40: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
5a50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
5a60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5a70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5a80: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
5a90: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
5aa0: 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20   /* This has to 
5ab0: 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45  be a scalar SELE
5ac0: 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  CT.  Generate co
5ad0: 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20  de to put the.  
5ae0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
5af0: 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61  this select in a
5b00: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
5b10: 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   record the numb
5b20: 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  er.      ** of t
5b30: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  he memory cell i
5b40: 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
5b50: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
5b60: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 61 72 73  >iColumn = pPars
5b70: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
5b80: 20 69 66 28 20 73 71 6c 69 74 65 53 65 6c 65 63   if( sqliteSelec
5b90: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
5ba0: 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 4d 65  >pSelect, SRT_Me
5bb0: 6d 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  m, pExpr->iColum
5bc0: 6e 2c 30 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20  n,0,0,0) ){.    
5bd0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
5be0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5bf0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
5c00: 20 46 6f 72 20 61 6c 6c 20 65 6c 73 65 2c 20 6a   For all else, j
5c10: 75 73 74 20 72 65 63 75 72 73 69 76 65 6c 79 20  ust recursively 
5c20: 77 61 6c 6b 20 74 68 65 20 74 72 65 65 20 2a 2f  walk the tree */
5c30: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
5c40: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
5c50: 3e 70 4c 65 66 74 0a 20 20 20 20 20 20 26 26 20  >pLeft.      && 
5c60: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
5c70: 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 53 72  eIds(pParse, pSr
5c80: 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  cList, pEList, p
5c90: 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a  Expr->pLeft) ){.
5ca0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
5cb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5cc0: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
5cd0: 74 20 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69  t .      && sqli
5ce0: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
5cf0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 4c 69 73  (pParse, pSrcLis
5d00: 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72  t, pEList, pExpr
5d10: 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  ->pRight) ){.   
5d20: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5d30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5d40: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
5d50: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
5d60: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
5d70: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
5d80: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  >pList;.        
5d90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
5da0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
5db0: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
5dc0: 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  Arg = pList->a[i
5dd0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
5de0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
5df0: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
5e00: 73 65 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45  se, pSrcList, pE
5e10: 4c 69 73 74 2c 20 70 41 72 67 29 20 29 7b 0a 20  List, pArg) ){. 
5e20: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
5e30: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 1;.          }
5e40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5e50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5e60: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5e70: 2a 20 70 45 78 70 72 20 69 73 20 61 20 6e 6f 64  * pExpr is a nod
5e80: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 61  e that defines a
5e90: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f 6d   function of som
5ea0: 65 20 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67 68  e kind.  It migh
5eb0: 74 0a 2a 2a 20 62 65 20 61 20 73 79 6e 74 61 63  t.** be a syntac
5ec0: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b  tic function lik
5ed0: 65 20 22 63 6f 75 6e 74 28 78 29 22 20 6f 72 20  e "count(x)" or 
5ee0: 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 66 75  it might be a fu
5ef0: 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 69  nction.** that i
5f00: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70 65  mplements an ope
5f10: 72 61 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20 4c  rator, like "a L
5f20: 49 4b 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a 20  IKE b".  .**.** 
5f30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
5f40: 65 73 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e 74  es *pzName point
5f50: 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   to the name of 
5f60: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  the function and
5f70: 20 0a 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f 6c   .** *pnName hol
5f80: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
5f90: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
5fa0: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e  e function name.
5fb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5fc0: 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28  getFunctionName(
5fd0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e  Expr *pExpr, con
5fe0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d 65  st char **pzName
5ff0: 2c 20 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b 0a  , int *pnName){.
6000: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
6010: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
6020: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
6030: 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 70       *pzName = p
6040: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20  Expr->token.z;. 
6050: 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 70       *pnName = p
6060: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20  Expr->token.n;. 
6070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6080: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49  }.    case TK_LI
6090: 4b 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  KE: {.      *pzN
60a0: 61 6d 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20 20  ame = "like";.  
60b0: 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b      *pnName = 4;
60c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
60d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
60e0: 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a 70  GLOB: {.      *p
60f0: 7a 4e 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b 0a  zName = "glob";.
6100: 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20        *pnName = 
6110: 34 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  4;.      break;.
6120: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
6130: 74 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61  t: {.      *pzNa
6140: 6d 65 20 3d 20 22 63 61 6e 27 74 20 68 61 70 70  me = "can't happ
6150: 65 6e 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61  en";.      *pnNa
6160: 6d 65 20 3d 20 31 32 3b 0a 20 20 20 20 20 20 62  me = 12;.      b
6170: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6180: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 63  }../*.** Error c
6190: 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f  heck the functio
61a0: 6e 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73  ns in an express
61b0: 69 6f 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ion.  Make sure 
61c0: 61 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  all.** function 
61d0: 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e  names are recogn
61e0: 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e  ized and all fun
61f0: 63 74 69 6f 6e 73 20 68 61 76 65 20 74 68 65 20  ctions have the 
6200: 63 6f 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62 65  correct.** numbe
6210: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
6220: 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
6230: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
6240: 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69 66  e->zErrMsg.** if
6250: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
6260: 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ss.  Return the 
6270: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
6280: 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41 67  ..**.** if pIsAg
6290: 67 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61 6e  g is not null an
62a0: 64 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  d this expressio
62b0: 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  n is an aggregat
62c0: 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28 6c  e function.** (l
62d0: 69 6b 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72 20  ike count(*) or 
62e0: 6d 61 78 28 76 61 6c 75 65 29 29 20 74 68 65 6e  max(value)) then
62f0: 20 77 72 69 74 65 20 61 20 31 20 69 6e 74 6f 20   write a 1 into 
6300: 2a 70 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20  *pIsAgg..*/.int 
6310: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
6320: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
6330: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
6340: 61 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20 2a 70  allowAgg, int *p
6350: 49 73 41 67 67 29 7b 0a 20 20 69 6e 74 20 6e 45  IsAgg){.  int nE
6360: 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45  rr = 0;.  if( pE
6370: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
6380: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
6390: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
63a0: 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20  se TK_GLOB:.    
63b0: 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20  case TK_LIKE:.  
63c0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
63d0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
63e0: 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  n = pExpr->pList
63f0: 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   ? pExpr->pList-
6400: 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20  >nExpr : 0;  /* 
6410: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
6420: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
6430: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
6440: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  0;       /* True
6450: 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63   if no such func
6460: 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20  tion exists */. 
6470: 20 20 20 20 20 69 6e 74 20 69 73 5f 74 79 70 65       int is_type
6480: 5f 6f 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  _of = 0;        
6490: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 74   /* True if is t
64a0: 68 65 20 73 70 65 63 69 61 6c 20 54 79 70 65 4f  he special TypeO
64b0: 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  f() function */.
64c0: 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f        int wrong_
64d0: 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20  num_args = 0;   
64e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f    /* True if wro
64f0: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
6500: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
6510: 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20  int is_agg = 0; 
6520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6530: 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67 67  rue if is an agg
6540: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
6550: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  */.      int i;.
6560: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
6590: 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e  haracters in fun
65a0: 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
65b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
65c0: 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  zId;            
65d0: 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
65e0: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46  name. */.      F
65f0: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 0a 20  uncDef *pDef;.. 
6600: 20 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e       getFunction
6610: 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64  Name(pExpr, &zId
6620: 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70  , &nId);.      p
6630: 44 65 66 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Def = sqliteFind
6640: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
6650: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  >db, zId, nId, n
6660: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
6670: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
6680: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
6690: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
66a0: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
66b0: 64 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  d, -1, 0);.     
66c0: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
66d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
66e0: 6e 3d 3d 31 20 26 26 20 6e 49 64 3d 3d 36 20 26  n==1 && nId==6 &
66f0: 26 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  & sqliteStrNICmp
6700: 28 7a 49 64 2c 20 22 74 79 70 65 6f 66 22 2c 20  (zId, "typeof", 
6710: 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  6)==0 ){.       
6720: 20 20 20 20 20 69 73 5f 74 79 70 65 5f 6f 66 20       is_type_of 
6730: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
6740: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
6750: 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20     no_such_func 
6760: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
6770: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
6780: 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f            wrong_
6790: 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20  num_args = 1;.  
67a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
67b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f  lse{.        is_
67c0: 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e  agg = pDef->xFun
67d0: 63 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  c==0;.      }.  
67e0: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 26      if( is_agg &
67f0: 26 20 21 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20  & !allowAgg ){. 
6800: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
6810: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
6820: 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
6830: 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  te function %.*s
6840: 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  ()", nId, zId);.
6850: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
6860: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
6870: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
6880: 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63  if( no_such_func
6890: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
68a0: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
68b0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63  e, "no such func
68c0: 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64  tion: %.*s", nId
68d0: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
68e0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  nErr++;.      }e
68f0: 6c 73 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75  lse if( wrong_nu
6900: 6d 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20  m_args ){.      
6910: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
6920: 28 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e  (pParse,"wrong n
6930: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
6940: 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25  ts to function %
6950: 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20  .*s()",.        
6960: 20 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a       nId, zId);.
6970: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
6980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6990: 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20  ( is_agg ){.    
69a0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
69b0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b  TK_AGG_FUNCTION;
69c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 73  .        if( pIs
69d0: 41 67 67 20 29 20 2a 70 49 73 41 67 67 20 3d 20  Agg ) *pIsAgg = 
69e0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
69f0: 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d   for(i=0; nErr==
6a00: 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  0 && i<n; i++){.
6a10: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
6a20: 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70  qliteExprCheck(p
6a30: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
6a40: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
6a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 61 6c 6c 6f 77 41 67 67 20 26 26 20 21 69 73 5f  allowAgg && !is_
6a80: 61 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20  agg, pIsAgg);.  
6a90: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6aa0: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
6ab0: 20 20 20 69 66 28 20 69 73 5f 74 79 70 65 5f 6f     if( is_type_o
6ac0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
6ad0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54  Expr->op = TK_ST
6ae0: 52 49 4e 47 3b 0a 20 20 20 20 20 20 20 20 20 20  RING;.          
6af0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 54 79  if( sqliteExprTy
6b00: 70 65 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  pe(pExpr->pList-
6b10: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3d 3d 53 51  >a[0].pExpr)==SQ
6b20: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20  LITE_SO_NUM ){. 
6b30: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
6b40: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22 6e 75 6d  ->token.z = "num
6b50: 65 72 69 63 22 3b 0a 20 20 20 20 20 20 20 20 20  eric";.         
6b60: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
6b70: 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 20 20 20  n = 7;.         
6b80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6b90: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
6ba0: 2e 7a 20 3d 20 22 74 65 78 74 22 3b 0a 20 20 20  .z = "text";.   
6bb0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6bc0: 74 6f 6b 65 6e 2e 6e 20 3d 20 34 3b 0a 20 20 20  token.n = 4;.   
6bd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6be0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
6bf0: 66 28 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70  f( pDef->dataTyp
6c00: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e>=0 ){.        
6c10: 69 66 28 20 70 44 65 66 2d 3e 64 61 74 61 54 79  if( pDef->dataTy
6c20: 70 65 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  pe<n ){.        
6c30: 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70    pExpr->dataTyp
6c40: 65 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  e = .           
6c50: 20 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65    sqliteExprType
6c60: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61  (pExpr->pList->a
6c70: 5b 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65 5d  [pDef->dataType]
6c80: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
6c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6ca0: 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70    pExpr->dataTyp
6cb0: 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  e = SQLITE_SO_NU
6cc0: 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
6cd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65     }else if( pDe
6ce0: 66 2d 3e 64 61 74 61 54 79 70 65 3d 3d 53 51 4c  f->dataType==SQL
6cf0: 49 54 45 5f 41 52 47 53 20 29 7b 0a 20 20 20 20  ITE_ARGS ){.    
6d00: 20 20 20 20 70 44 65 66 2d 3e 64 61 74 61 54 79      pDef->dataTy
6d10: 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54  pe = SQLITE_SO_T
6d20: 45 58 54 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  EXT;.        for
6d30: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
6d40: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
6d50: 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 70 45  qliteExprType(pE
6d60: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  xpr->pList->a[i]
6d70: 2e 70 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f  .pExpr)==SQLITE_
6d80: 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20  SO_NUM ){.      
6d90: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74        pExpr->dat
6da0: 61 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53  aType = SQLITE_S
6db0: 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 20 20 20  O_NUM;.         
6dc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
6de0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6df0: 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65 3d 3d  pDef->dataType==
6e00: 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 20 29  SQLITE_NUMERIC )
6e10: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
6e20: 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c 49  >dataType = SQLI
6e30: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20  TE_SO_NUM;.     
6e40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6e50: 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20  pExpr->dataType 
6e60: 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  = SQLITE_SO_TEXT
6e70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6e80: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
6e90: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
6ea0: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
6eb0: 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78   nErr = sqliteEx
6ec0: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
6ed0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 6c  pExpr->pLeft, al
6ee0: 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b  lowAgg, pIsAgg);
6ef0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6f00: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
6f10: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
6f20: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
6f30: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
6f40: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
6f50: 67 68 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70  ght, allowAgg, p
6f60: 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a  IsAgg);.      }.
6f70: 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d        if( nErr==
6f80: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
6f90: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
6fa0: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73   n = pExpr->pLis
6fb0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
6fc0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
6fd0: 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d   for(i=0; nErr==
6fe0: 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  0 && i<n; i++){.
6ff0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
7000: 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  pE2 = pExpr->pLi
7010: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
7020: 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d            nErr =
7030: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
7040: 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 61 6c  (pParse, pE2, al
7050: 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b  lowAgg, pIsAgg);
7060: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7070: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7080: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7090: 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nErr;.}../*.*
70a0: 2a 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  * Return either 
70b0: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 6f 72  SQLITE_SO_NUM or
70c0: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20   SQLITE_SO_TEXT 
70d0: 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 74  to indicate whet
70e0: 68 65 72 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e  her the.** given
70f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75   expression shou
7100: 6c 64 20 73 6f 72 74 20 61 73 20 6e 75 6d 65 72  ld sort as numer
7110: 69 63 20 76 61 6c 75 65 73 20 6f 72 20 61 73 20  ic values or as 
7120: 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  text..**.** The 
7130: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
7140: 65 49 64 73 28 29 20 61 6e 64 20 73 71 6c 69 74  eIds() and sqlit
7150: 65 45 78 70 72 43 68 65 63 6b 28 29 20 72 6f 75  eExprCheck() rou
7160: 74 69 6e 65 73 20 6d 75 73 74 20 68 61 76 65 0a  tines must have.
7170: 2a 2a 20 62 6f 74 68 20 62 65 65 6e 20 63 61 6c  ** both been cal
7180: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
7190: 73 73 69 6f 6e 20 62 65 66 6f 72 65 20 69 74 20  ssion before it 
71a0: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
71b0: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e  s routine..*/.in
71c0: 74 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  t sqliteExprType
71d0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
71e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
71f0: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20  QLITE_SO_NUM;.  
7200: 77 68 69 6c 65 28 20 70 20 29 20 73 77 69 74 63  while( p ) switc
7210: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
7220: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
7230: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
7240: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
7250: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
7260: 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
7270: 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
7280: 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  TK_OR:.    case 
7290: 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
72a0: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a  ase TK_NOTNULL:.
72b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
72c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
72d0: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
72e0: 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  _UPLUS:.    case
72f0: 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
7300: 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
7310: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
7320: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
7330: 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
7340: 54 4b 5f 52 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_RSHIFT:.    c
7350: 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
7360: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
7370: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
7380: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
7390: 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IN:.    case TK_
73a0: 42 45 54 57 45 45 4e 3a 0a 20 20 20 20 63 61 73  BETWEEN:.    cas
73b0: 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63  e TK_GLOB:.    c
73c0: 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20  ase TK_LIKE:.   
73d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
73e0: 5f 53 4f 5f 4e 55 4d 3b 0a 0a 20 20 20 20 63 61  _SO_NUM;..    ca
73f0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
7400: 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a    case TK_NULL:.
7410: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
7420: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
7430: 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
7440: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f  return SQLITE_SO
7450: 5f 54 45 58 54 3b 0a 0a 20 20 20 20 63 61 73 65  _TEXT;..    case
7460: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
7470: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
7480: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
7490: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
74a0: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
74b0: 20 54 4b 5f 45 51 3a 0a 20 20 20 20 20 20 69 66   TK_EQ:.      if
74c0: 28 20 73 71 6c 69 74 65 45 78 70 72 54 79 70 65  ( sqliteExprType
74d0: 28 70 2d 3e 70 4c 65 66 74 29 3d 3d 53 51 4c 49  (p->pLeft)==SQLI
74e0: 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20  TE_SO_NUM ){.   
74f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7500: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20  TE_SO_NUM;.     
7510: 20 7d 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e   }.      p = p->
7520: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 62 72  pRight;.      br
7530: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  eak;..    case T
7540: 4b 5f 41 53 3a 0a 20 20 20 20 20 20 70 20 3d 20  K_AS:.      p = 
7550: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
7560: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
7570: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
7580: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
7590: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
75a0: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
75b0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 64 61 74 61    return p->data
75c0: 54 79 70 65 3b 0a 0a 20 20 20 20 63 61 73 65 20  Type;..    case 
75d0: 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 20  TK_SELECT:.     
75e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65 6c   assert( p->pSel
75f0: 65 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ect );.      ass
7600: 65 72 74 28 20 70 2d 3e 70 53 65 6c 65 63 74 2d  ert( p->pSelect-
7610: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
7620: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65 6c   assert( p->pSel
7630: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
7640: 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 20  pr>0 );.      p 
7650: 3d 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45  = p->pSelect->pE
7660: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
7670: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
7680: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45      case TK_CASE
7690: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
76a0: 3e 70 52 69 67 68 74 20 26 26 20 73 71 6c 69 74  >pRight && sqlit
76b0: 65 45 78 70 72 54 79 70 65 28 70 2d 3e 70 52 69  eExprType(p->pRi
76c0: 67 68 74 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  ght)==SQLITE_SO_
76d0: 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  NUM ){.        r
76e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
76f0: 4e 55 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NUM;.      }.   
7700: 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20     if( p->pList 
7710: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
7720: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
7730: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 2d 3e 70  st *pList = p->p
7740: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
7750: 72 28 69 3d 31 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=1; i<pList->
7760: 6e 45 78 70 72 3b 20 69 2b 3d 32 29 7b 0a 20 20  nExpr; i+=2){.  
7770: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
7780: 74 65 45 78 70 72 54 79 70 65 28 70 4c 69 73 74  teExprType(pList
7790: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3d 3d 53  ->a[i].pExpr)==S
77a0: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a  QLITE_SO_NUM ){.
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
77c0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  rn SQLITE_SO_NUM
77d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
77e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
77f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7800: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20  ITE_SO_TEXT;.   
7810: 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   }..    default:
7820: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7830: 2d 3e 6f 70 3d 3d 54 4b 5f 41 42 4f 52 54 20 29  ->op==TK_ABORT )
7840: 3b 20 20 2f 2a 20 43 61 6e 27 74 20 48 61 70 70  ;  /* Can't Happ
7850: 65 6e 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  en */.      brea
7860: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
7870: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 7d  SQLITE_SO_NUM;.}
7880: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
7890: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
78a0: 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
78b0: 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
78c0: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
78d0: 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65  and leave the re
78e0: 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  sult on the top 
78f0: 6f 66 20 73 74 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  of stack..*/.voi
7900: 64 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65  d sqliteExprCode
7910: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7920: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
7930: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
7940: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
7950: 70 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  p;.  if( v==0 ||
7960: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
7970: 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45  rn;.  switch( pE
7980: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
7990: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20  ase TK_PLUS:    
79a0: 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20 20 20   op = OP_Add;   
79b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
79c0: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 20  se TK_MINUS:    
79d0: 6f 70 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74  op = OP_Subtract
79e0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
79f0: 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 20 6f  e TK_STAR:     o
7a00: 70 20 3d 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3b  p = OP_Multiply;
7a10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7a20: 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 20 6f 70   TK_SLASH:    op
7a30: 20 3d 20 4f 50 5f 44 69 76 69 64 65 3b 20 20 20   = OP_Divide;   
7a40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7a50: 54 4b 5f 41 4e 44 3a 20 20 20 20 20 20 6f 70 20  TK_AND:      op 
7a60: 3d 20 4f 50 5f 41 6e 64 3b 20 20 20 20 20 20 62  = OP_And;      b
7a70: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
7a80: 4b 5f 4f 52 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_OR:       op =
7a90: 20 4f 50 5f 4f 72 3b 20 20 20 20 20 20 20 62 72   OP_Or;       br
7aa0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7ab0: 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _LT:       op = 
7ac0: 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Lt;       bre
7ad0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7ae0: 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LE:       op = O
7af0: 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Le;       brea
7b00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
7b10: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
7b20: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
7b30: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
7b40: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
7b50: 47 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Ge;       break;
7b60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
7b70: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e         op = OP_N
7b80: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
7b90: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
7ba0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
7bb0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
7bc0: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
7bd0: 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e  L:   op = OP_IsN
7be0: 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ull;   break;.  
7bf0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
7c00: 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  L:  op = OP_NotN
7c10: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
7c20: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
7c30: 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 3b 20     op = OP_Not; 
7c40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7c50: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
7c60: 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 67 61 74 69    op = OP_Negati
7c70: 76 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ve; break;.    c
7c80: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
7c90: 20 6f 70 20 3d 20 4f 50 5f 42 69 74 41 6e 64 3b   op = OP_BitAnd;
7ca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
7cb0: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 20  se TK_BITOR:    
7cc0: 6f 70 20 3d 20 4f 50 5f 42 69 74 4f 72 3b 20 20  op = OP_BitOr;  
7cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7ce0: 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 20 6f  e TK_BITNOT:   o
7cf0: 70 20 3d 20 4f 50 5f 42 69 74 4e 6f 74 3b 20 20  p = OP_BitNot;  
7d00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7d10: 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 20 6f 70   TK_LSHIFT:   op
7d20: 20 3d 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3b   = OP_ShiftLeft;
7d30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7d40: 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 20 6f  e TK_RSHIFT:   o
7d50: 70 20 3d 20 4f 50 5f 53 68 69 66 74 52 69 67 68  p = OP_ShiftRigh
7d60: 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  t; break;.    ca
7d70: 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 20  se TK_REM:      
7d80: 6f 70 20 3d 20 4f 50 5f 52 65 6d 61 69 6e 64 65  op = OP_Remainde
7d90: 72 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  r;  break;.    d
7da0: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
7db0: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78   }.  switch( pEx
7dc0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
7dd0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
7de0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
7df0: 2d 3e 75 73 65 41 67 67 20 29 7b 0a 20 20 20 20  ->useAgg ){.    
7e00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7e10: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74  dOp(v, OP_AggGet
7e20: 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67  , 0, pExpr->iAgg
7e30: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
7e40: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
7e50: 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
7e60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7e70: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45  v, OP_Column, pE
7e80: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
7e90: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
7ea0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7eb0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7ec0: 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20  Op(v, OP_Recno, 
7ed0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
7ee0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7ef0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7f00: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
7f10: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
7f20: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
7f30: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
7f40: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
7f50: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 26 26 20 73  =TK_INTEGER && s
7f60: 71 6c 69 74 65 46 69 74 73 49 6e 33 32 42 69 74  qliteFitsIn32Bit
7f70: 73 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  s(pExpr->token.z
7f80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
7f90: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7fa0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 61 74 6f 69  OP_Integer, atoi
7fb0: 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29  (pExpr->token.z)
7fc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
7fd0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7fe0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7ff0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
8000: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
8010: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
8020: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 73 71  en.z );.      sq
8030: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
8040: 28 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e 74  (v, -1, pExpr->t
8050: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
8060: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73  oken.n);.      s
8070: 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74 65  qliteVdbeDequote
8080: 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20  P3(v, -1);.     
8090: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
80a0: 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
80b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
80c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
80d0: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
80e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
80f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
8100: 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ABLE: {.      sq
8110: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8120: 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
8130: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
8140: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8150: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8160: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
8170: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
8180: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
8190: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
81a0: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
81b0: 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EQ: {.      if( 
81c0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
81d0: 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 73 71  _format>=4 && sq
81e0: 6c 69 74 65 45 78 70 72 54 79 70 65 28 70 45 78  liteExprType(pEx
81f0: 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54  pr)==SQLITE_SO_T
8200: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  EXT ){.        o
8210: 70 20 2b 3d 20 36 3b 20 20 2f 2a 20 43 6f 6e 76  p += 6;  /* Conv
8220: 65 72 74 20 6e 75 6d 65 72 69 63 20 6f 70 63 6f  ert numeric opco
8230: 64 65 73 20 74 6f 20 74 65 78 74 20 6f 70 63 6f  des to text opco
8240: 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  des */.      }. 
8250: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
8260: 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65  ough into the ne
8270: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
8280: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
8290: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
82a0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
82b0: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
82c0: 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
82d0: 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
82e0: 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
82f0: 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
8300: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
8310: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
8320: 53 48 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SH: {.      sqli
8330: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
8340: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
8350: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
8360: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
8370: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
8380: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8390: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
83a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
83b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
83c0: 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
83d0: 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 7b 0a  se TK_RSHIFT: {.
83e0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
83f0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
8400: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
8410: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
8420: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
8430: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
8440: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8450: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
8460: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8470: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
8480: 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AT: {.      sqli
8490: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
84a0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
84b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
84c0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
84d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
84e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
84f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  ddOp(v, OP_Conca
8500: 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 2, 0);.      
8510: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8520: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
8530: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
8540: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
8550: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
8560: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
8570: 46 4c 4f 41 54 20 7c 7c 20 70 45 78 70 72 2d 3e  FLOAT || pExpr->
8580: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
8590: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
85a0: 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 45 78   Token *p = &pEx
85b0: 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pr->pLeft->token
85c0: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
85d0: 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  z = sqliteMalloc
85e0: 28 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20  ( p->n + 2 );.  
85f0: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 2c        sprintf(z,
8600: 20 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20   "-%.*s", p->n, 
8610: 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  p->z);.        i
8620: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  f( pExpr->pLeft-
8630: 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
8640: 26 26 20 73 71 6c 69 74 65 46 69 74 73 49 6e 33  && sqliteFitsIn3
8650: 32 42 69 74 73 28 7a 29 20 29 7b 0a 20 20 20 20  2Bits(z) ){.    
8660: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8670: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
8680: 67 65 72 2c 20 61 74 6f 69 28 7a 29 2c 20 30 29  ger, atoi(z), 0)
8690: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
86a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
86b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
86c0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
86d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
86e0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
86f0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 70  geP3(v, -1, z, p
8700: 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ->n+1);.        
8710: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
8720: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8730: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
8740: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
8750: 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d   TK_NOT */.    }
8760: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
8770: 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
8780: 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  _NOT: {.      sq
8790: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
87a0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
87b0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
87c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
87d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
87e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
87f0: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
8800: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
8810: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
8820: 64 65 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  dest;.      sqli
8830: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8840: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29  P_Integer, 1, 0)
8850: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
8860: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
8870: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
8880: 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c 69 74      dest = sqlit
8890: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
88a0: 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  (v) + 2;.      s
88b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
88c0: 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a  , op, 1, dest);.
88d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
88e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
88f0: 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  mm, -1, 0);.    
8900: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8910: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
8920: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
8930: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8940: 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 30  (v, OP_AggGet, 0
8950: 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a  , pExpr->iAgg);.
8960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8970: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47   }.    case TK_G
8980: 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LOB:.    case TK
8990: 5f 4c 49 4b 45 3a 0a 20 20 20 20 63 61 73 65 20  _LIKE:.    case 
89a0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
89b0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
89c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
89d0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
89e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  ;.      int nExp
89f0: 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  r = pList ? pLis
8a00: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  t->nExpr : 0;.  
8a10: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
8a20: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  f;.      int nId
8a30: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
8a40: 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20 67  ar *zId;.      g
8a50: 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 70  etFunctionName(p
8a60: 45 78 70 72 2c 20 26 7a 49 64 2c 20 26 6e 49 64  Expr, &zId, &nId
8a70: 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  );.      pDef = 
8a80: 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74 69  sqliteFindFuncti
8a90: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
8aa0: 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20  Id, nId, nExpr, 
8ab0: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
8ac0: 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20  ( pDef!=0 );.   
8ad0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
8ae0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
8af0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
8b00: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
8b10: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
8b20: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8b30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8b40: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 6e 45 78 70  P_Function, nExp
8b50: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
8b60: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
8b70: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 44  v, -1, (char*)pD
8b80: 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b  ef, P3_POINTER);
8b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8ba0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8bb0: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
8bc0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8bd0: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
8be0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30  Expr->iColumn, 0
8bf0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8c00: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8c10: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
8c20: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73 71  t addr;.      sq
8c30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8c40: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
8c50: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8c60: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
8c70: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
8c80: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
8c90: 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64  iteVdbeCurrentAd
8ca0: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
8cb0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8cc0: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20  OP_NotNull, -1, 
8cd0: 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 20 20 73  addr+4);.      s
8ce0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8cf0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
8d00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8d10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
8d20: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
8d30: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8d40: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
8d50: 20 61 64 64 72 2b 36 29 3b 0a 20 20 20 20 20 20   addr+6);.      
8d60: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
8d70: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
8d80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8d90: 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
8da0: 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 36  ->iTable, addr+6
8db0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8dc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8dd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
8de0: 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  tFound, pExpr->i
8df0: 54 61 62 6c 65 2c 20 61 64 64 72 2b 36 29 3b 0a  Table, addr+6);.
8e00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8e10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8e20: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20   OP_AddImm, -1, 
8e30: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
8e40: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
8e50: 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
8e60: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
8e70: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
8e80: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
8e90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8ea0: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
8eb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  ;.      sqliteEx
8ec0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
8ed0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
8ee0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
8ef0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8f00: 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b  v, OP_Ge, 0, 0);
8f10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8f20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
8f30: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
8f40: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
8f50: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
8f60: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  ist->a[1].pExpr)
8f70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8f80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 65  beAddOp(v, OP_Le
8f90: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
8fa0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8fb0: 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b  , OP_And, 0, 0);
8fc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8fd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8fe0: 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  UPLUS:.    case 
8ff0: 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73  TK_AS: {.      s
9000: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
9010: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
9020: 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ft);.      break
9030: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9040: 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20   TK_CASE: {.    
9050: 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c    int expr_end_l
9060: 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  abel;.      int 
9070: 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20  jumpInst;.      
9080: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
9090: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20  int nExpr;.     
90a0: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 61   int i;..      a
90b0: 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
90c0: 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st);.      asser
90d0: 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  t((pExpr->pList-
90e0: 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30  >nExpr % 2) == 0
90f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9100: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
9110: 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
9120: 6e 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70  nExpr = pExpr->p
9130: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
9140: 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65     expr_end_labe
9150: 6c 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  l = sqliteVdbeMa
9160: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
9170: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
9180: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
9190: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
91a0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
91b0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
91c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
91d0: 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  pr; i=i+2){.    
91e0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
91f0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
9200: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
9210: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
9220: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
9230: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
9240: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9250: 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20  P_Dup, 1, 1);.  
9260: 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
9270: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
9280: 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 31 2c 20  Op(v, OP_Ne, 1, 
9290: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
92a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
92b0: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
92c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
92d0: 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73           jumpIns
92e0: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  t = sqliteVdbeAd
92f0: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  dOp(v, OP_IfNot,
9300: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
9310: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
9320: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
9330: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
9340: 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  [i+1].pExpr);.  
9350: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9360: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
9370: 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61  , 0, expr_end_la
9380: 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 64  bel);.        ad
9390: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  dr = sqliteVdbeC
93a0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
93b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
93c0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75 6d  eChangeP2(v, jum
93d0: 70 49 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20 20  pInst, addr);.  
93e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
93f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
9400: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
9410: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
9420: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
9430: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
9440: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
9450: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
9460: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9470: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
9480: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9490: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
94a0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
94b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
94c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
94d0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78  solveLabel(v, ex
94e0: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20  pr_end_label);. 
94f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9500: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  }.    case TK_RA
9510: 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ISE: {.      if(
9520: 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   !pParse->trigSt
9530: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ack ){.        s
9540: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
9550: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
9570: 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
9580: 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
9590: 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
95a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
95b0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 09 72 65 74 75  e->nErr++;..retu
95c0: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
95d0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
95e0: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 52 6f 6c 6c 62  lumn == OE_Rollb
95f0: 61 63 6b 20 7c 7c 0a 09 20 20 70 45 78 70 72 2d  ack ||..  pExpr-
9600: 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41  >iColumn == OE_A
9610: 62 6f 72 74 20 7c 7c 0a 09 20 20 70 45 78 70 72  bort ||..  pExpr
9620: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
9630: 46 61 69 6c 20 29 7b 0a 09 20 20 63 68 61 72 20  Fail ){..  char 
9640: 2a 20 6d 73 67 20 3d 20 73 71 6c 69 74 65 53 74  * msg = sqliteSt
9650: 72 4e 44 75 70 28 70 45 78 70 72 2d 3e 74 6f 6b  rNDup(pExpr->tok
9660: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
9670: 65 6e 2e 6e 29 3b 0a 09 20 20 73 71 6c 69 74 65  en.n);..  sqlite
9680: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9690: 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  Halt, SQLITE_CON
96a0: 53 54 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e  STRAINT, pExpr->
96b0: 69 43 6f 6c 75 6d 6e 29 3b 0a 09 20 20 73 71 6c  iColumn);..  sql
96c0: 69 74 65 44 65 71 75 6f 74 65 28 6d 73 67 29 3b  iteDequote(msg);
96d0: 0a 09 20 20 73 71 6c 69 74 65 56 64 62 65 43 68  ..  sqliteVdbeCh
96e0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 6d 73  angeP3(v, -1, ms
96f0: 67 2c 20 30 29 3b 0a 09 20 20 73 71 6c 69 74 65  g, 0);..  sqlite
9700: 46 72 65 65 28 6d 73 67 29 3b 0a 20 20 20 20 20  Free(msg);.     
9710: 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 61 73 73   } else {..  ass
9720: 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
9730: 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65  umn == OE_Ignore
9740: 20 29 3b 0a 09 20 20 73 71 6c 69 74 65 56 64 62   );..  sqliteVdb
9750: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
9760: 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72  o, 0, pParse->tr
9770: 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a  igStack->ignoreJ
9780: 75 6d 70 29 3b 0a 09 20 20 73 71 6c 69 74 65 56  ump);..  sqliteV
9790: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
97a0: 31 2c 20 22 28 49 47 4e 4f 52 45 20 6a 75 6d 70  1, "(IGNORE jump
97b0: 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  )", 0);.      }.
97c0: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
97d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
97e0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
97f0: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
9800: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
9810: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
9820: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
9830: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
9840: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
9850: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
9860: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
9870: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
9880: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
9890: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
98a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
98b0: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
98c0: 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
98d0: 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
98e0: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
98f0: 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
9900: 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  flag is true..*/
9910: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
9920: 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
9930: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
9940: 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
9950: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
9960: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
9970: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
9980: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d  p = 0;.  if( v==
9990: 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
99a0: 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68  return;.  switch
99b0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
99c0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
99d0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b       op = OP_Lt;
99e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
99f0: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
9a00: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20      op = OP_Le; 
9a10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9a20: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
9a30: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20     op = OP_Gt;  
9a40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9a50: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
9a60: 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20    op = OP_Ge;   
9a70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9a80: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
9a90: 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20   op = OP_Ne;    
9aa0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9ab0: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20  se TK_EQ:       
9ac0: 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20  op = OP_Eq;     
9ad0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9ae0: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f  e TK_ISNULL:   o
9af0: 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20  p = OP_IsNull;  
9b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9b10: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70   TK_NOTNULL:  op
9b20: 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20   = OP_NotNull;  
9b30: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
9b40: 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  lt:  break;.  }.
9b50: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9b60: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
9b70: 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
9b80: 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 56  int d2 = sqliteV
9b90: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
9ba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
9bb0: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
9bc0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
9bd0: 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  2, !jumpIfNull);
9be0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
9bf0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
9c00: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
9c10: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
9c20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
9c30: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
9c40: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
9c50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9c60: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
9c70: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72    sqliteExprIfTr
9c80: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
9c90: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
9ca0: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
9cb0: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72    sqliteExprIfTr
9cc0: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
9cd0: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
9ce0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
9cf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9d00: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
9d10: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
9d20: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
9d30: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
9d40: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
9d50: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
9d60: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9d70: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
9d80: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
9d90: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
9da0: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
9db0: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
9dc0: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73  TK_EQ: {.      s
9dd0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
9de0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
9df0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
9e00: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
9e10: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
9e20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
9e30: 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  se->db->file_for
9e40: 6d 61 74 3e 3d 34 20 26 26 20 73 71 6c 69 74 65  mat>=4 && sqlite
9e50: 45 78 70 72 54 79 70 65 28 70 45 78 70 72 29 3d  ExprType(pExpr)=
9e60: 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20  =SQLITE_SO_TEXT 
9e70: 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 2b 3d  ){.        op +=
9e80: 20 36 3b 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20   6;  /* Convert 
9e90: 6e 75 6d 65 72 69 63 20 6f 70 63 6f 64 65 73 20  numeric opcodes 
9ea0: 74 6f 20 74 65 78 74 20 6f 70 63 6f 64 65 73 20  to text opcodes 
9eb0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
9ec0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9ed0: 28 76 2c 20 6f 70 2c 20 6a 75 6d 70 49 66 4e 75  (v, op, jumpIfNu
9ee0: 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ll, dest);.     
9ef0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9f00: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
9f10: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
9f20: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
9f30: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
9f40: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
9f50: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
9f60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
9f70: 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
9f80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9f90: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
9fa0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
9fb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
9fc0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
9fd0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
9fe0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
9ff0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
a000: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
a010: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a020: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
a030: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
a040: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a050: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
a060: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a070: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
a080: 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20  0, jumpIfNull ? 
a090: 64 65 73 74 20 3a 20 61 64 64 72 2b 34 29 3b 0a  dest : addr+4);.
a0a0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
a0b0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
a0c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a0d0: 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  dOp(v, OP_Found,
a0e0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
a0f0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
a100: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a110: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a120: 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_SetFound, pExp
a130: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29  r->iTable, dest)
a140: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a150: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a160: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
a170: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
a180: 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dr;.      sqlite
a190: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
a1a0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
a1b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a1c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
a1d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a1e0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
a1f0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
a200: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
a210: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
a220: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a230: 4f 50 5f 4c 74 2c 20 21 6a 75 6d 70 49 66 4e 75  OP_Lt, !jumpIfNu
a240: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ll, 0);.      sq
a250: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
a260: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
a270: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  t->a[1].pExpr);.
a280: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a290: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 65 2c 20  AddOp(v, OP_Le, 
a2a0: 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74  jumpIfNull, dest
a2b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
a2c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
a2d0: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
a2e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
a2f0: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
a300: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
a310: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
a320: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
a330: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
a340: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
a350: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
a360: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  lt: {.      sqli
a370: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
a380: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
a390: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a3a0: 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49  (v, OP_If, jumpI
a3b0: 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20  fNull, dest);.  
a3c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a3d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
a3e0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
a3f0: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
a400: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
a410: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
a420: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
a430: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
a440: 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
a450: 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
a460: 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
a470: 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
a480: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
a490: 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
a4a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
a4b0: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
a4c0: 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
a4d0: 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
a4e0: 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
a4f0: 6c 20 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c  l is true or fal
a500: 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
a510: 70 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65  pIfNull is false
a520: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a530: 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
a540: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
a550: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
a560: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
a570: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
a580: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
a590: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66  int op = 0;.  if
a5a0: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
a5b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
a5c0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
a5d0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
a5e0: 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LT:       op = O
a5f0: 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ge;       brea
a600: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
a610: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
a620: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
a630: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
a640: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
a650: 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Le;       break;
a660: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
a670: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c         op = OP_L
a680: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
a690: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
a6a0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
a6b0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
a6c0: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
a6d0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b       op = OP_Ne;
a6e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a6f0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
a700: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  :   op = OP_NotN
a710: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
a720: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
a730: 3a 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c  :  op = OP_IsNul
a740: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
a750: 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b  default:  break;
a760: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
a770: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
a780: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
a790: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
a7a0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
a7b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
a7c0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
a7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
a7e0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
a7f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
a800: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
a810: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a820: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a830: 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
a840: 20 64 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65   d2 = sqliteVdbe
a850: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
a860: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
a870: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
a880: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21  pr->pLeft, d2, !
a890: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
a8a0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 46     sqliteExprIfF
a8b0: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
a8c0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
a8d0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
a8e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
a8f0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
a900: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
a910: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a920: 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
a930: 73 71 6c 69 74 65 45 78 70 72 49 66 54 72 75 65  sqliteExprIfTrue
a940: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
a950: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
a960: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
a970: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a980: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
a990: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
a9a0: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
a9b0: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
a9c0: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
a9d0: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
a9e0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
a9f0: 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  >db->file_format
aa00: 3e 3d 34 20 26 26 20 73 71 6c 69 74 65 45 78 70  >=4 && sqliteExp
aa10: 72 54 79 70 65 28 70 45 78 70 72 29 3d 3d 53 51  rType(pExpr)==SQ
aa20: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a  LITE_SO_TEXT ){.
aa30: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
aa40: 72 74 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61  rt numeric compa
aa50: 72 69 73 6f 6e 20 6f 70 63 6f 64 65 73 20 69 6e  rison opcodes in
aa60: 74 6f 20 74 65 78 74 20 63 6f 6d 70 61 72 69 73  to text comparis
aa70: 6f 6e 20 6f 70 63 6f 64 65 73 2e 0a 20 20 20 20  on opcodes..    
aa80: 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 65 70      ** This step
aa90: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
aaa0: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 74 65  fact that the te
aab0: 78 74 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6f  xt comparision o
aac0: 70 63 6f 64 65 73 20 61 72 65 0a 20 20 20 20 20  pcodes are.     
aad0: 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 36 20 67     ** always 6 g
aae0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69  reater than thei
aaf0: 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
ab00: 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61 72 69 73  numeric comparis
ab10: 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 70  on.        ** op
ab20: 63 6f 64 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  codes..        *
ab30: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
ab40: 28 20 4f 50 5f 45 71 2b 36 20 3d 3d 20 4f 50 5f  ( OP_Eq+6 == OP_
ab50: 53 74 72 45 71 20 29 3b 0a 20 20 20 20 20 20 20  StrEq );.       
ab60: 20 6f 70 20 2b 3d 20 36 3b 0a 20 20 20 20 20 20   op += 6;.      
ab70: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  }.      sqliteEx
ab80: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
ab90: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
aba0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
abb0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
abc0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
abd0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
abe0: 28 76 2c 20 6f 70 2c 20 6a 75 6d 70 49 66 4e 75  (v, op, jumpIfNu
abf0: 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ll, dest);.     
ac00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ac10: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
ac20: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
ac30: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
ac40: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
ac50: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ac60: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
ac70: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
ac80: 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
ac90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
aca0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
acb0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
acc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
acd0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
ace0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
acf0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
ad00: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
ad10: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
ad20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ad30: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
ad40: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
ad50: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ad60: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
ad70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ad80: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
ad90: 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20  0, jumpIfNull ? 
ada0: 64 65 73 74 20 3a 20 61 64 64 72 2b 34 29 3b 0a  dest : addr+4);.
adb0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
adc0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
add0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ade0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
adf0: 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
ae00: 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  e, dest);.      
ae10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
ae20: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ae30: 2c 20 4f 50 5f 53 65 74 4e 6f 74 46 6f 75 6e 64  , OP_SetNotFound
ae40: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
ae50: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a   dest);.      }.
ae60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ae70: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
ae80: 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
ae90: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
aea0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
aeb0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
aec0: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
aed0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
aee0: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
aef0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
af00: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
af10: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
af20: 78 70 72 29 3b 0a 20 20 20 20 20 20 61 64 64 72  xpr);.      addr
af30: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72   = sqliteVdbeCur
af40: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
af50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
af60: 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 21 6a 75  Op(v, OP_Ge, !ju
af70: 6d 70 49 66 4e 75 6c 6c 2c 20 61 64 64 72 2b 33  mpIfNull, addr+3
af80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
af90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
afa0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
afb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
afc0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
afd0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
afe0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
aff0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
b000: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
b010: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b020: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 74 2c 20 6a  ddOp(v, OP_Gt, j
b030: 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29  umpIfNull, dest)
b040: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b050: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
b060: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b070: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b080: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
b090: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b0a0: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70  , OP_IfNot, jump
b0b0: 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20  IfNull, dest);. 
b0c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b0d0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
b0e0: 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
b0f0: 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
b100: 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
b110: 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a  turn TRUE (non-z
b120: 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20  ero).** if they 
b130: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
b140: 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69  d return FALSE i
b150: 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
b160: 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74   any way..*/.int
b170: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61   sqliteExprCompa
b180: 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
b190: 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b  r *pB){.  int i;
b1a0: 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a  .  if( pA==0 ){.
b1b0: 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 30      return pB==0
b1c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
b1d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
b1e0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
b1f0: 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20  A->op!=pB->op ) 
b200: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
b210: 21 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61  !sqliteExprCompa
b220: 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
b230: 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
b240: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
b250: 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  teExprCompare(pA
b260: 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
b270: 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30  ight) ) return 0
b280: 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73  ;.  if( pA->pLis
b290: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  t ){.    if( pB-
b2a0: 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  >pList==0 ) retu
b2b0: 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41  rn 0;.    if( pA
b2c0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
b2d0: 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pB->pList->nExpr
b2e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
b2f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
b300: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
b310: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73  +){.      if( !s
b320: 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65  qliteExprCompare
b330: 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  (pA->pList->a[i]
b340: 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73  .pExpr, pB->pLis
b350: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
b360: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
b370: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
b380: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  }.  }else if( pB
b390: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72  ->pList ){.    r
b3a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
b3b0: 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c  f( pA->pSelect |
b3c0: 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20  | pB->pSelect ) 
b3d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
b3e0: 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e  pA->iTable!=pB->
b3f0: 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43  iTable || pA->iC
b400: 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75  olumn!=pB->iColu
b410: 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  mn ) return 0;. 
b420: 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a   if( pA->token.z
b430: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e   ){.    if( pB->
b440: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74  token.z==0 ) ret
b450: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
b460: 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e  B->token.n!=pA->
b470: 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e  token.n ) return
b480: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
b490: 74 65 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74  teStrNICmp(pA->t
b4a0: 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65  oken.z, pB->toke
b4b0: 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e  n.z, pB->token.n
b4c0: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )!=0 ) return 0;
b4d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
b4e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
b4f0: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
b500: 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
b510: 5d 20 61 72 72 61 79 20 61 6e 64 20 72 65 74 75  ] array and retu
b520: 72 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2f  rn its index..*/
b530: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 65  .static int appe
b540: 6e 64 41 67 67 49 6e 66 6f 28 50 61 72 73 65 20  ndAggInfo(Parse 
b550: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
b560: 28 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 26 20  (pParse->nAgg & 
b570: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  0x7)==0 ){.    i
b580: 6e 74 20 61 6d 74 20 3d 20 70 50 61 72 73 65 2d  nt amt = pParse-
b590: 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20 20 41  >nAgg + 8;.    A
b5a0: 67 67 45 78 70 72 20 2a 61 41 67 67 20 3d 20 73  ggExpr *aAgg = s
b5b0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61  qliteRealloc(pPa
b5c0: 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73  rse->aAgg, amt*s
b5d0: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41  izeof(pParse->aA
b5e0: 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  gg[0]));.    if(
b5f0: 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20   aAgg==0 ){.    
b600: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
b610: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61   }.    pParse->a
b620: 41 67 67 20 3d 20 61 41 67 67 3b 0a 20 20 7d 0a  Agg = aAgg;.  }.
b630: 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65    memset(&pParse
b640: 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d 3e 6e  ->aAgg[pParse->n
b650: 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Agg], 0, sizeof(
b660: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29  pParse->aAgg[0])
b670: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  );.  return pPar
b680: 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f  se->nAgg++;.}../
b690: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
b6a0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
b6b0: 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
b6c0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
b6d0: 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
b6e0: 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
b6f0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
b700: 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
b710: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b  [] array..** Mak
b720: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  e additional ent
b730: 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72  ries to the pPar
b740: 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
b750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
b760: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b770: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
b780: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
b790: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
b7a0: 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
b7b0: 64 20 62 79 20 73 71 6c 69 74 65 45 78 70 72 52  d by sqliteExprR
b7c0: 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20  esolveIds() and 
b7d0: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
b7e0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f  )..**.** If erro
b7f0: 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61  rs are seen, lea
b800: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
b810: 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61  age in zErrMsg a
b820: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  nd return.** the
b830: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
b840: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
b850: 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
b860: 67 61 74 65 73 28 50 61 72 73 65 20 2a 70 50 61  gates(Parse *pPa
b870: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
b880: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41 67  ){.  int i;.  Ag
b890: 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20 20 69  gExpr *aAgg;.  i
b8a0: 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20  nt nErr = 0;..  
b8b0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
b8c0: 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63  eturn 0;.  switc
b8d0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
b8e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
b8f0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67 67  MN: {.      aAgg
b900: 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b   = pParse->aAgg;
b910: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b920: 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
b930: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
b940: 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ( aAgg[i].isAgg 
b950: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
b960: 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e      if( aAgg[i].
b970: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
b980: 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20  Expr->iTable.   
b990: 20 20 20 20 20 20 26 26 20 61 41 67 67 5b 69 5d        && aAgg[i]
b9a0: 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  .pExpr->iColumn=
b9b0: 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
b9c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
b9d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
b9e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b9f0: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  i>=pParse->nAgg 
ba00: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 61  ){.        i = a
ba10: 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61  ppendAggInfo(pPa
ba20: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
ba30: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31  ( i<0 ) return 1
ba40: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
ba50: 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ->aAgg[i].isAgg 
ba60: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
ba70: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
ba80: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
ba90: 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d    }.      pExpr-
baa0: 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
bab0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bac0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
bad0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
bae0: 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  aAgg = pParse->a
baf0: 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Agg;.      for(i
bb00: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
bb10: 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
bb20: 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d 2e 69    if( !aAgg[i].i
bb30: 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
bb40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
bb50: 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 61  iteExprCompare(a
bb60: 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  Agg[i].pExpr, pE
bb70: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
bb80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
bb90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
bba0: 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e   if( i>=pParse->
bbb0: 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  nAgg ){.        
bbc0: 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66  i = appendAggInf
bbd0: 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  o(pParse);.     
bbe0: 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74     if( i<0 ) ret
bbf0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70  urn 1;.        p
bc00: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
bc10: 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
bc20: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
bc30: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
bc40: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
bc50: 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20 3d  >aAgg[i].pFunc =
bc60: 20 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74   sqliteFindFunct
bc70: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
bc90: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
bca0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20  pr->token.n,.   
bcb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
bcc0: 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  >pList ? pExpr->
bcd0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
bce0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
bcf0: 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
bd00: 3d 20 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = i;.      break
bd10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
bd20: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ult: {.      if(
bd30: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
bd40: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
bd50: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
bd60: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
bd70: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
bd80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bd90: 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20   if( nErr==0 && 
bda0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
bdb0: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
bdc0: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
bdd0: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
bde0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
bdf0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
be00: 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26    if( nErr==0 &&
be10: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
be20: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
be30: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
be40: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Expr;.        in
be50: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
be60: 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26  (i=0; nErr==0 &&
be70: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
be80: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
be90: 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  iteExprAnalyzeAg
bea0: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
beb0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
bec0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
bed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bef0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
bf00: 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rr;.}../*.** Loc
bf10: 61 74 65 20 61 20 75 73 65 72 20 66 75 6e 63 74  ate a user funct
bf20: 69 6f 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d 65  ion given a name
bf30: 20 61 6e 64 20 61 20 6e 75 6d 62 65 72 20 6f 66   and a number of
bf40: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 52   arguments..** R
bf50: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
bf60: 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 73  to the FuncDef s
bf70: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
bf80: 66 69 6e 65 73 20 74 68 61 74 0a 2a 2a 20 66 75  fines that.** fu
bf90: 6e 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75 72  nction, or retur
bfa0: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 75  n NULL if the fu
bfb0: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
bfc0: 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  exist..**.** If 
bfd0: 74 68 65 20 63 72 65 61 74 65 46 6c 61 67 20 61  the createFlag a
bfe0: 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
bff0: 20 74 68 65 6e 20 61 20 6e 65 77 20 28 62 6c 61   then a new (bla
c000: 6e 6b 29 20 46 75 6e 63 44 65 66 0a 2a 2a 20 73  nk) FuncDef.** s
c010: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
c020: 74 65 64 20 61 6e 64 20 6c 69 6b 65 64 20 69 6e  ted and liked in
c030: 74 6f 20 74 68 65 20 22 64 62 22 20 73 74 72 75  to the "db" stru
c040: 63 74 75 72 65 20 69 66 20 61 0a 2a 2a 20 6e 6f  cture if a.** no
c050: 20 6d 61 74 63 68 69 6e 67 20 66 75 6e 63 74 69   matching functi
c060: 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78  on previously ex
c070: 69 73 74 65 64 2e 20 20 57 68 65 6e 20 63 72 65  isted.  When cre
c080: 61 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 0a  ateFlag is true.
c090: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 41 72 67 20  ** and the nArg 
c0a0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 2d 31 2c  parameter is -1,
c0b0: 20 74 68 65 6e 20 6f 6e 6c 79 20 61 20 66 75 6e   then only a fun
c0c0: 63 74 69 6f 6e 20 74 68 61 74 20 61 63 63 65 70  ction that accep
c0d0: 74 73 0a 2a 2a 20 61 6e 79 20 6e 75 6d 62 65 72  ts.** any number
c0e0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77 69   of arguments wi
c0f0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a  ll be returned..
c100: 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74 65 46  **.** If createF
c110: 6c 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64  lag is false and
c120: 20 6e 41 72 67 20 69 73 20 2d 31 2c 20 74 68 65   nArg is -1, the
c130: 6e 20 74 68 65 20 66 69 72 73 74 20 76 61 6c 69  n the first vali
c140: 64 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 6f  d.** function fo
c150: 75 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e  und is returned.
c160: 20 20 41 20 66 75 6e 63 74 69 6f 6e 20 69 73 20    A function is 
c170: 76 61 6c 69 64 20 69 66 20 65 69 74 68 65 72 20  valid if either 
c180: 78 46 75 6e 63 0a 2a 2a 20 6f 72 20 78 53 74 65  xFunc.** or xSte
c190: 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  p is non-zero..*
c1a0: 2f 0a 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74  /.FuncDef *sqlit
c1b0: 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a 20  eFindFunction(. 
c1c0: 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20   sqlite *db,    
c1d0: 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64      /* An open d
c1e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
c1f0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
c200: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
c210: 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e 75  unction.  Not nu
c220: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a 2f  ll-terminated */
c230: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20 20  .  int nName,   
c240: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c250: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
c260: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69   the name */.  i
c270: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
c280: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
c290: 72 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d 65  rguments.  -1 me
c2a0: 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72 20 2a  ans any number *
c2b0: 2f 0a 20 20 69 6e 74 20 63 72 65 61 74 65 46 6c  /.  int createFl
c2c0: 61 67 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ag     /* Create
c2d0: 20 6e 65 77 20 65 6e 74 72 79 20 69 66 20 74 72   new entry if tr
c2e0: 75 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ue and does not 
c2f0: 6f 74 68 65 72 77 69 73 65 20 65 78 69 73 74 20  otherwise exist 
c300: 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  */.){.  FuncDef 
c310: 2a 70 46 69 72 73 74 2c 20 2a 70 2c 20 2a 70 4d  *pFirst, *p, *pM
c320: 61 79 62 65 3b 0a 20 20 70 46 69 72 73 74 20 3d  aybe;.  pFirst =
c330: 20 70 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73   p = (FuncDef*)s
c340: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
c350: 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c  b->aFunc, zName,
c360: 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70   nName);.  if( p
c370: 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67 20   && !createFlag 
c380: 26 26 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20  && nArg<0 ){.   
c390: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
c3a0: 78 46 75 6e 63 3d 3d 30 20 26 26 20 70 2d 3e 78  xFunc==0 && p->x
c3b0: 53 74 65 70 3d 3d 30 20 29 7b 20 70 20 3d 20 70  Step==0 ){ p = p
c3c0: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 72  ->pNext; }.    r
c3d0: 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70  eturn p;.  }.  p
c3e0: 4d 61 79 62 65 20 3d 20 30 3b 0a 20 20 77 68 69  Maybe = 0;.  whi
c3f0: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 41 72 67  le( p && p->nArg
c400: 21 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66  !=nArg ){.    if
c410: 28 20 70 2d 3e 6e 41 72 67 3c 30 20 26 26 20 21  ( p->nArg<0 && !
c420: 63 72 65 61 74 65 46 6c 61 67 20 26 26 20 28 70  createFlag && (p
c430: 2d 3e 78 46 75 6e 63 20 7c 7c 20 70 2d 3e 78 53  ->xFunc || p->xS
c440: 74 65 70 29 20 29 20 70 4d 61 79 62 65 20 3d 20  tep) ) pMaybe = 
c450: 70 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  p;.    p = p->pN
c460: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
c470: 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67 20   && !createFlag 
c480: 26 26 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 26  && p->xFunc==0 &
c490: 26 20 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29 7b  & p->xStep==0 ){
c4a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c4b0: 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20 26 26   }.  if( p==0 &&
c4c0: 20 70 4d 61 79 62 65 20 29 7b 0a 20 20 20 20 61   pMaybe ){.    a
c4d0: 73 73 65 72 74 28 20 63 72 65 61 74 65 46 6c 61  ssert( createFla
c4e0: 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  g==0 );.    retu
c4f0: 72 6e 20 70 4d 61 79 62 65 3b 0a 20 20 7d 0a 20  rn pMaybe;.  }. 
c500: 20 69 66 28 20 70 3d 3d 30 20 26 26 20 63 72 65   if( p==0 && cre
c510: 61 74 65 46 6c 61 67 20 26 26 20 28 70 20 3d 20  ateFlag && (p = 
c520: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
c530: 65 6f 66 28 2a 70 29 29 29 21 3d 30 20 29 7b 0a  eof(*p)))!=0 ){.
c540: 20 20 20 20 70 2d 3e 6e 41 72 67 20 3d 20 6e 41      p->nArg = nA
c550: 72 67 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  rg;.    p->pNext
c560: 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 70   = pFirst;.    p
c570: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 70 46 69  ->dataType = pFi
c580: 72 73 74 20 3f 20 70 46 69 72 73 74 2d 3e 64 61  rst ? pFirst->da
c590: 74 61 54 79 70 65 20 3a 20 53 51 4c 49 54 45 5f  taType : SQLITE_
c5a0: 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 73 71 6c  NUMERIC;.    sql
c5b0: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
c5c0: 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c  b->aFunc, zName,
c5d0: 20 6e 4e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 70   nName, (void*)p
c5e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c5f0: 70 3b 0a 7d 0a                                   p;.}.