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

Artifact 61b71ce2e93b0faca39db9e9c06e9a089d25a04f:


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 31 20 32 30 30 34 2f 30 32 2f 32 32 20  .111 2004/02/22 
0220: 32 30 3a 30 35 3a 30 31 20 64 72 68 20 45 78 70  20:05:01 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 3b 0a 20 20 20     int addr;.   
58d0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
58e0: 74 28 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e 7a 20  t( pE2->token.z 
58f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
5900: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
5910: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 49  beOp3(v, OP_SetI
5920: 6e 73 65 72 74 2c 20 69 53 65 74 2c 20 30 2c 0a  nsert, iSet, 0,.
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5950: 20 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20    pE2->token.z, 
5960: 70 45 32 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  pE2->token.n);. 
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
5980: 69 74 65 56 64 62 65 44 65 71 75 6f 74 65 50 33  iteVdbeDequoteP3
5990: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
59a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
59c0: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
59d0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t: {.           
59e0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
59f0: 65 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a  e(pParse, pE2);.
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
5a10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5a20: 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 69   OP_SetInsert, i
5a30: 53 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Set, 0);.       
5a40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5a50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5a70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5a80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5a90: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
5aa0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  : {.      /* Thi
5ab0: 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
5ac0: 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
5ad0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
5ae0: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
5af0: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
5b00: 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
5b10: 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
5b20: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
5b30: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
5b40: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
5b50: 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  mn..      */.   
5b60: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
5b70: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n = pParse->nMem
5b80: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ++;.      if( sq
5b90: 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73  liteSelect(pPars
5ba0: 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  e, pExpr->pSelec
5bb0: 74 2c 20 53 52 54 5f 4d 65 6d 2c 20 70 45 78 70  t, SRT_Mem, pExp
5bc0: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 30 2c 30 2c 30  r->iColumn,0,0,0
5bd0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
5be0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
5bf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5c00: 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6c  }..    /* For al
5c10: 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20 72 65 63  l else, just rec
5c20: 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 74 68  ursively walk th
5c30: 65 20 74 72 65 65 20 2a 2f 0a 20 20 20 20 64 65  e tree */.    de
5c40: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
5c50: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a  f( pExpr->pLeft.
5c60: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 45        && sqliteE
5c70: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
5c80: 61 72 73 65 2c 20 70 53 72 63 4c 69 73 74 2c 20  arse, pSrcList, 
5c90: 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70  pEList, pExpr->p
5ca0: 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
5cb0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
5cc0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
5cd0: 70 72 2d 3e 70 52 69 67 68 74 20 0a 20 20 20 20  pr->pRight .    
5ce0: 20 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 52    && sqliteExprR
5cf0: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
5d00: 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69  , pSrcList, pELi
5d10: 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  st, pExpr->pRigh
5d20: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  t) ){.        re
5d30: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
5d40: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
5d50: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
5d60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
5d70: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
5d80: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
5d90: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
5da0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
5db0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5dc0: 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20 70    Expr *pArg = p
5dd0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
5de0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5df0: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
5e00: 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 53 72  eIds(pParse, pSr
5e10: 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  cList, pEList, p
5e20: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Arg) ){.        
5e30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
5e40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5e50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5e60: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
5e70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
5e80: 20 69 73 20 61 20 6e 6f 64 65 20 74 68 61 74 20   is a node that 
5e90: 64 65 66 69 6e 65 73 20 61 20 66 75 6e 63 74 69  defines a functi
5ea0: 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  on of some kind.
5eb0: 20 20 49 74 20 6d 69 67 68 74 0a 2a 2a 20 62 65    It might.** be
5ec0: 20 61 20 73 79 6e 74 61 63 74 69 63 20 66 75 6e   a syntactic fun
5ed0: 63 74 69 6f 6e 20 6c 69 6b 65 20 22 63 6f 75 6e  ction like "coun
5ee0: 74 28 78 29 22 20 6f 72 20 69 74 20 6d 69 67 68  t(x)" or it migh
5ef0: 74 20 62 65 20 61 20 66 75 6e 63 74 69 6f 6e 0a  t be a function.
5f00: 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ** that implemen
5f10: 74 73 20 61 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ts an operator, 
5f20: 6c 69 6b 65 20 22 61 20 4c 49 4b 45 20 62 22 2e  like "a LIKE b".
5f30: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
5f40: 75 74 69 6e 65 20 6d 61 6b 65 73 20 2a 70 7a 4e  utine makes *pzN
5f50: 61 6d 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ame point to the
5f60: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e   name of the fun
5f70: 63 74 69 6f 6e 20 61 6e 64 20 0a 2a 2a 20 2a 70  ction and .** *p
5f80: 6e 4e 61 6d 65 20 68 6f 6c 64 20 74 68 65 20 6e  nName hold the n
5f90: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
5fa0: 65 72 73 20 69 6e 20 74 68 65 20 66 75 6e 63 74  ers in the funct
5fb0: 69 6f 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ion name..*/.sta
5fc0: 74 69 63 20 76 6f 69 64 20 67 65 74 46 75 6e 63  tic void getFunc
5fd0: 74 69 6f 6e 4e 61 6d 65 28 45 78 70 72 20 2a 70  tionName(Expr *p
5fe0: 45 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  Expr, const char
5ff0: 20 2a 2a 70 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a   **pzName, int *
6000: 70 6e 4e 61 6d 65 29 7b 0a 20 20 73 77 69 74 63  pnName){.  switc
6010: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
6020: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
6030: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2a 70  TION: {.      *p
6040: 7a 4e 61 6d 65 20 3d 20 70 45 78 70 72 2d 3e 74  zName = pExpr->t
6050: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 2a 70  oken.z;.      *p
6060: 6e 4e 61 6d 65 20 3d 20 70 45 78 70 72 2d 3e 74  nName = pExpr->t
6070: 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 62 72  oken.n;.      br
6080: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6090: 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 20 7b 0a 20  ase TK_LIKE: {. 
60a0: 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22       *pzName = "
60b0: 6c 69 6b 65 22 3b 0a 20 20 20 20 20 20 2a 70 6e  like";.      *pn
60c0: 4e 61 6d 65 20 3d 20 34 3b 0a 20 20 20 20 20 20  Name = 4;.      
60d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
60e0: 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b   case TK_GLOB: {
60f0: 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d  .      *pzName =
6100: 20 22 67 6c 6f 62 22 3b 0a 20 20 20 20 20 20 2a   "glob";.      *
6110: 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20 20 20 20  pnName = 4;.    
6120: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6130: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
6140: 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 63      *pzName = "c
6150: 61 6e 27 74 20 68 61 70 70 65 6e 22 3b 0a 20 20  an't happen";.  
6160: 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 32      *pnName = 12
6170: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6180: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
6190: 2a 20 45 72 72 6f 72 20 63 68 65 63 6b 20 74 68  * Error check th
61a0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 61  e functions in a
61b0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4d  n expression.  M
61c0: 61 6b 65 20 73 75 72 65 20 61 6c 6c 0a 2a 2a 20  ake sure all.** 
61d0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61  function names a
61e0: 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e  re recognized an
61f0: 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 20  d all functions 
6200: 68 61 76 65 20 74 68 65 20 63 6f 72 72 65 63 74  have the correct
6210: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  .** number of ar
6220: 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20  guments.  Leave 
6230: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
6240: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
6250: 4d 73 67 0a 2a 2a 20 69 66 20 61 6e 79 74 68 69  Msg.** if anythi
6260: 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65  ng is amiss.  Re
6270: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
6280: 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
6290: 20 69 66 20 70 49 73 41 67 67 20 69 73 20 6e 6f   if pIsAgg is no
62a0: 74 20 6e 75 6c 6c 20 61 6e 64 20 74 68 69 73 20  t null and this 
62b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
62c0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
62d0: 69 6f 6e 0a 2a 2a 20 28 6c 69 6b 65 20 63 6f 75  ion.** (like cou
62e0: 6e 74 28 2a 29 20 6f 72 20 6d 61 78 28 76 61 6c  nt(*) or max(val
62f0: 75 65 29 29 20 74 68 65 6e 20 77 72 69 74 65 20  ue)) then write 
6300: 61 20 31 20 69 6e 74 6f 20 2a 70 49 73 41 67 67  a 1 into *pIsAgg
6310: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45  ..*/.int sqliteE
6320: 78 70 72 43 68 65 63 6b 28 50 61 72 73 65 20 2a  xprCheck(Parse *
6330: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
6340: 78 70 72 2c 20 69 6e 74 20 61 6c 6c 6f 77 41 67  xpr, int allowAg
6350: 67 2c 20 69 6e 74 20 2a 70 49 73 41 67 67 29 7b  g, int *pIsAgg){
6360: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
6370: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
6380: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77  ) return 0;.  sw
6390: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
63a0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  ){.    case TK_G
63b0: 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LOB:.    case TK
63c0: 5f 4c 49 4b 45 3a 0a 20 20 20 20 63 61 73 65 20  _LIKE:.    case 
63d0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
63e0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78       int n = pEx
63f0: 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70  pr->pList ? pExp
6400: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
6410: 3a 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  : 0;  /* Number 
6420: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
6430: 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63        int no_suc
6440: 68 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20  h_func = 0;     
6450: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20    /* True if no 
6460: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78  such function ex
6470: 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ists */.      in
6480: 74 20 69 73 5f 74 79 70 65 5f 6f 66 20 3d 20 30  t is_type_of = 0
6490: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
64a0: 65 20 69 66 20 69 73 20 74 68 65 20 73 70 65 63  e if is the spec
64b0: 69 61 6c 20 54 79 70 65 4f 66 28 29 20 66 75 6e  ial TypeOf() fun
64c0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
64d0: 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67  nt wrong_num_arg
64e0: 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  s = 0;     /* Tr
64f0: 75 65 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62  ue if wrong numb
6500: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
6510: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f  */.      int is_
6520: 61 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  agg = 0;        
6530: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6540: 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
6550: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
6560: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
6570: 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20  nt nId;         
6580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6590: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
65a0: 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e  rs in function n
65b0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ame */.      con
65c0: 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
65d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
65e0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a  function name. *
65f0: 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  /.      FuncDef 
6600: 2a 70 44 65 66 3b 0a 0a 20 20 20 20 20 20 67 65  *pDef;..      ge
6610: 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 70 45  tFunctionName(pE
6620: 78 70 72 2c 20 26 7a 49 64 2c 20 26 6e 49 64 29  xpr, &zId, &nId)
6630: 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
6640: 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74 69 6f  qliteFindFunctio
6650: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49  n(pParse->db, zI
6660: 64 2c 20 6e 49 64 2c 20 6e 2c 20 30 29 3b 0a 20  d, nId, n, 0);. 
6670: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
6680: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
6690: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 46 75 6e   = sqliteFindFun
66a0: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
66b0: 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20  , zId, nId, -1, 
66c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
66d0: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
66e0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26       if( n==1 &&
66f0: 20 6e 49 64 3d 3d 36 20 26 26 20 73 71 6c 69 74   nId==6 && sqlit
6700: 65 53 74 72 4e 49 43 6d 70 28 7a 49 64 2c 20 22  eStrNICmp(zId, "
6710: 74 79 70 65 6f 66 22 2c 20 36 29 3d 3d 30 20 29  typeof", 6)==0 )
6720: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  {.            is
6730: 5f 74 79 70 65 5f 6f 66 20 3d 20 31 3b 0a 20 20  _type_of = 1;.  
6740: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 7b 0a          }else {.
6750: 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73              no_s
6760: 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20  uch_func = 1;.  
6770: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6790: 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67     wrong_num_arg
67a0: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  s = 1;.        }
67b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
67c0: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70        is_agg = p
67d0: 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20  Def->xFunc==0;. 
67e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
67f0: 20 69 73 5f 61 67 67 20 26 26 20 21 61 6c 6c 6f   is_agg && !allo
6800: 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  wAgg ){.        
6810: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
6820: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
6830: 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  f aggregate func
6840: 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49  tion %.*s()", nI
6850: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
6860: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
6870: 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20   is_agg = 0;.   
6880: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f     }else if( no_
6890: 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20  such_func ){.   
68a0: 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72       sqliteError
68b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
68c0: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25  such function: %
68d0: 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b  .*s", nId, zId);
68e0: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  .        nErr++;
68f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6900: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
6910: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6920: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
6930: 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  ,"wrong number o
6940: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
6950: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
6960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 49  .             nI
6970: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
6980: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d   nErr++;.      }
6990: 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67  .      if( is_ag
69a0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  g ){.        pEx
69b0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
69c0: 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20  FUNCTION;.      
69d0: 20 20 69 66 28 20 70 49 73 41 67 67 20 29 20 2a    if( pIsAgg ) *
69e0: 70 49 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  pIsAgg = 1;.    
69f0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
6a00: 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c  0; nErr==0 && i<
6a10: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
6a20: 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78   nErr = sqliteEx
6a30: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
6a40: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
6a50: 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20  i].pExpr,.      
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 41 67           allowAg
6a80: 67 20 26 26 20 21 69 73 5f 61 67 67 2c 20 70 49  g && !is_agg, pI
6a90: 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sAgg);.      }. 
6aa0: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
6ab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
6ac0: 69 73 5f 74 79 70 65 5f 6f 66 20 29 7b 0a 20 20  is_type_of ){.  
6ad0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
6ae0: 70 20 3d 20 54 4b 5f 53 54 52 49 4e 47 3b 0a 20  p = TK_STRING;. 
6af0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
6b00: 69 74 65 45 78 70 72 54 79 70 65 28 70 45 78 70  iteExprType(pExp
6b10: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
6b20: 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  Expr)==SQLITE_SO
6b30: 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  _NUM ){.        
6b40: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
6b50: 2e 7a 20 3d 20 22 6e 75 6d 65 72 69 63 22 3b 0a  .z = "numeric";.
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
6b70: 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 37 3b 0a  r->token.n = 7;.
6b80: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
6b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
6ba0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22 74  pr->token.z = "t
6bb0: 65 78 74 22 3b 0a 20 20 20 20 20 20 20 20 20 20  ext";.          
6bc0: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e    pExpr->token.n
6bd0: 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20   = 4;.          
6be0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
6bf0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 66    }else if( pDef
6c00: 2d 3e 64 61 74 61 54 79 70 65 3e 3d 30 20 29 7b  ->dataType>=0 ){
6c10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65  .        if( pDe
6c20: 66 2d 3e 64 61 74 61 54 79 70 65 3c 6e 20 29 7b  f->dataType<n ){
6c30: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
6c40: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 0a 20 20  ->dataType = .  
6c50: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6c60: 65 45 78 70 72 54 79 70 65 28 70 45 78 70 72 2d  eExprType(pExpr-
6c70: 3e 70 4c 69 73 74 2d 3e 61 5b 70 44 65 66 2d 3e  >pList->a[pDef->
6c80: 64 61 74 61 54 79 70 65 5d 2e 70 45 78 70 72 29  dataType].pExpr)
6c90: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
6ca0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
6cb0: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c  ->dataType = SQL
6cc0: 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20  ITE_SO_NUM;.    
6cd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6ce0: 65 20 69 66 28 20 70 44 65 66 2d 3e 64 61 74 61  e if( pDef->data
6cf0: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 41 52 47  Type==SQLITE_ARG
6d00: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  S ){.        pDe
6d10: 66 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51  f->dataType = SQ
6d20: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20  LITE_SO_TEXT;.  
6d30: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
6d40: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
6d50: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
6d60: 70 72 54 79 70 65 28 70 45 78 70 72 2d 3e 70 4c  prType(pExpr->pL
6d70: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
6d80: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20  ==SQLITE_SO_NUM 
6d90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
6da0: 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d  Expr->dataType =
6db0: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a   SQLITE_SO_NUM;.
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
6dd0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
6de0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6df0: 65 6c 73 65 20 69 66 28 20 70 44 65 66 2d 3e 64  else if( pDef->d
6e00: 61 74 61 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ataType==SQLITE_
6e10: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
6e20: 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79     pExpr->dataTy
6e30: 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e  pe = SQLITE_SO_N
6e40: 55 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  UM;.      }else{
6e50: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
6e60: 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c 49 54  dataType = SQLIT
6e70: 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20  E_SO_TEXT;.     
6e80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66   }.    }.    def
6e90: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  ault: {.      if
6ea0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
6eb0: 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d  {.        nErr =
6ec0: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
6ed0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
6ee0: 70 4c 65 66 74 2c 20 61 6c 6c 6f 77 41 67 67 2c  pLeft, allowAgg,
6ef0: 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20   pIsAgg);.      
6f00: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72  }.      if( nErr
6f10: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
6f20: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
6f30: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70  nErr = sqliteExp
6f40: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
6f50: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 6c  Expr->pRight, al
6f60: 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b  lowAgg, pIsAgg);
6f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6f80: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
6f90: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
6fa0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45        int n = pE
6fb0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
6fc0: 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  r;.        int i
6fd0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
6fe0: 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c  0; nErr==0 && i<
6ff0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
7000: 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
7010: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
7020: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
7030: 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65     nErr = sqlite
7040: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
7050: 2c 20 70 45 32 2c 20 61 6c 6c 6f 77 41 67 67 2c  , pE2, allowAgg,
7060: 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20   pIsAgg);.      
7070: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7080: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7090: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
70a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
70b0: 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  n either SQLITE_
70c0: 53 4f 5f 4e 55 4d 20 6f 72 20 53 51 4c 49 54 45  SO_NUM or SQLITE
70d0: 5f 53 4f 5f 54 45 58 54 20 74 6f 20 69 6e 64 69  _SO_TEXT to indi
70e0: 63 61 74 65 20 77 68 65 74 68 65 72 20 74 68 65  cate whether the
70f0: 0a 2a 2a 20 67 69 76 65 6e 20 65 78 70 72 65 73  .** given expres
7100: 73 69 6f 6e 20 73 68 6f 75 6c 64 20 73 6f 72 74  sion should sort
7110: 20 61 73 20 6e 75 6d 65 72 69 63 20 76 61 6c 75   as numeric valu
7120: 65 73 20 6f 72 20 61 73 20 74 65 78 74 2e 0a 2a  es or as text..*
7130: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 45  *.** The sqliteE
7140: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 29 20  xprResolveIds() 
7150: 61 6e 64 20 73 71 6c 69 74 65 45 78 70 72 43 68  and sqliteExprCh
7160: 65 63 6b 28 29 20 72 6f 75 74 69 6e 65 73 20 6d  eck() routines m
7170: 75 73 74 20 68 61 76 65 0a 2a 2a 20 62 6f 74 68  ust have.** both
7180: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
7190: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 62  the expression b
71a0: 65 66 6f 72 65 20 69 74 20 69 73 20 70 61 73 73  efore it is pass
71b0: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
71c0: 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
71d0: 65 45 78 70 72 54 79 70 65 28 45 78 70 72 20 2a  eExprType(Expr *
71e0: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
71f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53   return SQLITE_S
7200: 4f 5f 4e 55 4d 3b 0a 20 20 77 68 69 6c 65 28 20  O_NUM;.  while( 
7210: 70 20 29 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  p ) switch( p->o
7220: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
7230: 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
7240: 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61  TK_MINUS:.    ca
7250: 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
7260: 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
7270: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
7280: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
7290: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
72a0: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
72b0: 4e 4f 54 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  NOTNULL:.    cas
72c0: 65 20 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61  e TK_NOT:.    ca
72d0: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 0a 20 20  se TK_UMINUS:.  
72e0: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
72f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
7300: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
7310: 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
7320: 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20   TK_BITNOT:.    
7330: 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
7340: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
7350: 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
7360: 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
7370: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
7380: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
7390: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20   case TK_IN:.   
73a0: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
73b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c  :.    case TK_GL
73c0: 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OB:.    case TK_
73d0: 4c 49 4b 45 3a 0a 20 20 20 20 20 20 72 65 74 75  LIKE:.      retu
73e0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  rn SQLITE_SO_NUM
73f0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  ;..    case TK_S
7400: 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20  TRING:.    case 
7410: 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  TK_NULL:.    cas
7420: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 0a 20 20 20  e TK_CONCAT:.   
7430: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
7440: 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  E:.      return 
7450: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
7460: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
7470: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
7480: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
7490: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
74a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
74b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
74c0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
74d0: 65 45 78 70 72 54 79 70 65 28 70 2d 3e 70 4c 65  eExprType(p->pLe
74e0: 66 74 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e  ft)==SQLITE_SO_N
74f0: 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  UM ){.        re
7500: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e  turn SQLITE_SO_N
7510: 55 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  UM;.      }.    
7520: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
7530: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
7540: 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 0a 20     case TK_AS:. 
7550: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
7560: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
7570: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
7580: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
7590: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
75a0: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
75b0: 49 4f 4e 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ION:.      retur
75c0: 6e 20 70 2d 3e 64 61 74 61 54 79 70 65 3b 0a 0a  n p->dataType;..
75d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
75e0: 43 54 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  CT:.      assert
75f0: 28 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  ( p->pSelect );.
7600: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
7610: 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  >pSelect->pEList
7620: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
7630: 28 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45  ( p->pSelect->pE
7640: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
7650: 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 53  .      p = p->pS
7660: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
7670: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
7680: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
7690: 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20  e TK_CASE: {.   
76a0: 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
76b0: 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 54 79   && sqliteExprTy
76c0: 70 65 28 70 2d 3e 70 52 69 67 68 74 29 3d 3d 53  pe(p->pRight)==S
76d0: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a  QLITE_SO_NUM ){.
76e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
76f0: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20  QLITE_SO_NUM;.  
7700: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7710: 70 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  p->pList ){.    
7720: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
7730: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
7740: 73 74 20 3d 20 70 2d 3e 70 4c 69 73 74 3b 0a 20  st = p->pList;. 
7750: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
7760: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
7770: 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20  i+=2){.         
7780: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 54   if( sqliteExprT
7790: 79 70 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ype(pList->a[i].
77a0: 70 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53  pExpr)==SQLITE_S
77b0: 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  O_NUM ){.       
77c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
77d0: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20  TE_SO_NUM;.     
77e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
77f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
7800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
7810: 54 45 58 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  TEXT;.    }..   
7820: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
7830: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
7840: 4b 5f 41 42 4f 52 54 20 29 3b 20 20 2f 2a 20 43  K_ABORT );  /* C
7850: 61 6e 27 74 20 48 61 70 70 65 6e 20 2a 2f 0a 20  an't Happen */. 
7860: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
7870: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7880: 53 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  SO_NUM;.}../*.**
7890: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
78a0: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
78b0: 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
78c0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
78d0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61  pression and lea
78e0: 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e  ve the result on
78f0: 20 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63   the top of stac
7900: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
7910: 65 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  eExprCode(Parse 
7920: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7930: 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76  Expr){.  Vdbe *v
7940: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
7950: 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66  ;.  int op;.  if
7960: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
7970: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
7980: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
7990: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
79a0: 50 4c 55 53 3a 20 20 20 20 20 6f 70 20 3d 20 4f  PLUS:     op = O
79b0: 50 5f 41 64 64 3b 20 20 20 20 20 20 62 72 65 61  P_Add;      brea
79c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  k;.    case TK_M
79d0: 49 4e 55 53 3a 20 20 20 20 6f 70 20 3d 20 4f 50  INUS:    op = OP
79e0: 5f 53 75 62 74 72 61 63 74 3b 20 62 72 65 61 6b  _Subtract; break
79f0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
7a00: 41 52 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  AR:     op = OP_
7a10: 4d 75 6c 74 69 70 6c 79 3b 20 62 72 65 61 6b 3b  Multiply; break;
7a20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
7a30: 53 48 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44  SH:    op = OP_D
7a40: 69 76 69 64 65 3b 20 20 20 62 72 65 61 6b 3b 0a  ivide;   break;.
7a50: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
7a60: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 6e        op = OP_An
7a70: 64 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  d;      break;. 
7a80: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20     case TK_OR:  
7a90: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 72 3b       op = OP_Or;
7aa0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7ab0: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20    case TK_LT:   
7ac0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20      op = OP_Lt; 
7ad0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7ae0: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20   case TK_LE:    
7af0: 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20     op = OP_Le;  
7b00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7b10: 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20  case TK_GT:     
7b20: 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20    op = OP_Gt;   
7b30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
7b40: 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20  ase TK_GE:      
7b50: 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20   op = OP_Ge;    
7b60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
7b70: 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20  se TK_NE:       
7b80: 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20  op = OP_Ne;     
7b90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7ba0: 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f  e TK_EQ:       o
7bb0: 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20  p = OP_Eq;      
7bc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7bd0: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70   TK_ISNULL:   op
7be0: 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20   = OP_IsNull;   
7bf0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7c00: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20  TK_NOTNULL:  op 
7c10: 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62  = OP_NotNull;  b
7c20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
7c30: 4b 5f 4e 4f 54 3a 20 20 20 20 20 20 6f 70 20 3d  K_NOT:      op =
7c40: 20 4f 50 5f 4e 6f 74 3b 20 20 20 20 20 20 62 72   OP_Not;      br
7c50: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7c60: 5f 55 4d 49 4e 55 53 3a 20 20 20 6f 70 20 3d 20  _UMINUS:   op = 
7c70: 4f 50 5f 4e 65 67 61 74 69 76 65 3b 20 62 72 65  OP_Negative; bre
7c80: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7c90: 42 49 54 41 4e 44 3a 20 20 20 6f 70 20 3d 20 4f  BITAND:   op = O
7ca0: 50 5f 42 69 74 41 6e 64 3b 20 20 20 62 72 65 61  P_BitAnd;   brea
7cb0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
7cc0: 49 54 4f 52 3a 20 20 20 20 6f 70 20 3d 20 4f 50  ITOR:    op = OP
7cd0: 5f 42 69 74 4f 72 3b 20 20 20 20 62 72 65 61 6b  _BitOr;    break
7ce0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
7cf0: 54 4e 4f 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  TNOT:   op = OP_
7d00: 42 69 74 4e 6f 74 3b 20 20 20 62 72 65 61 6b 3b  BitNot;   break;
7d10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
7d20: 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53  IFT:   op = OP_S
7d30: 68 69 66 74 4c 65 66 74 3b 20 20 62 72 65 61 6b  hiftLeft;  break
7d40: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  ;.    case TK_RS
7d50: 48 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  HIFT:   op = OP_
7d60: 53 68 69 66 74 52 69 67 68 74 3b 20 62 72 65 61  ShiftRight; brea
7d70: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
7d80: 45 4d 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  EM:      op = OP
7d90: 5f 52 65 6d 61 69 6e 64 65 72 3b 20 20 62 72 65  _Remainder;  bre
7da0: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
7db0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77   break;.  }.  sw
7dc0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
7dd0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ){.    case TK_C
7de0: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
7df0: 66 28 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67  f( pParse->useAg
7e00: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
7e10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7e20: 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 45  OP_AggGet, 0, pE
7e30: 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20  xpr->iAgg);.    
7e40: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
7e50: 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  r->iColumn>=0 ){
7e60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
7e70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
7e80: 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54  olumn, pExpr->iT
7e90: 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
7ea0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
7eb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
7ec0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7ed0: 50 5f 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e  P_Recno, pExpr->
7ee0: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
7ef0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7f00: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7f10: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63  TK_STRING:.    c
7f20: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
7f30: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
7f40: 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  R: {.      if( p
7f50: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Expr->op==TK_INT
7f60: 45 47 45 52 20 26 26 20 73 71 6c 69 74 65 46 69  EGER && sqliteFi
7f70: 74 73 49 6e 33 32 42 69 74 73 28 70 45 78 70 72  tsIn32Bits(pExpr
7f80: 2d 3e 74 6f 6b 65 6e 2e 7a 29 20 29 7b 0a 20 20  ->token.z) ){.  
7f90: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7fa0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
7fb0: 67 65 72 2c 20 61 74 6f 69 28 70 45 78 70 72 2d  ger, atoi(pExpr-
7fc0: 3e 74 6f 6b 65 6e 2e 7a 29 2c 20 30 29 3b 0a 20  >token.z), 0);. 
7fd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7fe0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7ff0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
8000: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
8010: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8020: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b  Expr->token.z );
8030: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8040: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
8050: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
8060: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
8070: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8080: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d  beDequoteP3(v, -
8090: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
80a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
80b0: 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
80c0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
80d0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
80e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
80f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8100: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
8110: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8120: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 61 72  eAddOp(v, OP_Var
8130: 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54  iable, pExpr->iT
8140: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
8150: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8160: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
8170: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
8180: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
8190: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
81a0: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
81b0: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
81c0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
81d0: 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  >db->file_format
81e0: 3e 3d 34 20 26 26 20 73 71 6c 69 74 65 45 78 70  >=4 && sqliteExp
81f0: 72 54 79 70 65 28 70 45 78 70 72 29 3d 3d 53 51  rType(pExpr)==SQ
8200: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a  LITE_SO_TEXT ){.
8210: 20 20 20 20 20 20 20 20 6f 70 20 2b 3d 20 36 3b          op += 6;
8220: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d    /* Convert num
8230: 65 72 69 63 20 6f 70 63 6f 64 65 73 20 74 6f 20  eric opcodes to 
8240: 74 65 78 74 20 6f 70 63 6f 64 65 73 20 2a 2f 0a  text opcodes */.
8250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
8260: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e   Fall through in
8270: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
8280: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
8290: 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
82a0: 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
82b0: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
82c0: 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
82d0: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
82e0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
82f0: 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
8300: 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
8310: 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
8320: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 7b 0a 20  se TK_SLASH: {. 
8330: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
8340: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
8350: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
8360: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
8370: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
8380: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71  Right);.      sq
8390: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
83a0: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
83b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
83c0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
83d0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
83e0: 53 48 49 46 54 3a 20 7b 0a 20 20 20 20 20 20 73  SHIFT: {.      s
83f0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
8400: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
8410: 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ght);.      sqli
8420: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
8430: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
8440: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8450: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
8460: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
8470: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8480: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
8490: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
84a0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
84b0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
84c0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
84d0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
84e0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71  Right);.      sq
84f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8500: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c 20 30   OP_Concat, 2, 0
8510: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8520: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8530: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
8540: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
8550: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
8560: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
8570: 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c  ->op==TK_FLOAT |
8580: 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  | pExpr->pLeft->
8590: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
85a0: 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20  {.        Token 
85b0: 2a 70 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65  *p = &pExpr->pLe
85c0: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
85d0: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c     char *z = sql
85e0: 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 20  iteMalloc( p->n 
85f0: 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 2 );.        s
8600: 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a 73  printf(z, "-%.*s
8610: 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a  ", p->n, p->z);.
8620: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
8630: 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
8640: 5f 49 4e 54 45 47 45 52 20 26 26 20 73 71 6c 69  _INTEGER && sqli
8650: 74 65 46 69 74 73 49 6e 33 32 42 69 74 73 28 7a  teFitsIn32Bits(z
8660: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
8670: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8680: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 61 74  , OP_Integer, at
8690: 6f 69 28 7a 29 2c 20 30 29 3b 0a 20 20 20 20 20  oi(z), 0);.     
86a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
86b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
86c0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
86d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
86e0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
86f0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
8700: 20 2d 31 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b   -1, z, p->n+1);
8710: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
8720: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  ree(z);.        
8730: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8740: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
8750: 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54  ough into TK_NOT
8760: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
8770: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
8780: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
8790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
87a0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
87b0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
87c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
87d0: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b  Op(v, op, 0, 0);
87e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
87f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8800: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
8810: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
8820: 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20       int dest;. 
8830: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8840: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
8850: 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  er, 1, 0);.     
8860: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
8870: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
8880: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73  Left);.      des
8890: 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75  t = sqliteVdbeCu
88a0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32  rrentAddr(v) + 2
88b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
88c0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
88d0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
88e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
88f0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c  , OP_AddImm, -1,
8900: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
8910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8920: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
8930: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
8940: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8950: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
8960: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 62  ->iAgg);.      b
8970: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8980: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20  case TK_GLOB:.  
8990: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a    case TK_LIKE:.
89a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
89b0: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TION: {.      in
89c0: 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  t i;.      ExprL
89d0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
89e0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
89f0: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69   int nExpr = pLi
8a00: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
8a10: 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e  r : 0;.      Fun
8a20: 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
8a30: 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20    int nId;.     
8a40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
8a50: 3b 0a 20 20 20 20 20 20 67 65 74 46 75 6e 63 74  ;.      getFunct
8a60: 69 6f 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20 26  ionName(pExpr, &
8a70: 7a 49 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20  zId, &nId);.    
8a80: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 46    pDef = sqliteF
8a90: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
8aa0: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
8ab0: 2c 20 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , nExpr, 0);.   
8ac0: 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66 21     assert( pDef!
8ad0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
8ae0: 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
8af0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
8b00: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
8b10: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
8b20: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
8b30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 4f       sqliteVdbeO
8b40: 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p3(v, OP_Functio
8b50: 6e 2c 20 6e 45 78 70 72 2c 20 30 2c 20 28 63 68  n, nExpr, 0, (ch
8b60: 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 50 4f 49  ar*)pDef, P3_POI
8b70: 4e 54 45 52 29 3b 0a 20 20 20 20 20 20 62 72 65  NTER);.      bre
8b80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8b90: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
8ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8bb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
8bc0: 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  oad, pExpr->iCol
8bd0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  umn, 0);.      b
8be0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8bf0: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
8c00: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
8c10: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8c20: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
8c30: 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 1, 0);.      
8c40: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
8c50: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
8c60: 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72  eft);.      addr
8c70: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72   = sqliteVdbeCur
8c80: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
8c90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8ca0: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
8cb0: 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 0a 20  , -1, addr+4);. 
8cc0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8cd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
8ce0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
8cf0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8d00: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
8d10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
8d20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
8d30: 74 6f 2c 20 30 2c 20 61 64 64 72 2b 36 29 3b 0a  to, 0, addr+6);.
8d40: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
8d50: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
8d60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8d70: 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  dOp(v, OP_Found,
8d80: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
8d90: 61 64 64 72 2b 36 29 3b 0a 20 20 20 20 20 20 7d  addr+6);.      }
8da0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
8db0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8dc0: 20 4f 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45   OP_SetFound, pE
8dd0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64  xpr->iTable, add
8de0: 72 2b 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r+6);.      }.  
8df0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8e00: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
8e10: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , -1, 0);.      
8e20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8e30: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
8e40: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
8e50: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
8e60: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
8e70: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8e80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
8e90: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
8ea0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
8eb0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
8ec0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
8ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
8ee0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20  AddOp(v, OP_Ge, 
8ef0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
8f00: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8f10: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
8f20: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
8f30: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
8f40: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
8f50: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
8f60: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8f70: 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a 20   OP_Le, 0, 0);. 
8f80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8f90: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20  ddOp(v, OP_And, 
8fa0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
8fb0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8fc0: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20  se TK_UPLUS:.   
8fd0: 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20   case TK_AS: {. 
8fe0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
8ff0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9000: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
9010: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9020: 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20    case TK_CASE: 
9030: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70 72  {.      int expr
9040: 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20  _end_label;.    
9050: 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a    int jumpInst;.
9060: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
9070: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
9080: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  .      int i;.. 
9090: 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
90a0: 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r->pList);.     
90b0: 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e   assert((pExpr->
90c0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32  pList->nExpr % 2
90d0: 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61  ) == 0);.      a
90e0: 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
90f0: 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
9100: 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
9110: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
9120: 72 3b 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e  r;.      expr_en
9130: 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  d_label = sqlite
9140: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
9150: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
9160: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
9170: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
9180: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
9190: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
91a0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
91b0: 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29   i<nExpr; i=i+2)
91c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
91d0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
91e0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
91f0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
9200: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
9210: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
9220: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
9230: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20  p(v, OP_Dup, 1, 
9240: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 75  1);.          ju
9250: 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 56  mpInst = sqliteV
9260: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
9270: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
9280: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9290: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
92a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
92b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  lse{.          j
92c0: 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65  umpInst = sqlite
92d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
92e0: 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  IfNot, 1, 0);.  
92f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9300: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
9310: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
9320: 69 73 74 2d 3e 61 5b 69 2b 31 5d 2e 70 45 78 70  ist->a[i+1].pExp
9330: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
9340: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9350: 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f  P_Goto, 0, expr_
9360: 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20  end_label);.    
9370: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
9380: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
9390: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
93a0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 32 28  iteVdbeChangeP2(
93b0: 76 2c 20 6a 75 6d 70 49 6e 73 74 2c 20 61 64 64  v, jumpInst, add
93c0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
93d0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
93e0: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
93f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9400: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
9410: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9420: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
9430: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9440: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
9450: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
9460: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9470: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
9480: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
9490: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
94a0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
94b0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
94c0: 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62  (v, expr_end_lab
94d0: 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  el);.      break
94e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
94f0: 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
9500: 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
9510: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
9520: 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72       sqliteError
9530: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
9560: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
9570: 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
9580: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
9590: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
95a0: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ..return;.      
95b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
95c0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
95d0: 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 09 20 20  _Rollback ||..  
95e0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
95f0: 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 09 20  = OE_Abort ||.. 
9600: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
9610: 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 7b 0a 09 20  == OE_Fail ){.. 
9620: 20 73 71 6c 69 74 65 56 64 62 65 4f 70 33 28 76   sqliteVdbeOp3(v
9630: 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
9640: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45  E_CONSTRAINT, pE
9650: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  xpr->iColumn,.  
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
9680: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
9690: 74 6f 6b 65 6e 2e 6e 29 3b 0a 09 20 20 73 71 6c  token.n);..  sql
96a0: 69 74 65 56 64 62 65 44 65 71 75 6f 74 65 50 33  iteVdbeDequoteP3
96b0: 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d  (v, -1);.      }
96c0: 20 65 6c 73 65 20 7b 0a 09 20 20 61 73 73 65 72   else {..  asser
96d0: 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t( pExpr->iColum
96e0: 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29  n == OE_Ignore )
96f0: 3b 0a 09 20 20 73 71 6c 69 74 65 56 64 62 65 4f  ;..  sqliteVdbeO
9700: 70 33 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p3(v, OP_Goto, 0
9710: 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  , pParse->trigSt
9720: 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 2c  ack->ignoreJump,
9730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9740: 20 20 20 20 20 20 20 20 20 20 20 20 22 28 49 47              "(IG
9750: 4e 4f 52 45 20 6a 75 6d 70 29 22 2c 20 30 29 3b  NORE jump)", 0);
9760: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9770: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a     break;.  }.}.
9780: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9790: 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
97a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
97b0: 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
97c0: 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
97d0: 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
97e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
97f0: 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
9800: 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
9810: 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
9820: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
9830: 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
9840: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
9850: 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
9860: 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
9870: 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
9880: 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
9890: 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
98a0: 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
98b0: 20 74 72 75 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   true..*/.void s
98c0: 71 6c 69 74 65 45 78 70 72 49 66 54 72 75 65 28  qliteExprIfTrue(
98d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
98e0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
98f0: 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
9900: 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
9910: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9920: 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
9930: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
9940: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
9950: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
9960: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
9970: 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70   TK_LT:       op
9980: 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20   = OP_Lt;       
9990: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
99a0: 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_LE:       op 
99b0: 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20 62  = OP_Le;       b
99c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
99d0: 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_GT:       op =
99e0: 20 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62 72   OP_Gt;       br
99f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9a00: 5f 47 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _GE:       op = 
9a10: 4f 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65  OP_Ge;       bre
9a20: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9a30: 4e 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  NE:       op = O
9a40: 50 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ne;       brea
9a50: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
9a60: 51 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  Q:       op = OP
9a70: 5f 45 71 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Eq;       break
9a80: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
9a90: 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  NULL:   op = OP_
9aa0: 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b  IsNull;   break;
9ab0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
9ac0: 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e  NULL:  op = OP_N
9ad0: 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a  otNull;  break;.
9ae0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 62 72      default:  br
9af0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  eak;.  }.  switc
9b00: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
9b10: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
9b20: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
9b30: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
9b40: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
9b50: 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73  sqliteExprIfFals
9b60: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9b70: 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d  >pLeft, d2, !jum
9b80: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
9b90: 73 71 6c 69 74 65 45 78 70 72 49 66 54 72 75 65  sqliteExprIfTrue
9ba0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
9bb0: 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
9bc0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
9bd0: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
9be0: 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
9bf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9c00: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
9c10: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
9c20: 65 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  eExprIfTrue(pPar
9c30: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
9c40: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
9c50: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
9c60: 65 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  eExprIfTrue(pPar
9c70: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
9c80: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
9c90: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
9ca0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9cb0: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
9cc0: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 46 61    sqliteExprIfFa
9cd0: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
9ce0: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
9cf0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
9d00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9d10: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
9d20: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
9d30: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
9d40: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
9d50: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
9d60: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
9d70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
9d80: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
9d90: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
9da0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
9db0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
9dc0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
9dd0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
9de0: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
9df0: 26 26 20 73 71 6c 69 74 65 45 78 70 72 54 79 70  && sqliteExprTyp
9e00: 65 28 70 45 78 70 72 29 3d 3d 53 51 4c 49 54 45  e(pExpr)==SQLITE
9e10: 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  _SO_TEXT ){.    
9e20: 20 20 20 20 6f 70 20 2b 3d 20 36 3b 20 20 2f 2a      op += 6;  /*
9e30: 20 43 6f 6e 76 65 72 74 20 6e 75 6d 65 72 69 63   Convert numeric
9e40: 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 65 78 74   opcodes to text
9e50: 20 6f 70 63 6f 64 65 73 20 2a 2f 0a 20 20 20 20   opcodes */.    
9e60: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9e70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
9e80: 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73   jumpIfNull, des
9e90: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
9ea0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9eb0: 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
9ec0: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
9ed0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
9ee0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
9ef0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
9f00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9f10: 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
9f20: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
9f30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9f40: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
9f50: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
9f60: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
9f70: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
9f80: 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72  eft);.      addr
9f90: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72   = sqliteVdbeCur
9fa0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
9fb0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
9fc0: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
9fd0: 2c 20 2d 31 2c 20 61 64 64 72 2b 33 29 3b 0a 20  , -1, addr+3);. 
9fe0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
9ff0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
a000: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
a010: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a020: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 75 6d 70  OP_Goto, 0, jump
a030: 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20  IfNull ? dest : 
a040: 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 20 20 69  addr+4);.      i
a050: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
a060: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
a070: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a080: 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
a090: 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a  >iTable, dest);.
a0a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a0b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
a0c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 46 6f  ddOp(v, OP_SetFo
a0d0: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
a0e0: 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  le, dest);.     
a0f0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
a100: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
a110: 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
a120: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
a130: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
a140: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
a150: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
a160: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a170: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
a180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
a190: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
a1a0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
a1b0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61  .pExpr);.      a
a1c0: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
a1d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 74 2c 20  AddOp(v, OP_Lt, 
a1e0: 21 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 30 29 3b  !jumpIfNull, 0);
a1f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
a200: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
a210: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
a220: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  .pExpr);.      s
a230: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a240: 2c 20 4f 50 5f 4c 65 2c 20 6a 75 6d 70 49 66 4e  , OP_Le, jumpIfN
a250: 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ull, dest);.    
a260: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
a270: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
a280: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a290: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 32  liteVdbeChangeP2
a2a0: 28 76 2c 20 61 64 64 72 2c 20 73 71 6c 69 74 65  (v, addr, sqlite
a2b0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
a2c0: 76 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  v));.      sqlit
a2d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
a2e0: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
a2f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a300: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
a310: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
a320: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
a330: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
a340: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a350: 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20  If, jumpIfNull, 
a360: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
a370: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
a380: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a390: 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
a3a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
a3b0: 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
a3c0: 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
a3d0: 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
a3e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
a3f0: 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65  is false but exe
a400: 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
a410: 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
a420: 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
a430: 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  ion is true..**.
a440: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
a450: 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
a460: 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
a470: 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20  true nor false) 
a480: 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20  then.** jump if 
a490: 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72  jumpIfNull is tr
a4a0: 75 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75  ue or fall throu
a4b0: 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  gh if jumpIfNull
a4c0: 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f   is false..*/.vo
a4d0: 69 64 20 73 71 6c 69 74 65 45 78 70 72 49 66 46  id sqliteExprIfF
a4e0: 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  alse(Parse *pPar
a4f0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
a500: 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
a510: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
a520: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a530: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
a540: 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  = 0;.  if( v==0 
a550: 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  || pExpr==0 ) re
a560: 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20  turn;.  switch( 
a570: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
a580: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
a590: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20     op = OP_Ge;  
a5a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a5b0: 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20  case TK_LE:     
a5c0: 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20    op = OP_Gt;   
a5d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a5e0: 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
a5f0: 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20   op = OP_Le;    
a600: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a610: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20  se TK_GE:       
a620: 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20  op = OP_Lt;     
a630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a640: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f  e TK_NE:       o
a650: 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20  p = OP_Eq;      
a660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a670: 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70   TK_EQ:       op
a680: 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20   = OP_Ne;       
a690: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a6a0: 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20  TK_ISNULL:   op 
a6b0: 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62  = OP_NotNull;  b
a6c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a6d0: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d  K_NOTNULL:  op =
a6e0: 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72   OP_IsNull;   br
a6f0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
a700: 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  :  break;.  }.  
a710: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
a720: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
a730: 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73 71  _AND: {.      sq
a740: 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65 28  liteExprIfFalse(
a750: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a760: 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
a770: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
a780: 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73 65  qliteExprIfFalse
a790: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
a7a0: 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
a7b0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
a7c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a7d0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
a7e0: 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
a7f0: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
a800: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
a810: 69 74 65 45 78 70 72 49 66 54 72 75 65 28 70 50  iteExprIfTrue(pP
a820: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
a830: 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e  ft, d2, !jumpIfN
a840: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
a850: 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  teExprIfFalse(pP
a860: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
a870: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
a880: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
a890: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
a8a0: 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
a8b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a8c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
a8d0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
a8e0: 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
a8f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
a900: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
a910: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a920: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
a930: 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
a940: 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
a950: 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
a960: 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
a970: 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
a980: 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_EQ: {.      if
a990: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69  ( pParse->db->fi
a9a0: 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20  le_format>=4 && 
a9b0: 73 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 70  sqliteExprType(p
a9c0: 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  Expr)==SQLITE_SO
a9d0: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
a9e0: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d 65   /* Convert nume
a9f0: 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  ric comparison o
aa00: 70 63 6f 64 65 73 20 69 6e 74 6f 20 74 65 78 74  pcodes into text
aa10: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f   comparison opco
aa20: 64 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  des..        ** 
aa30: 54 68 69 73 20 73 74 65 70 20 64 65 70 65 6e 64  This step depend
aa40: 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
aa50: 61 74 20 74 68 65 20 74 65 78 74 20 63 6f 6d 70  at the text comp
aa60: 61 72 69 73 69 6f 6e 20 6f 70 63 6f 64 65 73 20  arision opcodes 
aa70: 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  are.        ** a
aa80: 6c 77 61 79 73 20 36 20 67 72 65 61 74 65 72 20  lways 6 greater 
aa90: 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65  than their corre
aaa0: 73 70 6f 6e 64 69 6e 67 20 6e 75 6d 65 72 69 63  sponding numeric
aab0: 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
aac0: 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65 73 2e 0a      ** opcodes..
aad0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
aae0: 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 45 71     assert( OP_Eq
aaf0: 2b 36 20 3d 3d 20 4f 50 5f 53 74 72 45 71 20 29  +6 == OP_StrEq )
ab00: 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 2b 3d 20  ;.        op += 
ab10: 36 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  6;.      }.     
ab20: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
ab30: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ab40: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
ab50: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
ab60: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
ab70: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
ab80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
ab90: 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73   jumpIfNull, des
aba0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
abb0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
abc0: 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
abd0: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
abe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
abf0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
ac00: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
ac10: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ac20: 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
ac30: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
ac40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ac50: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
ac60: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
ac70: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
ac80: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
ac90: 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72  eft);.      addr
aca0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72   = sqliteVdbeCur
acb0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
acc0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
acd0: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
ace0: 2c 20 2d 31 2c 20 61 64 64 72 2b 33 29 3b 0a 20  , -1, addr+3);. 
acf0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ad00: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
ad10: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
ad20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ad30: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 75 6d 70  OP_Goto, 0, jump
ad40: 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20  IfNull ? dest : 
ad50: 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 20 20 69  addr+4);.      i
ad60: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
ad70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
ad80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ad90: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78  OP_NotFound, pEx
ada0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
adb0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
adc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
add0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
ade0: 74 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72  tNotFound, pExpr
adf0: 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29 3b  ->iTable, dest);
ae00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
ae10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ae20: 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
ae30: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
ae40: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  r;.      sqliteE
ae50: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
ae60: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
ae70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ae80: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
ae90: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
aea0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
aeb0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
aec0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
aed0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
aee0: 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  teVdbeCurrentAdd
aef0: 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
af00: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
af10: 50 5f 47 65 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  P_Ge, !jumpIfNul
af20: 6c 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20  l, addr+3);.    
af30: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
af40: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
af50: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
af60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
af70: 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a  Goto, 0, dest);.
af80: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
af90: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
afa0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
afb0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
afc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
afd0: 20 4f 50 5f 47 74 2c 20 6a 75 6d 70 49 66 4e 75   OP_Gt, jumpIfNu
afe0: 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ll, dest);.     
aff0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b000: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
b010: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
b020: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
b030: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
b040: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
b050: 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c  Not, jumpIfNull,
b060: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
b070: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
b080: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
b090: 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
b0a0: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
b0b0: 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52  rees.  Return TR
b0c0: 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a  UE (non-zero).**
b0d0: 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
b0e0: 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72  ntical and retur
b0f0: 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20  n FALSE if they 
b100: 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
b110: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
b120: 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72  ExprCompare(Expr
b130: 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b   *pA, Expr *pB){
b140: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
b150: 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pA==0 ){.    ret
b160: 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c  urn pB==0;.  }el
b170: 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a  se if( pB==0 ){.
b180: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b190: 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
b1a0: 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20  pB->op ) return 
b1b0: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
b1c0: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
b1d0: 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
b1e0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
b1f0: 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72 43  if( !sqliteExprC
b200: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
b210: 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29  t, pB->pRight) )
b220: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
b230: 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pA->pList ){.  
b240: 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d    if( pB->pList=
b250: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b260: 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74     if( pA->pList
b270: 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69  ->nExpr!=pB->pLi
b280: 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  st->nExpr ) retu
b290: 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d  rn 0;.    for(i=
b2a0: 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e  0; i<pA->pList->
b2b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
b2c0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 45 78     if( !sqliteEx
b2d0: 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
b2e0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
b2f0: 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d   pB->pList->a[i]
b300: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
b310: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
b320: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
b330: 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74  se if( pB->pList
b340: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
b350: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
b360: 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70  pSelect || pB->p
b370: 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
b380: 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61  0;.  if( pA->iTa
b390: 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20  ble!=pB->iTable 
b3a0: 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  || pA->iColumn!=
b3b0: 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65  pB->iColumn ) re
b3c0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
b3d0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20  ->token.z ){.   
b3e0: 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a   if( pB->token.z
b3f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b400: 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
b410: 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e  n.n!=pA->token.n
b420: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
b430: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49   if( sqliteStrNI
b440: 43 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c  Cmp(pA->token.z,
b450: 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42   pB->token.z, pB
b460: 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20  ->token.n)!=0 ) 
b470: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
b480: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
b490: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
b4a0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 50 61 72  ment to the pPar
b4b0: 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
b4c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20   and return its 
b4d0: 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
b4e0: 20 69 6e 74 20 61 70 70 65 6e 64 41 67 67 49 6e   int appendAggIn
b4f0: 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
b500: 29 7b 0a 20 20 69 66 28 20 28 70 50 61 72 73 65  ){.  if( (pParse
b510: 2d 3e 6e 41 67 67 20 26 20 30 78 37 29 3d 3d 30  ->nAgg & 0x7)==0
b520: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   ){.    int amt 
b530: 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 2b  = pParse->nAgg +
b540: 20 38 3b 0a 20 20 20 20 41 67 67 45 78 70 72 20   8;.    AggExpr 
b550: 2a 61 41 67 67 20 3d 20 73 71 6c 69 74 65 52 65  *aAgg = sqliteRe
b560: 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61 41  alloc(pParse->aA
b570: 67 67 2c 20 61 6d 74 2a 73 69 7a 65 6f 66 28 70  gg, amt*sizeof(p
b580: 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29  Parse->aAgg[0]))
b590: 3b 0a 20 20 20 20 69 66 28 20 61 41 67 67 3d 3d  ;.    if( aAgg==
b5a0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
b5b0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
b5c0: 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 61  pParse->aAgg = a
b5d0: 41 67 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  Agg;.  }.  memse
b5e0: 74 28 26 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  t(&pParse->aAgg[
b5f0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 5d 2c 20 30  pParse->nAgg], 0
b600: 2c 20 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  , sizeof(pParse-
b610: 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 72 65  >aAgg[0]));.  re
b620: 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 41 67  turn pParse->nAg
b630: 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  g++;.}../*.** An
b640: 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20  alyze the given 
b650: 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
b660: 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
b670: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
b680: 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
b690: 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
b6a0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61  added to the pPa
b6b0: 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
b6c0: 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74  y..** Make addit
b6d0: 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f  ional entries to
b6e0: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
b6f0: 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63  g[] array as nec
b700: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  essary..**.** Th
b710: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
b720: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
b730: 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65   after the expre
b740: 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a  ssion has been.*
b750: 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71  * analyzed by sq
b760: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
b770: 64 73 28 29 20 61 6e 64 20 73 71 6c 69 74 65 45  ds() and sqliteE
b780: 78 70 72 43 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a  xprCheck()..**.*
b790: 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65 20  * If errors are 
b7a0: 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65  seen, leave an e
b7b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
b7c0: 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74 75  zErrMsg and retu
b7d0: 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
b7e0: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69   of errors..*/.i
b7f0: 6e 74 20 73 71 6c 69 74 65 45 78 70 72 41 6e 61  nt sqliteExprAna
b800: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 50  lyzeAggregates(P
b810: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
b820: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
b830: 74 20 69 3b 0a 20 20 41 67 67 45 78 70 72 20 2a  t i;.  AggExpr *
b840: 61 41 67 67 3b 0a 20 20 69 6e 74 20 6e 45 72 72  aAgg;.  int nErr
b850: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 45 78   = 0;..  if( pEx
b860: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
b870: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
b880: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
b890: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
b8a0: 20 20 20 20 20 61 41 67 67 20 3d 20 70 50 61 72       aAgg = pPar
b8b0: 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20  se->aAgg;.      
b8c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
b8d0: 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
b8e0: 20 20 20 20 20 20 20 69 66 28 20 61 41 67 67 5b         if( aAgg[
b8f0: 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  i].isAgg ) conti
b900: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
b910: 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e   aAgg[i].pExpr->
b920: 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
b930: 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 26  Table.         &
b940: 26 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d  & aAgg[i].pExpr-
b950: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
b960: 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
b970: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b980: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b990: 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72       if( i>=pPar
b9a0: 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20  se->nAgg ){.    
b9b0: 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67      i = appendAg
b9c0: 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20  gInfo(pParse);. 
b9d0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29         if( i<0 )
b9e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
b9f0: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
ba00: 69 5d 2e 69 73 41 67 67 20 3d 20 30 3b 0a 20 20  i].isAgg = 0;.  
ba10: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
ba20: 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45  gg[i].pExpr = pE
ba30: 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xpr;.      }.   
ba40: 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
ba50: 20 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   i;.      break;
ba60: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ba70: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
ba80: 20 7b 0a 20 20 20 20 20 20 61 41 67 67 20 3d 20   {.      aAgg = 
ba90: 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20  pParse->aAgg;.  
baa0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
bab0: 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
bac0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
bad0: 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20  aAgg[i].isAgg ) 
bae0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
baf0: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
bb00: 43 6f 6d 70 61 72 65 28 61 41 67 67 5b 69 5d 2e  Compare(aAgg[i].
bb10: 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b  pExpr, pExpr) ){
bb20: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
bb30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bb40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
bb50: 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b  =pParse->nAgg ){
bb60: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70  .        i = app
bb70: 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73  endAggInfo(pPars
bb80: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
bb90: 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  i<0 ) return 1;.
bba0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
bbb0: 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20  aAgg[i].isAgg = 
bbc0: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
bbd0: 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  e->aAgg[i].pExpr
bbe0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
bbf0: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
bc00: 5d 2e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ].pFunc = sqlite
bc10: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
bc20: 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
bc30: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
bc40: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
bc50: 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  en.n,.          
bc60: 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20     pExpr->pList 
bc70: 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  ? pExpr->pList->
bc80: 6e 45 78 70 72 20 3a 20 30 2c 20 30 29 3b 0a 20  nExpr : 0, 0);. 
bc90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78       }.      pEx
bca0: 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20  pr->iAgg = i;.  
bcb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bcc0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
bcd0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
bce0: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
bcf0: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45    nErr = sqliteE
bd00: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
bd10: 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 78  ates(pParse, pEx
bd20: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
bd30: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45    }.      if( nE
bd40: 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  rr==0 && pExpr->
bd50: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
bd60: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45    nErr = sqliteE
bd70: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
bd80: 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 78  ates(pParse, pEx
bd90: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
bda0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
bdb0: 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  Err==0 && pExpr-
bdc0: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
bdd0: 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d    int n = pExpr-
bde0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  >pList->nExpr;. 
bdf0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
be00: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e        for(i=0; n
be10: 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69  Err==0 && i<n; i
be20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ++){.          n
be30: 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  Err = sqliteExpr
be40: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
be50: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  s(pParse, pExpr-
be60: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
be70: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
be80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
be90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
bea0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a  return nErr;.}..
beb0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 20 75  /*.** Locate a u
bec0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 67 69 76  ser function giv
bed0: 65 6e 20 61 20 6e 61 6d 65 20 61 6e 64 20 61 20  en a name and a 
bee0: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
bef0: 6e 74 73 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  nts..** Return a
bf00: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
bf10: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
bf20: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  e that defines t
bf30: 68 61 74 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c  hat.** function,
bf40: 20 6f 72 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20   or return NULL 
bf50: 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  if the function 
bf60: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
bf70: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 72 65  **.** If the cre
bf80: 61 74 65 46 6c 61 67 20 61 72 67 75 6d 65 6e 74  ateFlag argument
bf90: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
bfa0: 20 6e 65 77 20 28 62 6c 61 6e 6b 29 20 46 75 6e   new (blank) Fun
bfb0: 63 44 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72  cDef.** structur
bfc0: 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
bfd0: 20 6c 69 6b 65 64 20 69 6e 74 6f 20 74 68 65 20   liked into the 
bfe0: 22 64 62 22 20 73 74 72 75 63 74 75 72 65 20 69  "db" structure i
bff0: 66 20 61 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 69  f a.** no matchi
c000: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 76  ng function prev
c010: 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20  iously existed. 
c020: 20 57 68 65 6e 20 63 72 65 61 74 65 46 6c 61 67   When createFlag
c030: 20 69 73 20 74 72 75 65 0a 2a 2a 20 61 6e 64 20   is true.** and 
c040: 74 68 65 20 6e 41 72 67 20 70 61 72 61 6d 65 74  the nArg paramet
c050: 65 72 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 6f  er is -1, then o
c060: 6e 6c 79 20 61 20 66 75 6e 63 74 69 6f 6e 20 74  nly a function t
c070: 68 61 74 20 61 63 63 65 70 74 73 0a 2a 2a 20 61  hat accepts.** a
c080: 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ny number of arg
c090: 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 72  uments will be r
c0a0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
c0b0: 66 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20  f createFlag is 
c0c0: 66 61 6c 73 65 20 61 6e 64 20 6e 41 72 67 20 69  false and nArg i
c0d0: 73 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 66  s -1, then the f
c0e0: 69 72 73 74 20 76 61 6c 69 64 0a 2a 2a 20 66 75  irst valid.** fu
c0f0: 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 73 20  nction found is 
c100: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 66 75 6e  returned.  A fun
c110: 63 74 69 6f 6e 20 69 73 20 76 61 6c 69 64 20 69  ction is valid i
c120: 66 20 65 69 74 68 65 72 20 78 46 75 6e 63 0a 2a  f either xFunc.*
c130: 2a 20 6f 72 20 78 53 74 65 70 20 69 73 20 6e 6f  * or xStep is no
c140: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 46 75 6e 63 44  n-zero..*/.FuncD
c150: 65 66 20 2a 73 71 6c 69 74 65 46 69 6e 64 46 75  ef *sqliteFindFu
c160: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
c170: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
c180: 41 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  An open database
c190: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
c1a0: 20 2a 7a 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65   *zName, /* Name
c1b0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
c1c0: 2e 20 20 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d  .  Not null-term
c1d0: 69 6e 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  inated */.  int 
c1e0: 6e 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 2f  nName,         /
c1f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
c200: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61  acters in the na
c210: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  me */.  int nArg
c220: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ,          /* Nu
c230: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
c240: 73 2e 20 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79  s.  -1 means any
c250: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
c260: 20 63 72 65 61 74 65 46 6c 61 67 20 20 20 20 20   createFlag     
c270: 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 65 6e  /* Create new en
c280: 74 72 79 20 69 66 20 74 72 75 65 20 61 6e 64 20  try if true and 
c290: 64 6f 65 73 20 6e 6f 74 20 6f 74 68 65 72 77 69  does not otherwi
c2a0: 73 65 20 65 78 69 73 74 20 2a 2f 0a 29 7b 0a 20  se exist */.){. 
c2b0: 20 46 75 6e 63 44 65 66 20 2a 70 46 69 72 73 74   FuncDef *pFirst
c2c0: 2c 20 2a 70 2c 20 2a 70 4d 61 79 62 65 3b 0a 20  , *p, *pMaybe;. 
c2d0: 20 70 46 69 72 73 74 20 3d 20 70 20 3d 20 28 46   pFirst = p = (F
c2e0: 75 6e 63 44 65 66 2a 29 73 71 6c 69 74 65 48 61  uncDef*)sqliteHa
c2f0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 46 75 6e  shFind(&db->aFun
c300: 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  c, zName, nName)
c310: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 21 63 72  ;.  if( p && !cr
c320: 65 61 74 65 46 6c 61 67 20 26 26 20 6e 41 72 67  eateFlag && nArg
c330: 3c 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  <0 ){.    while(
c340: 20 70 20 26 26 20 70 2d 3e 78 46 75 6e 63 3d 3d   p && p->xFunc==
c350: 30 20 26 26 20 70 2d 3e 78 53 74 65 70 3d 3d 30  0 && p->xStep==0
c360: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
c370: 3b 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ; }.    return p
c380: 3b 0a 20 20 7d 0a 20 20 70 4d 61 79 62 65 20 3d  ;.  }.  pMaybe =
c390: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26   0;.  while( p &
c3a0: 26 20 70 2d 3e 6e 41 72 67 21 3d 6e 41 72 67 20  & p->nArg!=nArg 
c3b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 41  ){.    if( p->nA
c3c0: 72 67 3c 30 20 26 26 20 21 63 72 65 61 74 65 46  rg<0 && !createF
c3d0: 6c 61 67 20 26 26 20 28 70 2d 3e 78 46 75 6e 63  lag && (p->xFunc
c3e0: 20 7c 7c 20 70 2d 3e 78 53 74 65 70 29 20 29 20   || p->xStep) ) 
c3f0: 70 4d 61 79 62 65 20 3d 20 70 3b 0a 20 20 20 20  pMaybe = p;.    
c400: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
c410: 7d 0a 20 20 69 66 28 20 70 20 26 26 20 21 63 72  }.  if( p && !cr
c420: 65 61 74 65 46 6c 61 67 20 26 26 20 70 2d 3e 78  eateFlag && p->x
c430: 46 75 6e 63 3d 3d 30 20 26 26 20 70 2d 3e 78 53  Func==0 && p->xS
c440: 74 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  tep==0 ){.    re
c450: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
c460: 28 20 70 3d 3d 30 20 26 26 20 70 4d 61 79 62 65  ( p==0 && pMaybe
c470: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c480: 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 29 3b  createFlag==0 );
c490: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4d 61 79  .    return pMay
c4a0: 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d  be;.  }.  if( p=
c4b0: 3d 30 20 26 26 20 63 72 65 61 74 65 46 6c 61 67  =0 && createFlag
c4c0: 20 26 26 20 28 70 20 3d 20 73 71 6c 69 74 65 4d   && (p = sqliteM
c4d0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 29  alloc(sizeof(*p)
c4e0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ))!=0 ){.    p->
c4f0: 6e 41 72 67 20 3d 20 6e 41 72 67 3b 0a 20 20 20  nArg = nArg;.   
c500: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 46 69 72   p->pNext = pFir
c510: 73 74 3b 0a 20 20 20 20 70 2d 3e 64 61 74 61 54  st;.    p->dataT
c520: 79 70 65 20 3d 20 70 46 69 72 73 74 20 3f 20 70  ype = pFirst ? p
c530: 46 69 72 73 74 2d 3e 64 61 74 61 54 79 70 65 20  First->dataType 
c540: 3a 20 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43  : SQLITE_NUMERIC
c550: 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  ;.    sqliteHash
c560: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 46 75 6e  Insert(&db->aFun
c570: 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  c, zName, nName,
c580: 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a   (void*)p);.  }.
c590: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a          return p;.}.