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

Artifact 8c3f5603c3e98b1c146d18076ba3e82cdbb59c11:


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 34 20 32 30 30 34 2f 30 34 2f 32 33 20  .114 2004/04/23 
0220: 31 37 3a 30 34 3a 34 35 20 64 72 68 20 45 78 70  17:04:45 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 69  (p->a[0]) );.  i
1140: 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 20 72 65  f( pItem==0 ) re
1150: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4c 65 61 6b  turn 0;  /* Leak
1160: 73 20 6d 65 6d 6f 72 79 20 61 66 74 65 72 20 61  s memory after a
1170: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
1180: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1190: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
11a0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
11b0: 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f  r *pNewExpr, *pO
11c0: 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65  ldExpr;.    pIte
11d0: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45  m->pExpr = pNewE
11e0: 78 70 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  xpr = sqliteExpr
11f0: 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d 20 70  Dup(pOldExpr = p
1200: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1210: 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 2d     if( pOldExpr-
1220: 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e  >span.z!=0 && pN
1230: 65 77 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  ewExpr ){.      
1240: 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65 20 61  /* Always make a
1250: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 70 61   copy of the spa
1260: 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20  n for top-level 
1270: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
1280: 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  he.      ** expr
1290: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68  ession list.  Th
12a0: 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45 43  e logic in SELEC
12b0: 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61  T processing tha
12c0: 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20 20 20  t determines.   
12d0: 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20     ** the names 
12e0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
12f0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6e 65 65  e result set nee
1300: 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  ds this informat
1310: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
1320: 69 74 65 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e  iteTokenCopy(&pN
1330: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  ewExpr->span, &p
1340: 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a  OldExpr->span);.
1350: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1360: 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c  ( pNewExpr==0 ||
1370: 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e   pNewExpr->span.
1380: 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  z!=0 .          
1390: 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73    || pOldExpr->s
13a0: 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73 71 6c 69  pan.z==0 || sqli
13b0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
13c0: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
13d0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
13e0: 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  Dup(p->a[i].zNam
13f0: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73  e);.    pItem->s
1400: 6f 72 74 4f 72 64 65 72 20 3d 20 70 2d 3e 61 5b  ortOrder = p->a[
1410: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
1420: 20 20 70 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d    pItem->isAgg =
1430: 20 70 2d 3e 61 5b 69 5d 2e 69 73 41 67 67 3b 0a   p->a[i].isAgg;.
1440: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
1450: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1460: 6e 20 70 4e 65 77 3b 0a 7d 0a 53 72 63 4c 69 73  n pNew;.}.SrcLis
1470: 74 20 2a 73 71 6c 69 74 65 53 72 63 4c 69 73 74  t *sqliteSrcList
1480: 44 75 70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  Dup(SrcList *p){
1490: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
14a0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
14b0: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d   nByte;.  if( p=
14c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
14d0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
14e0: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
14f0: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
1500: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
1510: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
1520: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
1530: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
1540: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
1550: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
1560: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
1570: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
1580: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
1590: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
15a0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
15b0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
15c0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
15d0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
15e0: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
15f0: 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74  a[i];.    pNewIt
1600: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
1610: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
1620: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
1630: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
1640: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  >zName = sqliteS
1650: 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  trDup(pOldItem->
1660: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
1670: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
1680: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64  qliteStrDup(pOld
1690: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
16a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69     pNewItem->joi
16b0: 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d  ntype = pOldItem
16c0: 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
16d0: 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pNewItem->iCurso
16e0: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43  r = pOldItem->iC
16f0: 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49  ursor;.    pNewI
1700: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
1710: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65     pNewItem->pSe
1720: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53 65 6c  lect = sqliteSel
1730: 65 63 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  ectDup(pOldItem-
1740: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70  >pSelect);.    p
1750: 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73  NewItem->pOn = s
1760: 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 4f 6c  qliteExprDup(pOl
1770: 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20  dItem->pOn);.   
1780: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e   pNewItem->pUsin
1790: 67 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74  g = sqliteIdList
17a0: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 55  Dup(pOldItem->pU
17b0: 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  sing);.  }.  ret
17c0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
17d0: 73 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74  st *sqliteIdList
17e0: 44 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b 0a  Dup(IdList *p){.
17f0: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
1800: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1810: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1820: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
1830: 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
1840: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
1850: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
1860: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64  n 0;.  pNew->nId
1870: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
1880: 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77  = p->nId;.  pNew
1890: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ->a = sqliteMall
18a0: 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73 69  ocRaw( p->nId*si
18b0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
18c0: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
18d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
18e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49  for(i=0; i<p->nI
18f0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  d; i++){.    str
1900: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
1910: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
1920: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
1930: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
1940: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
1950: 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74  a[i];.    pNewIt
1960: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
1970: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
1980: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
1990: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
19a0: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
19b0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
19c0: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
19d0: 65 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63  eSelectDup(Selec
19e0: 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20  t *p){.  Select 
19f0: 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d  *pNew;.  if( p==
1a00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1a10: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
1a20: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
1a30: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  p) );.  if( pNew
1a40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1a50: 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e    pNew->isDistin
1a60: 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
1a70: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69  ct;.  pNew->pELi
1a80: 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  st = sqliteExprL
1a90: 69 73 74 44 75 70 28 70 2d 3e 70 45 4c 69 73 74  istDup(p->pEList
1aa0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20  );.  pNew->pSrc 
1ab0: 3d 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44  = sqliteSrcListD
1ac0: 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70  up(p->pSrc);.  p
1ad0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
1ae0: 6c 69 74 65 45 78 70 72 44 75 70 28 70 2d 3e 70  liteExprDup(p->p
1af0: 57 68 65 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e  Where);.  pNew->
1b00: 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
1b10: 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  eExprListDup(p->
1b20: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65  pGroupBy);.  pNe
1b30: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  w->pHaving = sql
1b40: 69 74 65 45 78 70 72 44 75 70 28 70 2d 3e 70 48  iteExprDup(p->pH
1b50: 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e  aving);.  pNew->
1b60: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
1b70: 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  eExprListDup(p->
1b80: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65  pOrderBy);.  pNe
1b90: 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  w->op = p->op;. 
1ba0: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
1bb0: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75 70 28  sqliteSelectDup(
1bc0: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e  p->pPrior);.  pN
1bd0: 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e  ew->nLimit = p->
1be0: 6e 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  nLimit;.  pNew->
1bf0: 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66  nOffset = p->nOf
1c00: 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 7a 53  fset;.  pNew->zS
1c10: 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 70 4e 65  elect = 0;.  pNe
1c20: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  w->iLimit = -1;.
1c30: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
1c40: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
1c50: 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  New;.}.../*.** A
1c60: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
1c70: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
1c80: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
1c90: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
1ca0: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
1cb0: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
1cc0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
1cd0: 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  list..*/.ExprLis
1ce0: 74 20 2a 73 71 6c 69 74 65 45 78 70 72 4c 69 73  t *sqliteExprLis
1cf0: 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74  tAppend(ExprList
1d00: 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70   *pList, Expr *p
1d10: 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  Expr, Token *pNa
1d20: 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  me){.  if( pList
1d30: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
1d40: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1d50: 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74   sizeof(ExprList
1d60: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
1d70: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  st==0 ){.      /
1d80: 2a 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65  * sqliteExprDele
1d90: 74 65 28 70 45 78 70 72 29 3b 20 2f 2f 20 4c 65  te(pExpr); // Le
1da0: 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c  ak memory if mal
1db0: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
1dc0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1dd0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1de0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20  List->nAlloc==0 
1df0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  );.  }.  if( pLi
1e00: 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73  st->nAlloc<=pLis
1e10: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
1e20: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
1e30: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  pList->nAlloc*2 
1e40: 2b 20 34 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  + 4;.    pList->
1e50: 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  a = sqliteReallo
1e60: 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73  c(pList->a, pLis
1e70: 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  t->nAlloc*sizeof
1e80: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
1e90: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
1ea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1eb0: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
1ec0: 28 70 45 78 70 72 29 3b 20 2f 2f 20 4c 65 61 6b  (pExpr); // Leak
1ed0: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
1ee0: 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20  c fails */.     
1ef0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20   pList->nExpr = 
1f00: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
1f10: 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
1f20: 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pList;.    }.  }
1f30: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1f40: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
1f50: 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29  pExpr || pName )
1f60: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
1f70: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1f80: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
1f90: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
1fa0: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
1fb0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
1fc0: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
1fd0: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
1fe0: 20 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a     if( pName ){.
1ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
2000: 53 74 72 69 6e 67 28 26 70 49 74 65 6d 2d 3e 7a  String(&pItem->z
2010: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  Name, pName->z, 
2020: 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  pName->n, 0);.  
2030: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
2040: 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
2050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2060: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
2070: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
2080: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
2090: 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
20a0: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
20b0: 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  te(ExprList *pLi
20c0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
20d0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
20e0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
20f0: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20   pList->a!=0 || 
2100: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30  (pList->nExpr==0
2110: 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   && pList->nAllo
2120: 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72  c==0) );.  asser
2130: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c  t( pList->nExpr<
2140: 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29  =pList->nAlloc )
2150: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2160: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
2170: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  ){.    sqliteExp
2180: 72 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61  rDelete(pList->a
2190: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
21a0: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
21b0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
21c0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
21d0: 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
21e0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a  iteFree(pList);.
21f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
2200: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
2210: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
2220: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
2230: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64   constant.** and
2240: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
2250: 73 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  s variables..**.
2260: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
2270: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
2280: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
2290: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
22a0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
22b0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
22c0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
22d0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
22e0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
22f0: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
2300: 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72 49  .int sqliteExprI
2310: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
2320: 70 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  p){.  switch( p-
2330: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
2340: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
2350: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
2360: 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20  ase TK_DOT:.    
2370: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
2380: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
2390: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  ;.    case TK_NU
23a0: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
23b0: 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65  STRING:.    case
23c0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
23d0: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
23e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
23f0: 41 42 4c 45 3a 0a 20 20 20 20 20 20 72 65 74 75  ABLE:.      retu
2400: 72 6e 20 31 3b 0a 20 20 20 20 64 65 66 61 75 6c  rn 1;.    defaul
2410: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
2420: 2d 3e 70 4c 65 66 74 20 26 26 20 21 73 71 6c 69  ->pLeft && !sqli
2430: 74 65 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  teExprIsConstant
2440: 28 70 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  (p->pLeft) ) ret
2450: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28  urn 0;.      if(
2460: 20 70 2d 3e 70 52 69 67 68 74 20 26 26 20 21 73   p->pRight && !s
2470: 71 6c 69 74 65 45 78 70 72 49 73 43 6f 6e 73 74  qliteExprIsConst
2480: 61 6e 74 28 70 2d 3e 70 52 69 67 68 74 29 20 29  ant(p->pRight) )
2490: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
24a0: 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b   if( p->pList ){
24b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
24c0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
24d0: 20 69 3c 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78   i<p->pList->nEx
24e0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
24f0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 45      if( !sqliteE
2500: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d  xprIsConstant(p-
2510: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
2520: 70 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  pr) ) return 0;.
2530: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2540: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
2550: 2d 3e 70 4c 65 66 74 21 3d 30 20 7c 7c 20 70 2d  ->pLeft!=0 || p-
2560: 3e 70 52 69 67 68 74 21 3d 30 20 7c 7c 20 28 70  >pRight!=0 || (p
2570: 2d 3e 70 4c 69 73 74 20 26 26 20 70 2d 3e 70 4c  ->pList && p->pL
2580: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 3b 0a 20  ist->nExpr>0);. 
2590: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25a0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
25b0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
25c0: 73 73 69 6f 6e 20 63 6f 64 65 73 20 61 20 63 6f  ssion codes a co
25d0: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
25e0: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
25f0: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
2600: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
2610: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
2620: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
2630: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
2640: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
2650: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
2660: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
2670: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
2680: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
2690: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
26a0: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
26b0: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
26c0: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
26d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78  .*/.int sqliteEx
26e0: 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72  prIsInteger(Expr
26f0: 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65   *p, int *pValue
2700: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  ){.  switch( p->
2710: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
2720: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
2730: 20 20 20 69 66 28 20 73 71 6c 69 74 65 46 69 74     if( sqliteFit
2740: 73 49 6e 33 32 42 69 74 73 28 70 2d 3e 74 6f 6b  sIn32Bits(p->tok
2750: 65 6e 2e 7a 29 20 29 7b 0a 20 20 20 20 20 20 20  en.z) ){.       
2760: 20 2a 70 56 61 6c 75 65 20 3d 20 61 74 6f 69 28   *pValue = atoi(
2770: 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  p->token.z);.   
2780: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
27a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
27b0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
27c0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
27d0: 20 2a 7a 20 3d 20 70 2d 3e 74 6f 6b 65 6e 2e 7a   *z = p->token.z
27e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
27f0: 70 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  p->token.n;.    
2800: 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 5b 30    if( n>0 && z[0
2810: 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 6e  ]=='-' ){ z++; n
2820: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 77 68 69 6c  --; }.      whil
2830: 65 28 20 6e 3e 30 20 26 26 20 2a 7a 20 26 26 20  e( n>0 && *z && 
2840: 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a  isdigit(*z) ){ z
2850: 2b 2b 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20 20  ++; n--; }.     
2860: 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 73 71 6c   if( n==0 && sql
2870: 69 74 65 46 69 74 73 49 6e 33 32 42 69 74 73 28  iteFitsIn32Bits(
2880: 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 20 29 7b 0a 20  p->token.z) ){. 
2890: 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
28a0: 20 61 74 6f 69 28 70 2d 3e 74 6f 6b 65 6e 2e 7a   atoi(p->token.z
28b0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
28c0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
28d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
28f0: 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  S: {.      retur
2900: 6e 20 73 71 6c 69 74 65 45 78 70 72 49 73 49 6e  n sqliteExprIsIn
2910: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
2920: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20  pValue);.    }. 
2930: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
2940: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
2950: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
2960: 74 65 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  teExprIsInteger(
2970: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
2980: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
2990: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
29a0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
29b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29c0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
29d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
29e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
29f0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2a00: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
2a10: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
2a20: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
2a30: 20 73 71 6c 69 74 65 49 73 52 6f 77 69 64 28 63   sqliteIsRowid(c
2a40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
2a50: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
2a60: 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29  mp(z, "_ROWID_")
2a70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
2a80: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
2a90: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
2aa0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
2ab0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
2ac0: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
2ad0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
2ae0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2af0: 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
2b00: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  of a column of t
2b10: 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72  he form X.Y.Z or
2b20: 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20   Y.Z or just Z, 
2b30: 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20  look up.** that 
2b40: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20  name in the set 
2b50: 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  of source tables
2b60: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64   in pSrcList and
2b70: 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72 20   make the pExpr 
2b80: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  .** expression n
2b90: 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b 20 74  ode refer back t
2ba0: 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f  o that source co
2bb0: 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  lumn.  The follo
2bc0: 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20  wing changes.** 
2bd0: 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70  are made to pExp
2be0: 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70  r:.**.**    pExp
2bf0: 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20 20  r->iDb          
2c00: 20 53 65 74 20 74 68 65 20 69 6e 64 65 78 20 69   Set the index i
2c10: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74  n db->aDb[] of t
2c20: 68 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64  he database hold
2c30: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2c50: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  he table..**    
2c60: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20  pExpr->iTable   
2c70: 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20       Set to the 
2c80: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
2c90: 72 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61  r the table obta
2ca0: 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ined.**         
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 66 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a  from pSrcList..*
2cd0: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  *    pExpr->iCol
2ce0: 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f  umn       Set to
2cf0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
2d00: 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  er within the ta
2d10: 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ble..**    pExpr
2d20: 2d 3e 64 61 74 61 54 79 70 65 20 20 20 20 20 20  ->dataType      
2d30: 53 65 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  Set to the appro
2d40: 70 72 69 61 74 65 20 64 61 74 61 20 74 79 70 65  priate data type
2d50: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e   for the column.
2d60: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .**    pExpr->op
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20              Set 
2d80: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a  to TK_COLUMN..**
2d90: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
2da0: 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70           Any exp
2db0: 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69  ression this poi
2dc0: 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65  nts to is delete
2dd0: 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  d.**    pExpr->p
2de0: 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79  Right        Any
2df0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
2e00: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
2e10: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
2e20: 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65   pDbToken is the
2e30: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2e40: 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29 2e  abase (the "X").
2e50: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
2e60: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e   be.** NULL mean
2e70: 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73  ing that name is
2e80: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a   of the form Y.Z
2e90: 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69   or Z.  Any avai
2ea0: 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a  lable database.*
2eb0: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20  * can be used.  
2ec0: 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20  The pTableToken 
2ed0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
2ee0: 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59  he table (the "Y
2ef0: 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c  ").  This.** val
2f00: 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69  ue can be NULL i
2f10: 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c  f pDbToken is al
2f20: 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61  so NULL.  If pTa
2f30: 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  bleToken is NULL
2f40: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61   it.** means tha
2f50: 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68  t the form of th
2f60: 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20  e name is Z and 
2f70: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  that columns fro
2f80: 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63  m any table.** c
2f90: 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a  an be used..**.*
2fa0: 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61  * If the name ca
2fb0: 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64  nnot be resolved
2fc0: 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20   unambiguously, 
2fd0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2fe0: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
2ff0: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rse and return n
3000: 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e  on-zero.  Return
3010: 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
3020: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3030: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61  lookupName(.  Pa
3040: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3050: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
3060: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
3070: 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20  ken *pDbToken,  
3080: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3090: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
30a0: 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20  ining table, or 
30b0: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
30c0: 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f  *pTableToken,  /
30d0: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
30e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
30f0: 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  n, or NULL */.  
3100: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f  Token *pColumnTo
3110: 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ken, /* Name of 
3120: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20  the column. */. 
3130: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
3140: 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  st,   /* List of
3150: 20 74 61 62 6c 65 73 20 75 73 65 64 20 74 6f 20   tables used to 
3160: 72 65 73 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e  resolve column n
3170: 61 6d 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ames */.  ExprLi
3180: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f  st *pEList,    /
3190: 2a 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73  * List of expres
31a0: 73 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 72 65  sions used to re
31b0: 73 6f 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20 20  solve "AS" */.  
31c0: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
31d0: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69       /* Make thi
31e0: 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e  s EXPR node poin
31f0: 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65  t to the selecte
3200: 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  d column */.){. 
3210: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20   char *zDb = 0; 
3220: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3230: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
3240: 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a  The "X" in X.Y.Z
3250: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62   */.  char *zTab
3260: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
3270: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  me of the table.
3280: 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59    The "Y" in X.Y
3290: 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63  .Z or Y.Z */.  c
32a0: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20  har *zCol = 0;  
32b0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
32c0: 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  he column.  The 
32d0: 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  "Z" */.  int i, 
32e0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
32f0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
3300: 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
3310: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3320: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
3330: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
3340: 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b   int cntTab = 0;
3350: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3360: 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  of matching tabl
3370: 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c  e names */.  sql
3380: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
3390: 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61  ->db;  /* The da
33a0: 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  tabase */..  ass
33b0: 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ert( pColumnToke
33c0: 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  n && pColumnToke
33d0: 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65 20 5a  n->z ); /* The Z
33e0: 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74   in X.Y.Z cannot
33f0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66   be NULL */.  if
3400: 28 20 70 44 62 54 6f 6b 65 6e 20 26 26 20 70 44  ( pDbToken && pD
3410: 62 54 6f 6b 65 6e 2d 3e 7a 20 29 7b 0a 20 20 20  bToken->z ){.   
3420: 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 53 74 72   zDb = sqliteStr
3430: 4e 44 75 70 28 70 44 62 54 6f 6b 65 6e 2d 3e 7a  NDup(pDbToken->z
3440: 2c 20 70 44 62 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a  , pDbToken->n);.
3450: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
3460: 65 28 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  e(zDb);.  }else{
3470: 0a 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a 20 20  .    zDb = 0;.  
3480: 7d 0a 20 20 69 66 28 20 70 54 61 62 6c 65 54 6f  }.  if( pTableTo
3490: 6b 65 6e 20 26 26 20 70 54 61 62 6c 65 54 6f 6b  ken && pTableTok
34a0: 65 6e 2d 3e 7a 20 29 7b 0a 20 20 20 20 7a 54 61  en->z ){.    zTa
34b0: 62 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  b = sqliteStrNDu
34c0: 70 28 70 54 61 62 6c 65 54 6f 6b 65 6e 2d 3e 7a  p(pTableToken->z
34d0: 2c 20 70 54 61 62 6c 65 54 6f 6b 65 6e 2d 3e 6e  , pTableToken->n
34e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71  );.    sqliteDeq
34f0: 75 6f 74 65 28 7a 54 61 62 29 3b 0a 20 20 7d 65  uote(zTab);.  }e
3500: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
3510: 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 7a   zDb==0 );.    z
3520: 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a  Tab = 0;.  }.  z
3530: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  Col = sqliteStrN
3540: 44 75 70 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e  Dup(pColumnToken
3550: 2d 3e 7a 2c 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ->z, pColumnToke
3560: 6e 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  n->n);.  sqliteD
3570: 65 71 75 6f 74 65 28 7a 43 6f 6c 29 3b 0a 20 20  equote(zCol);.  
3580: 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  if( sqlite_mallo
3590: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
35a0: 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4c 65  return 1;  /* Le
35b0: 61 6b 20 6d 65 6d 6f 72 79 20 28 7a 44 62 20 61  ak memory (zDb a
35c0: 6e 64 20 7a 54 61 62 29 20 69 66 20 6d 61 6c 6c  nd zTab) if mall
35d0: 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 7d 0a  oc fails */.  }.
35e0: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d    assert( zTab==
35f0: 30 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30 20 29  0 || pEList==0 )
3600: 3b 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62  ;..  pExpr->iTab
3610: 6c 65 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69  le = -1;.  for(i
3620: 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
3630: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
3640: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3650: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
3660: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  rcList->a[i];.  
3670: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
3680: 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pItem->pTab;.   
3690: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a   Column *pCol;..
36a0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
36b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
36c0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
36d0: 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ol>0 );.    if( 
36e0: 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 66  zTab ){.      if
36f0: 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
3700: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
3710: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74 65  *zTabName = pIte
3720: 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
3730: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
3740: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
3750: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
3760: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
3770: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
3780: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
3790: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
37a0: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
37b0: 7c 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  | sqliteStrICmp(
37c0: 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21  zTabName, zTab)!
37d0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
37e0: 20 20 20 20 20 20 20 69 66 28 20 7a 44 62 21 3d         if( zDb!=
37f0: 30 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43  0 && sqliteStrIC
3800: 6d 70 28 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d  mp(db->aDb[pTab-
3810: 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62  >iDb].zName, zDb
3820: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
3830: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3840: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3850: 20 20 7d 0a 20 20 20 20 69 66 28 20 30 3d 3d 28    }.    if( 0==(
3860: 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20  cntTab++) ){.   
3870: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
3880: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
3890: 72 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  r;.      pExpr->
38a0: 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
38b0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a  .    }.    for(j
38c0: 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61  =0, pCol=pTab->a
38d0: 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  Col; j<pTab->nCo
38e0: 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; j++, pCol++){
38f0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3900: 65 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  eStrICmp(pCol->z
3910: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
3920: 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b  {.        cnt++;
3930: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
3940: 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e  iTable = pItem->
3950: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
3960: 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54   pExpr->iDb = pT
3970: 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20  ab->iDb;.       
3980: 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74   /* Substitute t
3990: 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e  he rowid (column
39a0: 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54   -1) for the INT
39b0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
39c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70   */.        pExp
39d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d  r->iColumn = j==
39e0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31  pTab->iPKey ? -1
39f0: 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 70 45   : j;.        pE
3a00: 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20  xpr->dataType = 
3a10: 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20  pCol->sortOrder 
3a20: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45  & SQLITE_SO_TYPE
3a30: 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20 62 72  MASK;.        br
3a40: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3a50: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3a60: 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65  we have not alre
3a70: 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65  ady resolved the
3a80: 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62   name, then mayb
3a90: 65 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 61 20  e .  ** it is a 
3aa0: 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74  new.* or old.* t
3ab0: 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20  rigger argument 
3ac0: 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2f 0a 20  reference.  */. 
3ad0: 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a   if( zDb==0 && z
3ae0: 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30  Tab!=0 && cnt==0
3af0: 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67   && pParse->trig
3b00: 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20  Stack!=0 ){.    
3b10: 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54  TriggerStack *pT
3b20: 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50  riggerStack = pP
3b30: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b  arse->trigStack;
3b40: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
3b50: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54   = 0;.    if( pT
3b60: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77  riggerStack->new
3b70: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
3b80: 69 74 65 53 74 72 49 43 6d 70 28 22 6e 65 77 22  iteStrICmp("new"
3b90: 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a  , zTab) == 0 ){.
3ba0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
3bb0: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
3bc0: 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20  ack->newIdx;.   
3bd0: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
3be0: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29  gerStack->pTab )
3bf0: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
3c00: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
3c10: 61 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ab;.    }else if
3c20: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
3c30: 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26 26  >oldIdx != -1 &&
3c40: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 22   sqliteStrICmp("
3c50: 6f 6c 64 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30  old", zTab) == 0
3c60: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
3c70: 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67  >iTable = pTrigg
3c80: 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b  erStack->oldIdx;
3c90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3ca0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
3cb0: 61 62 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  ab );.      pTab
3cc0: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
3cd0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d 0a 0a 20  ->pTab;.    }.. 
3ce0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 20 0a     if( pTab ){ .
3cf0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
3d00: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20     Column *pCol 
3d10: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  = pTab->aCol;.  
3d20: 20 20 20 20 0a 20 20 20 20 20 20 70 45 78 70 72      .      pExpr
3d30: 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44  ->iDb = pTab->iD
3d40: 62 3b 0a 20 20 20 20 20 20 63 6e 74 54 61 62 2b  b;.      cntTab+
3d50: 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  +;.      for(j=0
3d60: 3b 20 6a 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c  ; j < pTab->nCol
3d70: 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b  ; j++, pCol++) {
3d80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
3d90: 69 74 65 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  iteStrICmp(pCol-
3da0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
3db0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6e   ){.          cn
3dc0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
3dd0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
3de0: 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f  j==pTab->iPKey ?
3df0: 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20   -1 : j;.       
3e00: 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79     pExpr->dataTy
3e10: 70 65 20 3d 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f  pe = pCol->sortO
3e20: 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f  rder & SQLITE_SO
3e30: 5f 54 59 50 45 4d 41 53 4b 3b 0a 20 20 20 20 20  _TYPEMASK;.     
3e40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3e50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3e60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
3e70: 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  ** Perhaps the n
3e80: 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e  ame is a referen
3e90: 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a  ce to the ROWID.
3ea0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d    */.  if( cnt==
3eb0: 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26  0 && cntTab==1 &
3ec0: 26 20 73 71 6c 69 74 65 49 73 52 6f 77 69 64 28  & sqliteIsRowid(
3ed0: 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 6e 74  zCol) ){.    cnt
3ee0: 20 3d 20 31 3b 0a 20 20 20 20 70 45 78 70 72 2d   = 1;.    pExpr-
3ef0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  >iColumn = -1;. 
3f00: 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79     pExpr->dataTy
3f10: 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e  pe = SQLITE_SO_N
3f20: 55 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  UM;.  }..  /*.  
3f30: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
3f40: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a  is of the form Z
3f50: 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59   (not Y.Z or X.Y
3f60: 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d  .Z) then the nam
3f70: 65 20 5a 0a 20 20 2a 2a 20 6d 69 67 68 74 20 72  e Z.  ** might r
3f80: 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c  efer to an resul
3f90: 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68  t-set alias.  Th
3fa0: 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20  is happens, for 
3fb0: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20  example, when.  
3fc0: 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76  ** we are resolv
3fd0: 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  ing names in the
3fe0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
3ff0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
4000: 6f 6d 6d 61 6e 64 3a 0a 20 20 2a 2a 0a 20 20 2a  ommand:.  **.  *
4010: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62  *     SELECT a+b
4020: 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65   AS x FROM table
4030: 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 2a   WHERE x<10;.  *
4040: 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20  *.  ** In cases 
4050: 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61  like this, repla
4060: 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20  ce pExpr with a 
4070: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
4080: 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a  ession that.  **
4090: 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c   forms the resul
40a0: 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b  t set entry ("a+
40b0: 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c  b" in the exampl
40c0: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  e) and return im
40d0: 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2a 20  mediately..  ** 
40e0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65 78  Note that the ex
40f0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
4100: 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c  result set shoul
4110: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
4120: 65 65 6e 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65  een.  ** resolve
4130: 64 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  d by the time th
4140: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
4150: 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 2a 2f  s resolved..  */
4160: 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26  .  if( cnt==0 &&
4170: 20 70 45 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20   pEList!=0 ){.  
4180: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c    for(j=0; j<pEL
4190: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ist->nExpr; j++)
41a0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41  {.      char *zA
41b0: 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  s = pEList->a[j]
41c0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66  .zName;.      if
41d0: 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69  ( zAs!=0 && sqli
41e0: 74 65 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a  teStrICmp(zAs, z
41f0: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
4200: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
4210: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
4220: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
4230: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
4240: 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20  >op = TK_AS;.   
4250: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
4260: 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
4270: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
4280: 73 71 6c 69 74 65 45 78 70 72 44 75 70 28 70 45  sqliteExprDup(pE
4290: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
42a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
42b0: 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20  eFree(zCol);.   
42c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54 61       assert( zTa
42d0: 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29  b==0 && zDb==0 )
42e0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
42f0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
4300: 7d 20 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  } .  }..  /*.  *
4310: 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61 72 65  * If X and Y are
4320: 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20   NULL (in other 
4330: 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68  words if only th
4340: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20  e column name Z 
4350: 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64  is.  ** supplied
4360: 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  ) and the value 
4370: 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64  of Z is enclosed
4380: 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65   in double-quote
4390: 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69  s, then.  ** Z i
43a0: 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  s a string liter
43b0: 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  al if it doesn't
43c0: 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d   match any colum
43d0: 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61  n names.  In tha
43e0: 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20  t.  ** case, we 
43f0: 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72  need to return r
4400: 69 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f  ight away and no
4410: 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67  t make any chang
4420: 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72  es to.  ** pExpr
4430: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
4440: 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26  ==0 && zTab==0 &
4450: 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e  & pColumnToken->
4460: 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  z[0]=='"' ){.   
4470: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
4480: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
4490: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
44a0: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
44b0: 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68  re was not match
44c0: 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74  .  cnt>1 means t
44d0: 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72  here were two or
44e0: 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68  .  ** more match
44f0: 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  es.  Either way,
4500: 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f   we have an erro
4510: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  r..  */.  if( cn
4520: 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 68 61 72  t!=1 ){.    char
4530: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68 61   *z = 0;.    cha
4540: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72  r *zErr;.    zEr
4550: 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f  r = cnt==0 ? "no
4560: 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73   such column: %s
4570: 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63  " : "ambiguous c
4580: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b  olumn name: %s";
4590: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  .    if( zDb ){.
45a0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
45b0: 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20 22  tring(&z, zDb, "
45c0: 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  .", zTab, ".", z
45d0: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Col, 0);.    }el
45e0: 73 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20  se if( zTab ){. 
45f0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
4600: 72 69 6e 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22  ring(&z, zTab, "
4610: 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20  .", zCol, 0);.  
4620: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
4630: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
4640: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCol);.    }.   
4650: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
4660: 70 50 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a 29  pParse, zErr, z)
4670: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
4680: 28 7a 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  (z);.  }..  /* C
4690: 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75  lean up and retu
46a0: 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
46b0: 46 72 65 65 28 7a 44 62 29 3b 0a 20 20 73 71 6c  Free(zDb);.  sql
46c0: 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20  iteFree(zTab);. 
46d0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
46e0: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 44  );.  sqliteExprD
46f0: 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 4c 65  elete(pExpr->pLe
4700: 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  ft);.  pExpr->pL
4710: 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  eft = 0;.  sqlit
4720: 65 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  eExprDelete(pExp
4730: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45  r->pRight);.  pE
4740: 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b  xpr->pRight = 0;
4750: 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  .  pExpr->op = T
4760: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 73 71 6c 69  K_COLUMN;.  sqli
4770: 74 65 41 75 74 68 52 65 61 64 28 70 50 61 72 73  teAuthRead(pPars
4780: 65 2c 20 70 45 78 70 72 2c 20 70 53 72 63 4c 69  e, pExpr, pSrcLi
4790: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e  st);.  return cn
47a0: 74 21 3d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  t!=1;.}../*.** T
47b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
47c0: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
47d0: 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65  tree and resolve
47e0: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a  s references to.
47f0: 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ** table columns
4800: 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20  .  Nodes of the 
4810: 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44  form ID.ID or ID
4820: 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e   resolve into an
4830: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65  .** index to the
4840: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61   table in the ta
4850: 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63  ble list and a c
4860: 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54  olumn offset.  T
4870: 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f  he .** Expr.opco
4880: 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65  de for such node
4890: 73 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  s is changed to 
48a0: 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20  TK_COLUMN.  The 
48b0: 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76  Expr.iTable.** v
48c0: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
48d0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
48e0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
48f0: 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
4900: 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22 62 61  .** plus the "ba
4910: 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68 65 20  se" value.  The 
4920: 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c 6c 20  base value will 
4930: 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d  ultimately becom
4940: 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63 75  e the.** VDBE cu
4950: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
4960: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73  a cursor that is
4970: 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74   pointing into t
4980: 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  he referenced.**
4990: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70   table.  The Exp
49a0: 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  r.iColumn value 
49b0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
49c0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
49d0: 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65  olumn .** of the
49e0: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
49f0: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
4a00: 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20 74  lumn value for t
4a10: 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f  he special.** RO
4a20: 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31  WID column is -1
4a30: 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20 50  .  Any INTEGER P
4a40: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
4a50: 6e 20 69 73 20 74 72 69 65 64 20 61 73 20 61 6e  n is tried as an
4a60: 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52 4f  .** alias for RO
4a70: 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 6c  WID..**.** We al
4a80: 73 6f 20 63 68 65 63 6b 20 66 6f 72 20 69 6e 73  so check for ins
4a90: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 49 4e  tances of the IN
4aa0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 4e 20 63   operator.  IN c
4ab0: 6f 6d 65 73 20 69 6e 20 74 77 6f 0a 2a 2a 20 66  omes in two.** f
4ac0: 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  orms:.**.**     
4ad0: 20 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65        expr IN (e
4ae0: 78 70 72 6c 69 73 74 29 0a 2a 2a 20 61 6e 64 0a  xprlist).** and.
4af0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78 70  **           exp
4b00: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
4b10: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ).**.** The firs
4b20: 74 20 66 6f 72 6d 20 69 73 20 68 61 6e 64 6c 65  t form is handle
4b30: 64 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  d by creating a 
4b40: 73 65 74 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  set holding the 
4b50: 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 6f 77  list.** of allow
4b60: 65 64 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20  ed values.  The 
4b70: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 61 75 73  second form caus
4b80: 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 74 6f  es the SELECT to
4b90: 20 67 65 6e 65 72 61 74 65 20 0a 2a 2a 20 61 20   generate .** a 
4ba0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
4bb0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4bc0: 69 6e 65 20 61 6c 73 6f 20 6c 6f 6f 6b 73 20 66  ine also looks f
4bd0: 6f 72 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54  or scalar SELECT
4be0: 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20  s that are part 
4bf0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
4c00: 2e 0a 2a 2a 20 49 66 20 69 74 20 66 69 6e 64 73  ..** If it finds
4c10: 20 61 6e 79 2c 20 69 74 20 67 65 6e 65 72 61 74   any, it generat
4c20: 65 73 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  es code to write
4c30: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
4c40: 61 74 20 73 65 6c 65 63 74 0a 2a 2a 20 69 6e 74  at select.** int
4c50: 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  o a memory cell.
4c60: 0a 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f 77 6e 20 63  .**.** Unknown c
4c70: 6f 6c 75 6d 6e 73 20 6f 72 20 74 61 62 6c 65 73  olumns or tables
4c80: 20 70 72 6f 76 6f 6b 65 20 61 6e 20 65 72 72 6f   provoke an erro
4c90: 72 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  r.  The function
4ca0: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
4cb0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
4cc0: 20 73 65 65 6e 20 61 6e 64 20 6c 65 61 76 65 73   seen and leaves
4cd0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
4ce0: 65 20 6f 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e on pParse->zEr
4cf0: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
4d00: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
4d10: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
4d20: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
4d30: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4d40: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
4d50: 4c 69 73 74 2c 20 2f 2a 20 4c 69 73 74 20 6f 66  List, /* List of
4d60: 20 74 61 62 6c 65 73 20 75 73 65 64 20 74 6f 20   tables used to 
4d70: 72 65 73 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e  resolve column n
4d80: 61 6d 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ames */.  ExprLi
4d90: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20  st *pEList,  /* 
4da0: 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  List of expressi
4db0: 6f 6e 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f  ons used to reso
4dc0: 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20 20 45 78  lve "AS" */.  Ex
4dd0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
4de0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
4df0: 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  on to be analyze
4e00: 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  d. */.){.  int i
4e10: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
4e20: 30 20 7c 7c 20 70 53 72 63 4c 69 73 74 3d 3d 30  0 || pSrcList==0
4e30: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
4e40: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
4e50: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
4e60: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
4e70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
4e80: 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c 69 73  or>=0 && pSrcLis
4e90: 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c  t->a[i].iCursor<
4ea0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 29 3b 0a  pParse->nTab );.
4eb0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45    }.  switch( pE
4ec0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
4ed0: 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  * Double-quoted 
4ee0: 73 74 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62  strings (ex: "ab
4ef0: 63 22 29 20 61 72 65 20 75 73 65 64 20 61 73 20  c") are used as 
4f00: 69 64 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20  identifiers if. 
4f10: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20     ** possible. 
4f20: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 79 20   Otherwise they 
4f30: 72 65 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67  remain as string
4f40: 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65  s.  Single-quote
4f50: 64 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73  d.    ** strings
4f60: 20 28 65 78 3a 20 27 61 62 63 27 29 20 61 72 65   (ex: 'abc') are
4f70: 20 61 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c   always string l
4f80: 69 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a  iterals..    */.
4f90: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
4fa0: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  NG: {.      if( 
4fb0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  pExpr->token.z[0
4fc0: 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b  ]=='\'' ) break;
4fd0: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
4fe0: 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
4ff0: 49 44 20 63 61 73 65 20 69 66 20 74 68 69 73 20  ID case if this 
5000: 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  is a double-quot
5010: 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  ed string */.   
5020: 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65   }.    /* A lone
5030: 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20 74   identifier is t
5040: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
5050: 75 6d 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  umnd..    */.   
5060: 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20   case TK_ID: {. 
5070: 20 20 20 20 20 69 66 28 20 6c 6f 6f 6b 75 70 4e       if( lookupN
5080: 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  ame(pParse, 0, 0
5090: 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  , &pExpr->token,
50a0: 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69 73   pSrcList, pELis
50b0: 74 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20  t, pExpr) ){.   
50c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
50d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
50e0: 61 6b 3b 20 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ak; .    }.  .  
50f0: 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d    /* A table nam
5100: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e and column nam
5110: 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20 20 20  e:     ID.ID.   
5120: 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62 61 73   ** Or a databas
5130: 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  e, table and col
5140: 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20  umn:  ID.ID.ID. 
5150: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
5160: 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 54  K_DOT: {.      T
5170: 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20  oken *pColumn;. 
5180: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62       Token *pTab
5190: 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  le;.      Token 
51a0: 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78 70 72  *pDb;.      Expr
51b0: 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20 20 20   *pRight;..     
51c0: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
51d0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69  >pRight;.      i
51e0: 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  f( pRight->op==T
51f0: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
5200: 70 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pDb = 0;.       
5210: 20 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72   pTable = &pExpr
5220: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
5230: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
5240: 3d 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  = &pRight->token
5250: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5260: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5270: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  Right->op==TK_DO
5280: 54 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62  T );.        pDb
5290: 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74   = &pExpr->pLeft
52a0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
52b0: 20 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68   pTable = &pRigh
52c0: 74 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  t->pLeft->token;
52d0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  .        pColumn
52e0: 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67   = &pRight->pRig
52f0: 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ht->token;.     
5300: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 6f 6f   }.      if( loo
5310: 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  kupName(pParse, 
5320: 70 44 62 2c 20 70 54 61 62 6c 65 2c 20 70 43 6f  pDb, pTable, pCo
5330: 6c 75 6d 6e 2c 20 70 53 72 63 4c 69 73 74 2c 20  lumn, pSrcList, 
5340: 30 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20  0, pExpr) ){.   
5350: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5370: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
5380: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
5390: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
53a0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
53b0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d  e);.      if( v=
53c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
53d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
53e0: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
53f0: 61 72 73 65 2c 20 70 53 72 63 4c 69 73 74 2c 20  arse, pSrcList, 
5400: 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70  pEList, pExpr->p
5410: 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
5420: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
5430: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
5440: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
5450: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
5460: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
5470: 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
5480: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
5490: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
54a0: 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
54b0: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
54c0: 74 20 69 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61  t into a tempora
54d0: 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ry.        ** ta
54e0: 62 6c 65 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ble.  The cursor
54f0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
5500: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
5510: 61 73 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  as already.     
5520: 20 20 20 2a 2a 20 62 65 65 6e 20 70 75 74 20 69     ** been put i
5530: 6e 20 69 54 61 62 6c 65 20 62 79 20 73 71 6c 69  n iTable by sqli
5540: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53  teExprResolveInS
5550: 65 6c 65 63 74 28 29 2e 0a 20 20 20 20 20 20 20  elect()..       
5560: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70   */.        pExp
5570: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
5580: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
5590: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
55a0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65  dOp(v, OP_OpenTe
55b0: 6d 70 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  mp, pExpr->iTabl
55c0: 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 1);.        s
55d0: 71 6c 69 74 65 53 65 6c 65 63 74 28 70 50 61 72  qliteSelect(pPar
55e0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  se, pExpr->pSele
55f0: 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78  ct, SRT_Set, pEx
5600: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 30 2c  pr->iTable, 0,0,
5610: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
5620: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  if( pExpr->pList
5630: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
5640: 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
5650: 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
5660: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
5670: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 73 65 74   ** Create a set
5680: 20 74 6f 20 70 75 74 20 74 68 65 20 65 78 70 72   to put the expr
5690: 6c 69 73 74 20 76 61 6c 75 65 73 20 69 6e 2e 20  list values in. 
56a0: 20 54 68 65 20 53 65 74 20 69 64 20 69 73 20 73   The Set id is s
56b0: 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  tored.        **
56c0: 20 69 6e 20 69 54 61 62 6c 65 2e 0a 20 20 20 20   in iTable..    
56d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
56e0: 6e 74 20 69 2c 20 69 53 65 74 3b 0a 20 20 20 20  nt i, iSet;.    
56f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5700: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
5710: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
5720: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
5730: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
5740: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
5750: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 45      if( !sqliteE
5760: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
5770: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
5780: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
5790: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
57a0: 20 20 20 20 20 20 20 22 72 69 67 68 74 2d 68 61         "right-ha
57b0: 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 6f 70  nd side of IN op
57c0: 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 63  erator must be c
57d0: 6f 6e 73 74 61 6e 74 22 29 3b 0a 20 20 20 20 20  onstant");.     
57e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
57f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5800: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
5810: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
5820: 65 2c 20 70 45 32 2c 20 30 2c 20 30 29 20 29 7b  e, pE2, 0, 0) ){
5830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
5840: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20  urn 1;.         
5850: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
5860: 20 20 20 20 20 69 53 65 74 20 3d 20 70 45 78 70       iSet = pExp
5870: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
5880: 73 65 2d 3e 6e 53 65 74 2b 2b 3b 0a 20 20 20 20  se->nSet++;.    
5890: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
58a0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
58b0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
58c0: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
58d0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
58e0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
58f0: 20 20 20 20 73 77 69 74 63 68 28 20 70 45 32 2d      switch( pE2-
5900: 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >op ){.         
5910: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
5920: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  :.            ca
5930: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
5940: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
5950: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
5960: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61             int a
5970: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ddr;.           
5980: 20 20 20 61 73 73 65 72 74 28 20 70 45 32 2d 3e     assert( pE2->
5990: 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20  token.z );.     
59a0: 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20           addr = 
59b0: 73 71 6c 69 74 65 56 64 62 65 4f 70 33 28 76 2c  sqliteVdbeOp3(v,
59c0: 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 69   OP_SetInsert, i
59d0: 53 65 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  Set, 0,.        
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 20 20 20 20 20 20 20 20 70 45 32 2d 3e 74            pE2->t
5a00: 6f 6b 65 6e 2e 7a 2c 20 70 45 32 2d 3e 74 6f 6b  oken.z, pE2->tok
5a10: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  en.n);.         
5a20: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44       sqliteVdbeD
5a30: 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72  equoteP3(v, addr
5a40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
5a50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5a60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5a70: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5a80: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
5a90: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
5aa0: 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20  , pE2);.        
5ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5ac0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 49  AddOp(v, OP_SetI
5ad0: 6e 73 65 72 74 2c 20 69 53 65 74 2c 20 30 29 3b  nsert, iSet, 0);
5ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
5af0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
5b00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
5b10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5b20: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5b30: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
5b40: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
5b50: 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f    /* This has to
5b60: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
5b70: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
5b80: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
5b90: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
5ba0: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
5bb0: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
5bc0: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
5bd0: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
5be0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
5bf0: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20  in iColumn..    
5c00: 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72    */.      pExpr
5c10: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 61 72  ->iColumn = pPar
5c20: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
5c30: 20 20 69 66 28 20 73 71 6c 69 74 65 53 65 6c 65    if( sqliteSele
5c40: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
5c50: 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 4d  ->pSelect, SRT_M
5c60: 65 6d 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  em, pExpr->iColu
5c70: 6d 6e 2c 30 2c 30 2c 30 29 20 29 7b 0a 20 20 20  mn,0,0,0) ){.   
5c80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5c90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5ca0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5cb0: 2a 20 46 6f 72 20 61 6c 6c 20 65 6c 73 65 2c 20  * For all else, 
5cc0: 6a 75 73 74 20 72 65 63 75 72 73 69 76 65 6c 79  just recursively
5cd0: 20 77 61 6c 6b 20 74 68 65 20 74 72 65 65 20 2a   walk the tree *
5ce0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
5cf0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
5d00: 2d 3e 70 4c 65 66 74 0a 20 20 20 20 20 20 26 26  ->pLeft.      &&
5d10: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
5d20: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 53  veIds(pParse, pS
5d30: 72 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  rcList, pEList, 
5d40: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b  pExpr->pLeft) ){
5d50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5d60: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
5d70: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
5d80: 68 74 20 0a 20 20 20 20 20 20 26 26 20 73 71 6c  ht .      && sql
5d90: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
5da0: 73 28 70 50 61 72 73 65 2c 20 70 53 72 63 4c 69  s(pParse, pSrcLi
5db0: 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70  st, pEList, pExp
5dc0: 72 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a 20 20  r->pRight) ){.  
5dd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
5de0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5df0: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29  ( pExpr->pList )
5e00: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
5e10: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
5e20: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
5e30: 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  ->pList;.       
5e40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
5e50: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
5e60: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
5e70: 70 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  pArg = pList->a[
5e80: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
5e90: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
5ea0: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
5eb0: 72 73 65 2c 20 70 53 72 63 4c 69 73 74 2c 20 70  rse, pSrcList, p
5ec0: 45 4c 69 73 74 2c 20 70 41 72 67 29 20 29 7b 0a  EList, pArg) ){.
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
5ee0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 1;.          
5ef0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
5f00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5f10: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
5f20: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 6e 6f  ** pExpr is a no
5f30: 64 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  de that defines 
5f40: 61 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f  a function of so
5f50: 6d 65 20 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67  me kind.  It mig
5f60: 68 74 0a 2a 2a 20 62 65 20 61 20 73 79 6e 74 61  ht.** be a synta
5f70: 63 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69  ctic function li
5f80: 6b 65 20 22 63 6f 75 6e 74 28 78 29 22 20 6f 72  ke "count(x)" or
5f90: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 66   it might be a f
5fa0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  unction.** that 
5fb0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70  implements an op
5fc0: 65 72 61 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20  erator, like "a 
5fd0: 4c 49 4b 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a  LIKE b".  .**.**
5fe0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
5ff0: 6b 65 73 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e  kes *pzName poin
6000: 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66  t to the name of
6010: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e   the function an
6020: 64 20 0a 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f  d .** *pnName ho
6030: 6c 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ld the number of
6040: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
6050: 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
6060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6070: 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65   getFunctionName
6080: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f  (Expr *pExpr, co
6090: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d  nst char **pzNam
60a0: 65 2c 20 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b  e, int *pnName){
60b0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
60c0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
60d0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
60e0: 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20        *pzName = 
60f0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
6100: 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20        *pnName = 
6110: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a  pExpr->token.n;.
6120: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6130: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
6140: 49 4b 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a  IKE: {.      *pz
6150: 4e 61 6d 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20  Name = "like";. 
6160: 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34       *pnName = 4
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 20 20 63 61 73 65 20 54 4b     }.    case TK
6190: 5f 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a  _GLOB: {.      *
61a0: 70 7a 4e 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b  pzName = "glob";
61b0: 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d  .      *pnName =
61c0: 20 34 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   4;.      break;
61d0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
61e0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  lt: {.      *pzN
61f0: 61 6d 65 20 3d 20 22 63 61 6e 27 74 20 68 61 70  ame = "can't hap
6200: 70 65 6e 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e  pen";.      *pnN
6210: 61 6d 65 20 3d 20 31 32 3b 0a 20 20 20 20 20 20  ame = 12;.      
6220: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
6230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20  .}../*.** Error 
6240: 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69  check the functi
6250: 6f 6e 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73  ons in an expres
6260: 73 69 6f 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65  sion.  Make sure
6270: 20 61 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   all.** function
6280: 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67   names are recog
6290: 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75  nized and all fu
62a0: 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 74 68 65  nctions have the
62b0: 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62   correct.** numb
62c0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
62d0: 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72    Leave an error
62e0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
62f0: 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69  se->zErrMsg.** i
6300: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d  f anything is am
6310: 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  iss.  Return the
6320: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
6330: 73 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41  s..**.** if pIsA
6340: 67 67 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61  gg is not null a
6350: 6e 64 20 74 68 69 73 20 65 78 70 72 65 73 73 69  nd this expressi
6360: 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  on is an aggrega
6370: 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28  te function.** (
6380: 6c 69 6b 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72  like count(*) or
6390: 20 6d 61 78 28 76 61 6c 75 65 29 29 20 74 68 65   max(value)) the
63a0: 6e 20 77 72 69 74 65 20 61 20 31 20 69 6e 74 6f  n write a 1 into
63b0: 20 2a 70 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74   *pIsAgg..*/.int
63c0: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
63d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
63e0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
63f0: 20 61 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20 2a   allowAgg, int *
6400: 70 49 73 41 67 67 29 7b 0a 20 20 69 6e 74 20 6e  pIsAgg){.  int n
6410: 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Err = 0;.  if( p
6420: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
6430: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   0;.  switch( pE
6440: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
6450: 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20  ase TK_GLOB:.   
6460: 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20   case TK_LIKE:. 
6470: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
6480: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
6490: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73   n = pExpr->pLis
64a0: 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t ? pExpr->pList
64b0: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a  ->nExpr : 0;  /*
64c0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
64d0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
64e0: 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d  t no_such_func =
64f0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75   0;       /* Tru
6500: 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e  e if no such fun
6510: 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a  ction exists */.
6520: 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f        int wrong_
6530: 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20  num_args = 0;   
6540: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f    /* True if wro
6550: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
6560: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
6570: 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20  int is_agg = 0; 
6580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6590: 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67 67  rue if is an agg
65a0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
65b0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  */.      int i;.
65c0: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
65f0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e  haracters in fun
6600: 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
6610: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6620: 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  zId;            
6630: 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
6640: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46  name. */.      F
6650: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 0a 20  uncDef *pDef;.. 
6660: 20 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e       getFunction
6670: 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64  Name(pExpr, &zId
6680: 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70  , &nId);.      p
6690: 44 65 66 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Def = sqliteFind
66a0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
66b0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  >db, zId, nId, n
66c0: 2c 20 30 29 3b 0a 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 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
66f0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
6700: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
6710: 64 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  d, -1, 0);.     
6720: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
6730: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73  {.          no_s
6740: 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20  uch_func = 1;.  
6750: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6760: 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d         wrong_num
6770: 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20  _args = 1;.     
6780: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
6790: 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  {.        is_agg
67a0: 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d   = pDef->xFunc==
67b0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
67c0: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21   if( is_agg && !
67d0: 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20  allowAgg ){.    
67e0: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
67f0: 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
6800: 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  se of aggregate 
6810: 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22  function %.*s()"
6820: 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20  , nId, zId);.   
6830: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
6840: 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b       is_agg = 0;
6850: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6860: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b   no_such_func ){
6870: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45  .        sqliteE
6880: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6890: 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f  "no such functio
68a0: 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a  n: %.*s", nId, z
68b0: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72  Id);.        nEr
68c0: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
68d0: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
68e0: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
68f0: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
6900: 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62  arse,"wrong numb
6910: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
6920: 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  to function %.*s
6930: 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ()",.           
6940: 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20    nId, zId);.   
6950: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
6960: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
6970: 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20  s_agg ){.       
6980: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
6990: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20  AGG_FUNCTION;.  
69a0: 20 20 20 20 20 20 69 66 28 20 70 49 73 41 67 67        if( pIsAgg
69b0: 20 29 20 2a 70 49 73 41 67 67 20 3d 20 31 3b 0a   ) *pIsAgg = 1;.
69c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
69d0: 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26  r(i=0; nErr==0 &
69e0: 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  & i<n; i++){.   
69f0: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
6a00: 74 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  teExprCheck(pPar
6a10: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
6a20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20  ->a[i].pExpr,.  
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6c 6c               all
6a50: 6f 77 41 67 67 20 26 26 20 21 69 73 5f 61 67 67  owAgg && !is_agg
6a60: 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20  , pIsAgg);.     
6a70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   }.      if( pDe
6a80: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
6a90: 2f 2a 20 41 6c 72 65 61 64 79 20 72 65 70 6f 72  /* Already repor
6aa0: 74 65 64 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ted an error */.
6ab0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6ac0: 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65 3e 3d  pDef->dataType>=
6ad0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
6ae0: 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65 3c   pDef->dataType<
6af0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  n ){.          p
6b00: 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d  Expr->dataType =
6b10: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73   .             s
6b20: 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 70 45  qliteExprType(pE
6b30: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 70 44  xpr->pList->a[pD
6b40: 65 66 2d 3e 64 61 74 61 54 79 70 65 5d 2e 70 45  ef->dataType].pE
6b50: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  xpr);.        }e
6b60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
6b70: 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d  Expr->dataType =
6b80: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a   SQLITE_SO_NUM;.
6b90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6ba0: 7d 65 6c 73 65 20 69 66 28 20 70 44 65 66 2d 3e  }else if( pDef->
6bb0: 64 61 74 61 54 79 70 65 3d 3d 53 51 4c 49 54 45  dataType==SQLITE
6bc0: 5f 41 52 47 53 20 29 7b 0a 20 20 20 20 20 20 20  _ARGS ){.       
6bd0: 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65 20   pDef->dataType 
6be0: 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  = SQLITE_SO_TEXT
6bf0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
6c00: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
6c10: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
6c20: 74 65 45 78 70 72 54 79 70 65 28 70 45 78 70 72  teExprType(pExpr
6c30: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
6c40: 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  xpr)==SQLITE_SO_
6c50: 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NUM ){.         
6c60: 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79     pExpr->dataTy
6c70: 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e  pe = SQLITE_SO_N
6c80: 55 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  UM;.            
6c90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
6ca0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
6cb0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65     }else if( pDe
6cc0: 66 2d 3e 64 61 74 61 54 79 70 65 3d 3d 53 51 4c  f->dataType==SQL
6cd0: 49 54 45 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  ITE_NUMERIC ){. 
6ce0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61         pExpr->da
6cf0: 74 61 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  taType = SQLITE_
6d00: 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 7d 65  SO_NUM;.      }e
6d10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 45 78  lse{.        pEx
6d20: 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53  pr->dataType = S
6d30: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20  QLITE_SO_TEXT;. 
6d40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6d50: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6d60: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
6d70: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45  ft ){.        nE
6d80: 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 43  rr = sqliteExprC
6d90: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78  heck(pParse, pEx
6da0: 70 72 2d 3e 70 4c 65 66 74 2c 20 61 6c 6c 6f 77  pr->pLeft, allow
6db0: 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20  Agg, pIsAgg);.  
6dc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6dd0: 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72  nErr==0 && pExpr
6de0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
6df0: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
6e00: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
6e10: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
6e20: 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41  , allowAgg, pIsA
6e30: 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gg);.      }.   
6e40: 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26     if( nErr==0 &
6e50: 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29  & pExpr->pList )
6e60: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  {.        int n 
6e70: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
6e80: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  nExpr;.        i
6e90: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
6ea0: 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26  r(i=0; nErr==0 &
6eb0: 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  & i<n; i++){.   
6ec0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
6ed0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
6ee0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
6ef0: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
6f00: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
6f10: 61 72 73 65 2c 20 70 45 32 2c 20 61 6c 6c 6f 77  arse, pE2, allow
6f20: 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20  Agg, pIsAgg);.  
6f30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6f40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6f50: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6f60: 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nErr;.}../*.** R
6f70: 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c  eturn either SQL
6f80: 49 54 45 5f 53 4f 5f 4e 55 4d 20 6f 72 20 53 51  ITE_SO_NUM or SQ
6f90: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 74 6f 20  LITE_SO_TEXT to 
6fa0: 69 6e 64 69 63 61 74 65 20 77 68 65 74 68 65 72  indicate whether
6fb0: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 65 78   the.** given ex
6fc0: 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20  pression should 
6fd0: 73 6f 72 74 20 61 73 20 6e 75 6d 65 72 69 63 20  sort as numeric 
6fe0: 76 61 6c 75 65 73 20 6f 72 20 61 73 20 74 65 78  values or as tex
6ff0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  t..**.** The sql
7000: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
7010: 73 28 29 20 61 6e 64 20 73 71 6c 69 74 65 45 78  s() and sqliteEx
7020: 70 72 43 68 65 63 6b 28 29 20 72 6f 75 74 69 6e  prCheck() routin
7030: 65 73 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20  es must have.** 
7040: 62 6f 74 68 20 62 65 65 6e 20 63 61 6c 6c 65 64  both been called
7050: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
7060: 6f 6e 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  on before it is 
7070: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
7080: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
7090: 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 45 78  qliteExprType(Ex
70a0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
70b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
70c0: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 77 68 69  TE_SO_NUM;.  whi
70d0: 6c 65 28 20 70 20 29 20 73 77 69 74 63 68 28 20  le( p ) switch( 
70e0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
70f0: 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
7100: 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
7110: 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
7120: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
7130: 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  H:.    case TK_A
7140: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
7150: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
7160: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
7170: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a 20 20 20   TK_NOTNULL:.   
7180: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a 20 20   case TK_NOT:.  
7190: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
71a0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  :.    case TK_UP
71b0: 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
71c0: 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
71d0: 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
71e0: 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
71f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
7200: 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
7210: 52 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  RSHIFT:.    case
7220: 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
7230: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
7240: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
7250: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
7260: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
7270: 57 45 45 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  WEEN:.    case T
7280: 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65  K_GLOB:.    case
7290: 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 20 20   TK_LIKE:.      
72a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f  return SQLITE_SO
72b0: 5f 4e 55 4d 3b 0a 0a 20 20 20 20 63 61 73 65 20  _NUM;..    case 
72c0: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63  TK_STRING:.    c
72d0: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20  ase TK_NULL:.   
72e0: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
72f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
7300: 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 72 65 74  IABLE:.      ret
7310: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45  urn SQLITE_SO_TE
7320: 58 54 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  XT;..    case TK
7330: 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
7340: 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
7350: 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
7360: 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
7370: 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
7380: 5f 45 51 3a 0a 20 20 20 20 20 20 69 66 28 20 73  _EQ:.      if( s
7390: 71 6c 69 74 65 45 78 70 72 54 79 70 65 28 70 2d  qliteExprType(p-
73a0: 3e 70 4c 65 66 74 29 3d 3d 53 51 4c 49 54 45 5f  >pLeft)==SQLITE_
73b0: 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20  SO_NUM ){.      
73c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
73d0: 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 7d 0a  SO_NUM;.      }.
73e0: 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69        p = p->pRi
73f0: 67 68 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ght;.      break
7400: 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ;..    case TK_A
7410: 53 3a 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  S:.      p = p->
7420: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 62 72 65  pLeft;.      bre
7430: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  ak;..    case TK
7440: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
7450: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
7460: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
7470: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 72  UNCTION:.      r
7480: 65 74 75 72 6e 20 70 2d 3e 64 61 74 61 54 79 70  eturn p->dataTyp
7490: 65 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  e;..    case TK_
74a0: 53 45 4c 45 43 54 3a 0a 20 20 20 20 20 20 61 73  SELECT:.      as
74b0: 73 65 72 74 28 20 70 2d 3e 70 53 65 6c 65 63 74  sert( p->pSelect
74c0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
74d0: 28 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45  ( p->pSelect->pE
74e0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73  List );.      as
74f0: 73 65 72 74 28 20 70 2d 3e 70 53 65 6c 65 63 74  sert( p->pSelect
7500: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
7510: 30 20 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70  0 );.      p = p
7520: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
7530: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
7540: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
7550: 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b   case TK_CASE: {
7560: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 52  .      if( p->pR
7570: 69 67 68 74 20 26 26 20 73 71 6c 69 74 65 45 78  ight && sqliteEx
7580: 70 72 54 79 70 65 28 70 2d 3e 70 52 69 67 68 74  prType(p->pRight
7590: 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  )==SQLITE_SO_NUM
75a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
75b0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  rn SQLITE_SO_NUM
75c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
75d0: 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b 0a  if( p->pList ){.
75e0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
75f0: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
7600: 2a 70 4c 69 73 74 20 3d 20 70 2d 3e 70 4c 69 73  *pList = p->pLis
7610: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  t;.        for(i
7620: 3d 31 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =1; i<pList->nEx
7630: 70 72 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20  pr; i+=2){.     
7640: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
7650: 78 70 72 54 79 70 65 28 70 4c 69 73 74 2d 3e 61  xprType(pList->a
7660: 5b 69 5d 2e 70 45 78 70 72 29 3d 3d 53 51 4c 49  [i].pExpr)==SQLI
7670: 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20  TE_SO_NUM ){.   
7680: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
7690: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20  SQLITE_SO_NUM;. 
76a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
76b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
76c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
76d0: 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a  _SO_TEXT;.    }.
76e0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
76f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
7700: 70 3d 3d 54 4b 5f 41 42 4f 52 54 20 29 3b 20 20  p==TK_ABORT );  
7710: 2f 2a 20 43 61 6e 27 74 20 48 61 70 70 65 6e 20  /* Can't Happen 
7720: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
7730: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7740: 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f  ITE_SO_NUM;.}../
7750: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
7760: 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  de into the curr
7770: 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c  ent Vdbe to eval
7780: 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a  uate the given.*
7790: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
77a0: 20 6c 65 61 76 65 20 74 68 65 20 72 65 73 75 6c   leave the resul
77b0: 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  t on the top of 
77c0: 73 74 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  stack..*/.void s
77d0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 50 61  qliteExprCode(Pa
77e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
77f0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62  r *pExpr){.  Vdb
7800: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
7810: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a  Vdbe;.  int op;.
7820: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
7830: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
7840: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
7850: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
7860: 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 20 6f 70   TK_PLUS:     op
7870: 20 3d 20 4f 50 5f 41 64 64 3b 20 20 20 20 20 20   = OP_Add;      
7880: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7890: 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 20 6f 70 20  TK_MINUS:    op 
78a0: 3d 20 4f 50 5f 53 75 62 74 72 61 63 74 3b 20 62  = OP_Subtract; b
78b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
78c0: 4b 5f 53 54 41 52 3a 20 20 20 20 20 6f 70 20 3d  K_STAR:     op =
78d0: 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3b 20 62 72   OP_Multiply; br
78e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
78f0: 5f 53 4c 41 53 48 3a 20 20 20 20 6f 70 20 3d 20  _SLASH:    op = 
7900: 4f 50 5f 44 69 76 69 64 65 3b 20 20 20 62 72 65  OP_Divide;   bre
7910: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7920: 41 4e 44 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f  AND:      op = O
7930: 50 5f 41 6e 64 3b 20 20 20 20 20 20 62 72 65 61  P_And;      brea
7940: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  k;.    case TK_O
7950: 52 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  R:       op = OP
7960: 5f 4f 72 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Or;       break
7970: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  ;.    case TK_LT
7980: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
7990: 4c 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Lt;       break;
79a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
79b0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c         op = OP_L
79c0: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
79d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20      case TK_GT: 
79e0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74        op = OP_Gt
79f0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
7a00: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20     case TK_GE:  
7a10: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b       op = OP_Ge;
7a20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7a30: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20    case TK_NE:   
7a40: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20      op = OP_Ne; 
7a50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7a60: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20   case TK_EQ:    
7a70: 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20     op = OP_Eq;  
7a80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7a90: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20  case TK_ISNULL: 
7aa0: 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c    op = OP_IsNull
7ab0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
7ac0: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
7ad0: 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c   op = OP_NotNull
7ae0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
7af0: 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 20  se TK_NOT:      
7b00: 6f 70 20 3d 20 4f 50 5f 4e 6f 74 3b 20 20 20 20  op = OP_Not;    
7b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7b20: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 20 6f  e TK_UMINUS:   o
7b30: 70 20 3d 20 4f 50 5f 4e 65 67 61 74 69 76 65 3b  p = OP_Negative;
7b40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7b50: 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 20 6f 70   TK_BITAND:   op
7b60: 20 3d 20 4f 50 5f 42 69 74 41 6e 64 3b 20 20 20   = OP_BitAnd;   
7b70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7b80: 54 4b 5f 42 49 54 4f 52 3a 20 20 20 20 6f 70 20  TK_BITOR:    op 
7b90: 3d 20 4f 50 5f 42 69 74 4f 72 3b 20 20 20 20 62  = OP_BitOr;    b
7ba0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
7bb0: 4b 5f 42 49 54 4e 4f 54 3a 20 20 20 6f 70 20 3d  K_BITNOT:   op =
7bc0: 20 4f 50 5f 42 69 74 4e 6f 74 3b 20 20 20 62 72   OP_BitNot;   br
7bd0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7be0: 5f 4c 53 48 49 46 54 3a 20 20 20 6f 70 20 3d 20  _LSHIFT:   op = 
7bf0: 4f 50 5f 53 68 69 66 74 4c 65 66 74 3b 20 20 62  OP_ShiftLeft;  b
7c00: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
7c10: 4b 5f 52 53 48 49 46 54 3a 20 20 20 6f 70 20 3d  K_RSHIFT:   op =
7c20: 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3b 20   OP_ShiftRight; 
7c30: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7c40: 54 4b 5f 52 45 4d 3a 20 20 20 20 20 20 6f 70 20  TK_REM:      op 
7c50: 3d 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3b 20  = OP_Remainder; 
7c60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
7c70: 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ult: break;.  }.
7c80: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
7c90: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
7ca0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
7cb0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 75     if( pParse->u
7cc0: 73 65 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  seAgg ){.       
7cd0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7ce0: 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 30  (v, OP_AggGet, 0
7cf0: 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a  , pExpr->iAgg);.
7d00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7d10: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
7d20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
7d30: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7d40: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72  OP_Column, pExpr
7d50: 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d  ->iTable, pExpr-
7d60: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
7d70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7d80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7d90: 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 70 45 78  v, OP_Recno, pEx
7da0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
7db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7dc0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7dd0: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
7de0: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
7df0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  :.    case TK_IN
7e00: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  TEGER: {.      i
7e10: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
7e20: 5f 49 4e 54 45 47 45 52 20 26 26 20 73 71 6c 69  _INTEGER && sqli
7e30: 74 65 46 69 74 73 49 6e 33 32 42 69 74 73 28 70  teFitsIn32Bits(p
7e40: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 20 29  Expr->token.z) )
7e50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7e60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7e70: 49 6e 74 65 67 65 72 2c 20 61 74 6f 69 28 70 45  Integer, atoi(pE
7e80: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 2c 20 30  xpr->token.z), 0
7e90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7ea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
7eb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
7ec0: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
7ed0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
7ee0: 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  t( pExpr->token.
7ef0: 7a 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  z );.      sqlit
7f00: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7f10: 20 2d 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65   -1, pExpr->toke
7f20: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
7f30: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n.n);.      sqli
7f40: 74 65 56 64 62 65 44 65 71 75 6f 74 65 50 33 28  teVdbeDequoteP3(
7f50: 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72  v, -1);.      br
7f60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7f70: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
7f80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7f90: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
7fa0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
7fb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7fc0: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
7fd0: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
7fe0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7ff0: 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
8000: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
8010: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8020: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
8030: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
8040: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
8050: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
8060: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
8070: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
8080: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61   {.      if( pPa
8090: 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f  rse->db->file_fo
80a0: 72 6d 61 74 3e 3d 34 20 26 26 20 73 71 6c 69 74  rmat>=4 && sqlit
80b0: 65 45 78 70 72 54 79 70 65 28 70 45 78 70 72 29  eExprType(pExpr)
80c0: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  ==SQLITE_SO_TEXT
80d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 2b   ){.        op +
80e0: 3d 20 36 3b 20 20 2f 2a 20 43 6f 6e 76 65 72 74  = 6;  /* Convert
80f0: 20 6e 75 6d 65 72 69 63 20 6f 70 63 6f 64 65 73   numeric opcodes
8100: 20 74 6f 20 74 65 78 74 20 6f 70 63 6f 64 65 73   to text opcodes
8110: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
8120: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
8130: 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20  h into the next 
8140: 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
8150: 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
8160: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
8170: 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
8180: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
8190: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
81a0: 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
81b0: 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
81c0: 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
81d0: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
81e0: 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
81f0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
8200: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
8210: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
8220: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
8230: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
8240: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
8250: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
8260: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
8270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8280: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
8290: 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
82a0: 54 4b 5f 52 53 48 49 46 54 3a 20 7b 0a 20 20 20  TK_RSHIFT: {.   
82b0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
82c0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
82d0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
82e0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
82f0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
8300: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
8310: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
8320: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
8330: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8340: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
8350: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
8360: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
8370: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
8380: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
8390: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
83a0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
83b0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
83c0: 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  p(v, OP_Concat, 
83d0: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  2, 0);.      bre
83e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
83f0: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
8400: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
8410: 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20  xpr->pLeft );.  
8420: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
8430: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
8440: 41 54 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65  AT || pExpr->pLe
8450: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
8460: 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f  ER ){.        To
8470: 6b 65 6e 20 2a 70 20 3d 20 26 70 45 78 70 72 2d  ken *p = &pExpr-
8480: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
8490: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
84a0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
84b0: 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20  ->n + 2 );.     
84c0: 20 20 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d     sprintf(z, "-
84d0: 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e  %.*s", p->n, p->
84e0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
84f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
8500: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 26 26 20  ==TK_INTEGER && 
8510: 73 71 6c 69 74 65 46 69 74 73 49 6e 33 32 42 69  sqliteFitsIn32Bi
8520: 74 73 28 7a 29 20 29 7b 0a 20 20 20 20 20 20 20  ts(z) ){.       
8530: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8540: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
8550: 2c 20 61 74 6f 69 28 7a 29 2c 20 30 29 3b 0a 20  , atoi(z), 0);. 
8560: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8570: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8580: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
8590: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
85a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
85b0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
85c0: 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 70 2d 3e 6e  3(v, -1, z, p->n
85d0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
85e0: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
85f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8600: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
8610: 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b   through into TK
8620: 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  _NOT */.    }.  
8630: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
8640: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
8650: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
8660: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
8670: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
8680: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8690: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
86a0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
86b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
86c0: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
86d0: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
86e0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
86f0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  t;.      sqliteV
8700: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
8710: 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20  nteger, 1, 0);. 
8720: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
8730: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
8740: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
8750: 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65 56 64   dest = sqliteVd
8760: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
8770: 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 2;.      sqli
8780: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
8790: 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 1, dest);.   
87a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
87b0: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
87c0: 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62   -1, 0);.      b
87d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
87e0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
87f0: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71  TION: {.      sq
8800: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
8810: 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70   OP_AggGet, 0, p
8820: 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20  Expr->iAgg);.   
8830: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8840: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42      case TK_GLOB
8850: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49  :.    case TK_LI
8860: 4b 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  KE:.    case TK_
8870: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
8880: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8890: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
88a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  ;.      int nExp
88b0: 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  r = pList ? pLis
88c0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  t->nExpr : 0;.  
88d0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
88e0: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  f;.      int nId
88f0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
8900: 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20 67  ar *zId;.      g
8910: 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 70  etFunctionName(p
8920: 45 78 70 72 2c 20 26 7a 49 64 2c 20 26 6e 49 64  Expr, &zId, &nId
8930: 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  );.      pDef = 
8940: 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74 69  sqliteFindFuncti
8950: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
8960: 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20  Id, nId, nExpr, 
8970: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
8980: 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20  ( pDef!=0 );.   
8990: 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74     nExpr = sqlit
89a0: 65 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  eExprCodeExprLis
89b0: 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  t(pParse, pList,
89c0: 20 70 44 65 66 2d 3e 69 6e 63 6c 75 64 65 54 79   pDef->includeTy
89d0: 70 65 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pes);.      sqli
89e0: 74 65 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  teVdbeOp3(v, OP_
89f0: 46 75 6e 63 74 69 6f 6e 2c 20 6e 45 78 70 72 2c  Function, nExpr,
8a00: 20 30 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c   0, (char*)pDef,
8a10: 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20   P3_POINTER);.  
8a20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8a30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
8a40: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ECT: {.      sql
8a50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8a60: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70  OP_MemLoad, pExp
8a70: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  r->iColumn, 0);.
8a80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8a90: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
8aa0: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  N: {.      int a
8ab0: 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ddr;.      sqlit
8ac0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8ad0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b  _Integer, 1, 0);
8ae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
8af0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
8b00: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8b10: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
8b20: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
8b30: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
8b40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8b50: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
8b60: 72 2b 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+4);.      sqli
8b70: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8b80: 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20  P_Pop, 2, 0);.  
8b90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8ba0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
8bb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
8bc0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8bd0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
8be0: 64 72 2b 36 29 3b 0a 20 20 20 20 20 20 69 66 28  dr+6);.      if(
8bf0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
8c00: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8c10: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8c20: 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
8c30: 54 61 62 6c 65 2c 20 61 64 64 72 2b 36 29 3b 0a  Table, addr+6);.
8c40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8c50: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8c60: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 46 6f  ddOp(v, OP_SetFo
8c70: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
8c80: 6c 65 2c 20 61 64 64 72 2b 36 29 3b 0a 20 20 20  le, addr+6);.   
8c90: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8ca0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8cb0: 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b  _AddImm, -1, 0);
8cc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8cd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8ce0: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
8cf0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
8d00: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
8d10: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
8d20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8d30: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
8d40: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
8d50: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
8d60: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
8d70: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
8d80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8d90: 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20  OP_Ge, 0, 0);.  
8da0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8db0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
8dc0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
8dd0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
8de0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
8df0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
8e00: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8e10: 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 65 2c 20 30  ddOp(v, OP_Le, 0
8e20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
8e30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8e40: 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20  P_And, 0, 0);.  
8e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8e60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
8e70: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
8e80: 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AS: {.      sqli
8e90: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
8ea0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
8eb0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8ec0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
8ed0: 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69  _CASE: {.      i
8ee0: 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65  nt expr_end_labe
8ef0: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75 6d  l;.      int jum
8f00: 70 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pInst;.      int
8f10: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74   addr;.      int
8f20: 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e   nExpr;.      in
8f30: 74 20 69 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  t i;..      asse
8f40: 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  rt(pExpr->pList)
8f50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28  ;.      assert((
8f60: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
8f70: 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a  xpr % 2) == 0);.
8f80: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
8f90: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
8fa0: 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 6e 45 78   > 0);.      nEx
8fb0: 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  pr = pExpr->pLis
8fc0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
8fd0: 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d  expr_end_label =
8fe0: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
8ff0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
9000: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
9010: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9020: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
9030: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
9040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
9050: 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
9060: 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
9070: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
9080: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9090: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
90a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
90b0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
90c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56           sqliteV
90d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
90e0: 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  up, 1, 1);.     
90f0: 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20       jumpInst = 
9100: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9110: 76 2c 20 4f 50 5f 4e 65 2c 20 31 2c 20 30 29 3b  v, OP_Ne, 1, 0);
9120: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9130: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9140: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
9150: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9160: 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d        jumpInst =
9170: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
9180: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c  (v, OP_IfNot, 1,
9190: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
91a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
91b0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
91c0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2b  xpr->pList->a[i+
91d0: 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
91e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
91f0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
9200: 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  , expr_end_label
9210: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
9220: 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72  = sqliteVdbeCurr
9230: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
9240: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
9250: 61 6e 67 65 50 32 28 76 2c 20 6a 75 6d 70 49 6e  angeP2(v, jumpIn
9260: 73 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  st, addr);.     
9270: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
9280: 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pr->pLeft ){.   
9290: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
92a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
92b0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
92c0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
92d0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
92e0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
92f0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
9300: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d  pRight);.      }
9310: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
9320: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
9330: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
9340: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9350: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
9360: 76 65 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f  veLabel(v, expr_
9370: 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20  end_label);.    
9380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9390: 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
93a0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  : {.      if( !p
93b0: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
93c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
93d0: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
93e0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
93f0: 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
9400: 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
9410: 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
9420: 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
9430: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
9440: 6e 45 72 72 2b 2b 3b 0a 09 72 65 74 75 72 6e 3b  nErr++;..return;
9450: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9460: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
9470: 6e 20 3d 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b  n == OE_Rollback
9480: 20 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e 69 43   ||..  pExpr->iC
9490: 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72  olumn == OE_Abor
94a0: 74 20 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e 69  t ||..  pExpr->i
94b0: 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69  Column == OE_Fai
94c0: 6c 20 29 7b 0a 09 20 20 73 71 6c 69 74 65 56 64  l ){..  sqliteVd
94d0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74  beOp3(v, OP_Halt
94e0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
94f0: 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  INT, pExpr->iCol
9500: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
9530: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
9540: 0a 09 20 20 73 71 6c 69 74 65 56 64 62 65 44 65  ..  sqliteVdbeDe
9550: 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b 0a  quoteP3(v, -1);.
9560: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09        } else {..
9570: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
9580: 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49  >iColumn == OE_I
9590: 67 6e 6f 72 65 20 29 3b 0a 09 20 20 73 71 6c 69  gnore );..  sqli
95a0: 74 65 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  teVdbeOp3(v, OP_
95b0: 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
95c0: 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f  >trigStack->igno
95d0: 72 65 4a 75 6d 70 2c 0a 20 20 20 20 20 20 20 20  reJump,.        
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95f0: 20 20 20 22 28 49 47 4e 4f 52 45 20 6a 75 6d 70     "(IGNORE jump
9600: 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  )", 0);.      }.
9610: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
9620: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
9630: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
9640: 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
9650: 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
9660: 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
9670: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
9680: 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  st onto the stac
9690: 6b 2e 20 20 49 66 20 74 68 65 20 69 6e 63 6c 75  k.  If the inclu
96a0: 64 65 54 79 70 65 73 20 66 6c 61 67 20 69 73 20  deTypes flag is 
96b0: 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 61 6c  true,.** then al
96c0: 73 6f 20 70 75 73 68 20 61 20 73 74 72 69 6e 67  so push a string
96d0: 20 74 68 61 74 20 69 73 20 74 68 65 20 64 61 74   that is the dat
96e0: 61 74 79 70 65 20 6f 66 20 65 61 63 68 20 65 6c  atype of each el
96f0: 65 6d 65 6e 74 20 6f 6e 74 6f 0a 2a 2a 20 74 68  ement onto.** th
9700: 65 20 73 74 61 63 6b 20 61 66 74 65 72 20 74 68  e stack after th
9710: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52  e value..**.** R
9720: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
9730: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 70 75 73   of elements pus
9740: 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  hed onto the sta
9750: 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
9760: 65 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  eExprCodeExprLis
9770: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
9780: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
9790: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
97a0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
97b0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
97c0: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
97d0: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
97e0: 6e 63 6c 75 64 65 54 79 70 65 73 20 20 20 2f 2a  ncludeTypes   /*
97f0: 20 54 52 55 45 20 74 6f 20 70 75 74 20 64 61 74   TRUE to put dat
9800: 61 74 79 70 65 73 20 6f 6e 20 74 68 65 20 73 74  atypes on the st
9810: 61 63 6b 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20  ack too */.){.  
9820: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9830: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
9840: 6e 74 20 69 2c 20 6e 3b 0a 20 20 56 64 62 65 20  nt i, n;.  Vdbe 
9850: 2a 76 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  *v;.  if( pList=
9860: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
9870: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
9880: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 6e 20  be(pParse);.  n 
9890: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
98a0: 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
98b0: 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20  t->a, i=0; i<n; 
98c0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
98d0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
98e0: 65 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  e(pParse, pItem-
98f0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
9900: 20 69 6e 63 6c 75 64 65 54 79 70 65 73 20 29 7b   includeTypes ){
9910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
9920: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
9930: 67 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20  g, 0, 0, .      
9940: 20 20 20 73 71 6c 69 74 65 45 78 70 72 54 79 70     sqliteExprTyp
9950: 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3d  e(pItem->pExpr)=
9960: 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 3f  =SQLITE_SO_NUM ?
9970: 20 22 6e 75 6d 65 72 69 63 22 20 3a 20 22 74 65   "numeric" : "te
9980: 78 74 22 2c 0a 20 20 20 20 20 20 20 20 20 50 33  xt",.         P3
9990: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a  _STATIC);.    }.
99a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 63    }.  return inc
99b0: 6c 75 64 65 54 79 70 65 73 20 3f 20 6e 2a 32 20  ludeTypes ? n*2 
99c0: 3a 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  : n;.}../*.** Ge
99d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
99e0: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
99f0: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
9a00: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
9a10: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
9a20: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
9a30: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
9a40: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
9a50: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
9a60: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
9a70: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
9a80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
9a90: 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
9aa0: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
9ab0: 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
9ac0: 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
9ad0: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
9ae0: 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
9af0: 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  flag is true..*/
9b00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
9b10: 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
9b20: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
9b30: 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
9b40: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
9b50: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
9b60: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
9b70: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d  p = 0;.  if( v==
9b80: 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
9b90: 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68  return;.  switch
9ba0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
9bb0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
9bc0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b       op = OP_Lt;
9bd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9be0: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
9bf0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20      op = OP_Le; 
9c00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9c10: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
9c20: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20     op = OP_Gt;  
9c30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9c40: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
9c50: 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20    op = OP_Ge;   
9c60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9c70: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
9c80: 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20   op = OP_Ne;    
9c90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9ca0: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20  se TK_EQ:       
9cb0: 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20  op = OP_Eq;     
9cc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9cd0: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f  e TK_ISNULL:   o
9ce0: 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20  p = OP_IsNull;  
9cf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9d00: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70   TK_NOTNULL:  op
9d10: 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20   = OP_NotNull;  
9d20: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
9d30: 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  lt:  break;.  }.
9d40: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9d50: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
9d60: 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
9d70: 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 56  int d2 = sqliteV
9d80: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
9d90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
9da0: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
9db0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
9dc0: 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  2, !jumpIfNull);
9dd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
9de0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
9df0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
9e00: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
9e10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
9e20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
9e30: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
9e40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9e50: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
9e60: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72    sqliteExprIfTr
9e70: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
9e80: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
9e90: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
9ea0: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72    sqliteExprIfTr
9eb0: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
9ec0: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
9ed0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
9ee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9ef0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
9f00: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
9f10: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
9f20: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
9f30: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
9f40: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
9f50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9f60: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
9f70: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
9f80: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
9f90: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
9fa0: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
9fb0: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73  TK_EQ: {.      s
9fc0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
9fd0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
9fe0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
9ff0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
a000: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
a010: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
a020: 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  se->db->file_for
a030: 6d 61 74 3e 3d 34 20 26 26 20 73 71 6c 69 74 65  mat>=4 && sqlite
a040: 45 78 70 72 54 79 70 65 28 70 45 78 70 72 29 3d  ExprType(pExpr)=
a050: 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20  =SQLITE_SO_TEXT 
a060: 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 2b 3d  ){.        op +=
a070: 20 36 3b 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20   6;  /* Convert 
a080: 6e 75 6d 65 72 69 63 20 6f 70 63 6f 64 65 73 20  numeric opcodes 
a090: 74 6f 20 74 65 78 74 20 6f 70 63 6f 64 65 73 20  to text opcodes 
a0a0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
a0b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a0c0: 28 76 2c 20 6f 70 2c 20 6a 75 6d 70 49 66 4e 75  (v, op, jumpIfNu
a0d0: 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ll, dest);.     
a0e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a0f0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
a100: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
a110: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
a120: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
a130: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
a140: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
a150: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
a160: 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
a170: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a180: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
a190: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
a1a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
a1b0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
a1c0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
a1d0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
a1e0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
a1f0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
a200: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a210: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
a220: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
a230: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a240: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
a250: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a260: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
a270: 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20  0, jumpIfNull ? 
a280: 64 65 73 74 20 3a 20 61 64 64 72 2b 34 29 3b 0a  dest : addr+4);.
a290: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
a2a0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
a2b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a2c0: 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  dOp(v, OP_Found,
a2d0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
a2e0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
a2f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a300: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a310: 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_SetFound, pExp
a320: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29  r->iTable, dest)
a330: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a340: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a350: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
a360: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
a370: 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dr;.      sqlite
a380: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
a390: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
a3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a3b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
a3c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a3d0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
a3e0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
a3f0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
a400: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
a410: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a420: 4f 50 5f 4c 74 2c 20 21 6a 75 6d 70 49 66 4e 75  OP_Lt, !jumpIfNu
a430: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ll, 0);.      sq
a440: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
a450: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
a460: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  t->a[1].pExpr);.
a470: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a480: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 65 2c 20  AddOp(v, OP_Le, 
a490: 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74  jumpIfNull, dest
a4a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
a4b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
a4c0: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
a4d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
a4e0: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
a4f0: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
a500: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
a510: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
a520: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
a530: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
a540: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
a550: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  lt: {.      sqli
a560: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
a570: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
a580: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a590: 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49  (v, OP_If, jumpI
a5a0: 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20  fNull, dest);.  
a5b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a5c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
a5d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
a5e0: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
a5f0: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
a600: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
a610: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
a620: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
a630: 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20  ession is false 
a640: 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
a650: 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
a660: 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
a670: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
a680: 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
a690: 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
a6a0: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
a6b0: 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
a6c0: 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a  false) then.** j
a6d0: 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ump if jumpIfNul
a6e0: 6c 20 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c  l is true or fal
a6f0: 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
a700: 70 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65  pIfNull is false
a710: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a720: 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
a730: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
a740: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
a750: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
a760: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
a770: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
a780: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66  int op = 0;.  if
a790: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
a7a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
a7b0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
a7c0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
a7d0: 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LT:       op = O
a7e0: 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ge;       brea
a7f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
a800: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
a810: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
a820: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
a830: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
a840: 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Le;       break;
a850: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
a860: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c         op = OP_L
a870: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
a880: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
a890: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
a8a0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
a8b0: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
a8c0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b       op = OP_Ne;
a8d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a8e0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
a8f0: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  :   op = OP_NotN
a900: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
a910: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
a920: 3a 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c  :  op = OP_IsNul
a930: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
a940: 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b  default:  break;
a950: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
a960: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
a970: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
a980: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
a990: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
a9a0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
a9b0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
a9c0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
a9d0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
a9e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
a9f0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
aa00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
aa10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
aa20: 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
aa30: 20 64 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65   d2 = sqliteVdbe
aa40: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
aa50: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
aa60: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
aa70: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21  pr->pLeft, d2, !
aa80: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
aa90: 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 46     sqliteExprIfF
aaa0: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
aab0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
aac0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
aad0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
aae0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
aaf0: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
ab00: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ab10: 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
ab20: 73 71 6c 69 74 65 45 78 70 72 49 66 54 72 75 65  sqliteExprIfTrue
ab30: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
ab40: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
ab50: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
ab60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ab70: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
ab80: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
ab90: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
aba0: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
abb0: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
abc0: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
abd0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
abe0: 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  >db->file_format
abf0: 3e 3d 34 20 26 26 20 73 71 6c 69 74 65 45 78 70  >=4 && sqliteExp
ac00: 72 54 79 70 65 28 70 45 78 70 72 29 3d 3d 53 51  rType(pExpr)==SQ
ac10: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a  LITE_SO_TEXT ){.
ac20: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
ac30: 72 74 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61  rt numeric compa
ac40: 72 69 73 6f 6e 20 6f 70 63 6f 64 65 73 20 69 6e  rison opcodes in
ac50: 74 6f 20 74 65 78 74 20 63 6f 6d 70 61 72 69 73  to text comparis
ac60: 6f 6e 20 6f 70 63 6f 64 65 73 2e 0a 20 20 20 20  on opcodes..    
ac70: 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 65 70      ** This step
ac80: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
ac90: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 74 65  fact that the te
aca0: 78 74 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6f  xt comparision o
acb0: 70 63 6f 64 65 73 20 61 72 65 0a 20 20 20 20 20  pcodes are.     
acc0: 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 36 20 67     ** always 6 g
acd0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69  reater than thei
ace0: 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
acf0: 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61 72 69 73  numeric comparis
ad00: 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 70  on.        ** op
ad10: 63 6f 64 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  codes..        *
ad20: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
ad30: 28 20 4f 50 5f 45 71 2b 36 20 3d 3d 20 4f 50 5f  ( OP_Eq+6 == OP_
ad40: 53 74 72 45 71 20 29 3b 0a 20 20 20 20 20 20 20  StrEq );.       
ad50: 20 6f 70 20 2b 3d 20 36 3b 0a 20 20 20 20 20 20   op += 6;.      
ad60: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  }.      sqliteEx
ad70: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
ad80: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
ad90: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
ada0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
adb0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
adc0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
add0: 28 76 2c 20 6f 70 2c 20 6a 75 6d 70 49 66 4e 75  (v, op, jumpIfNu
ade0: 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ll, dest);.     
adf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ae00: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
ae10: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
ae20: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
ae30: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
ae40: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ae50: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
ae60: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
ae70: 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
ae80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ae90: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
aea0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
aeb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
aec0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
aed0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
aee0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
aef0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
af00: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
af10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
af20: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
af30: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
af40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
af50: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
af60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
af70: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
af80: 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20  0, jumpIfNull ? 
af90: 64 65 73 74 20 3a 20 61 64 64 72 2b 34 29 3b 0a  dest : addr+4);.
afa0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
afb0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
afc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
afd0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
afe0: 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
aff0: 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  e, dest);.      
b000: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b010: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b020: 2c 20 4f 50 5f 53 65 74 4e 6f 74 46 6f 75 6e 64  , OP_SetNotFound
b030: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
b040: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a   dest);.      }.
b050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b060: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
b070: 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
b080: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
b090: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
b0a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b0b0: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
b0c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b0d0: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
b0e0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
b0f0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
b100: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
b110: 78 70 72 29 3b 0a 20 20 20 20 20 20 61 64 64 72  xpr);.      addr
b120: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72   = sqliteVdbeCur
b130: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
b140: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b150: 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 21 6a 75  Op(v, OP_Ge, !ju
b160: 6d 70 49 66 4e 75 6c 6c 2c 20 61 64 64 72 2b 33  mpIfNull, addr+3
b170: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
b180: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
b190: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
b1a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b1b0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
b1c0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
b1d0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
b1e0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
b1f0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
b200: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b210: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 74 2c 20 6a  ddOp(v, OP_Gt, j
b220: 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29  umpIfNull, dest)
b230: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b240: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
b250: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b260: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b270: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
b280: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b290: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70  , OP_IfNot, jump
b2a0: 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20  IfNull, dest);. 
b2b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b2c0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
b2d0: 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
b2e0: 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
b2f0: 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
b300: 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a  turn TRUE (non-z
b310: 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20  ero).** if they 
b320: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
b330: 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69  d return FALSE i
b340: 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
b350: 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74   any way..*/.int
b360: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61   sqliteExprCompa
b370: 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
b380: 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b  r *pB){.  int i;
b390: 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a  .  if( pA==0 ){.
b3a0: 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 30      return pB==0
b3b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
b3c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
b3d0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
b3e0: 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20  A->op!=pB->op ) 
b3f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
b400: 21 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61  !sqliteExprCompa
b410: 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
b420: 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
b430: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
b440: 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  teExprCompare(pA
b450: 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
b460: 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30  ight) ) return 0
b470: 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73  ;.  if( pA->pLis
b480: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  t ){.    if( pB-
b490: 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  >pList==0 ) retu
b4a0: 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41  rn 0;.    if( pA
b4b0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
b4c0: 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pB->pList->nExpr
b4d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
b4e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
b4f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
b500: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73  +){.      if( !s
b510: 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65  qliteExprCompare
b520: 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  (pA->pList->a[i]
b530: 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73  .pExpr, pB->pLis
b540: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
b550: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
b560: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
b570: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  }.  }else if( pB
b580: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72  ->pList ){.    r
b590: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
b5a0: 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c  f( pA->pSelect |
b5b0: 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20  | pB->pSelect ) 
b5c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
b5d0: 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e  pA->iTable!=pB->
b5e0: 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43  iTable || pA->iC
b5f0: 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75  olumn!=pB->iColu
b600: 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  mn ) return 0;. 
b610: 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a   if( pA->token.z
b620: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e   ){.    if( pB->
b630: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74  token.z==0 ) ret
b640: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
b650: 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e  B->token.n!=pA->
b660: 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e  token.n ) return
b670: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
b680: 74 65 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74  teStrNICmp(pA->t
b690: 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65  oken.z, pB->toke
b6a0: 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e  n.z, pB->token.n
b6b0: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )!=0 ) return 0;
b6c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
b6d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
b6e0: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
b6f0: 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
b700: 5d 20 61 72 72 61 79 20 61 6e 64 20 72 65 74 75  ] array and retu
b710: 72 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2f  rn its index..*/
b720: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 65  .static int appe
b730: 6e 64 41 67 67 49 6e 66 6f 28 50 61 72 73 65 20  ndAggInfo(Parse 
b740: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
b750: 28 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 26 20  (pParse->nAgg & 
b760: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  0x7)==0 ){.    i
b770: 6e 74 20 61 6d 74 20 3d 20 70 50 61 72 73 65 2d  nt amt = pParse-
b780: 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20 20 41  >nAgg + 8;.    A
b790: 67 67 45 78 70 72 20 2a 61 41 67 67 20 3d 20 73  ggExpr *aAgg = s
b7a0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61  qliteRealloc(pPa
b7b0: 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73  rse->aAgg, amt*s
b7c0: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41  izeof(pParse->aA
b7d0: 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  gg[0]));.    if(
b7e0: 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20   aAgg==0 ){.    
b7f0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
b800: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61   }.    pParse->a
b810: 41 67 67 20 3d 20 61 41 67 67 3b 0a 20 20 7d 0a  Agg = aAgg;.  }.
b820: 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65    memset(&pParse
b830: 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d 3e 6e  ->aAgg[pParse->n
b840: 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Agg], 0, sizeof(
b850: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29  pParse->aAgg[0])
b860: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  );.  return pPar
b870: 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f  se->nAgg++;.}../
b880: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
b890: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
b8a0: 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
b8b0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
b8c0: 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
b8d0: 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
b8e0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
b8f0: 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
b900: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b  [] array..** Mak
b910: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  e additional ent
b920: 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72  ries to the pPar
b930: 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
b940: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
b950: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b960: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
b970: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
b980: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
b990: 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
b9a0: 64 20 62 79 20 73 71 6c 69 74 65 45 78 70 72 52  d by sqliteExprR
b9b0: 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20  esolveIds() and 
b9c0: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
b9d0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f  )..**.** If erro
b9e0: 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61  rs are seen, lea
b9f0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
ba00: 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61  age in zErrMsg a
ba10: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  nd return.** the
ba20: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
ba30: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
ba40: 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
ba50: 67 61 74 65 73 28 50 61 72 73 65 20 2a 70 50 61  gates(Parse *pPa
ba60: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
ba70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41 67  ){.  int i;.  Ag
ba80: 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20 20 69  gExpr *aAgg;.  i
ba90: 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20  nt nErr = 0;..  
baa0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
bab0: 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63  eturn 0;.  switc
bac0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
bad0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
bae0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67 67  MN: {.      aAgg
baf0: 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b   = pParse->aAgg;
bb00: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
bb10: 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
bb20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
bb30: 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ( aAgg[i].isAgg 
bb40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
bb50: 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e      if( aAgg[i].
bb60: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
bb70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20  Expr->iTable.   
bb80: 20 20 20 20 20 20 26 26 20 61 41 67 67 5b 69 5d        && aAgg[i]
bb90: 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  .pExpr->iColumn=
bba0: 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
bbb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
bbc0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
bbd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
bbe0: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  i>=pParse->nAgg 
bbf0: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 61  ){.        i = a
bc00: 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61  ppendAggInfo(pPa
bc10: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
bc20: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31  ( i<0 ) return 1
bc30: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
bc40: 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ->aAgg[i].isAgg 
bc50: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
bc60: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
bc70: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
bc80: 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d    }.      pExpr-
bc90: 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
bca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bcb0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
bcc0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
bcd0: 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  aAgg = pParse->a
bce0: 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Agg;.      for(i
bcf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
bd00: 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
bd10: 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d 2e 69    if( !aAgg[i].i
bd20: 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
bd30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
bd40: 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28 61  iteExprCompare(a
bd50: 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  Agg[i].pExpr, pE
bd60: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
bd70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
bd80: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
bd90: 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e   if( i>=pParse->
bda0: 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  nAgg ){.        
bdb0: 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66  i = appendAggInf
bdc0: 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  o(pParse);.     
bdd0: 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74     if( i<0 ) ret
bde0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70  urn 1;.        p
bdf0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
be00: 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
be10: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
be20: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
be30: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
be40: 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20 3d  >aAgg[i].pFunc =
be50: 20 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63 74   sqliteFindFunct
be60: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
be80: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
be90: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20  pr->token.n,.   
bea0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
beb0: 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  >pList ? pExpr->
bec0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
bed0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
bee0: 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
bef0: 3d 20 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = i;.      break
bf00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
bf10: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ult: {.      if(
bf20: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
bf30: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
bf40: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
bf50: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
bf60: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
bf70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bf80: 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20   if( nErr==0 && 
bf90: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
bfa0: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
bfb0: 73 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a  sqliteExprAnalyz
bfc0: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
bfd0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
bfe0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
bff0: 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26    if( nErr==0 &&
c000: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
c010: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
c020: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
c030: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Expr;.        in
c040: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
c050: 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26  (i=0; nErr==0 &&
c060: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
c070: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
c080: 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  iteExprAnalyzeAg
c090: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
c0a0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
c0b0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
c0c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c0d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c0e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
c0f0: 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rr;.}../*.** Loc
c100: 61 74 65 20 61 20 75 73 65 72 20 66 75 6e 63 74  ate a user funct
c110: 69 6f 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d 65  ion given a name
c120: 20 61 6e 64 20 61 20 6e 75 6d 62 65 72 20 6f 66   and a number of
c130: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 52   arguments..** R
c140: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
c150: 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 73  to the FuncDef s
c160: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
c170: 66 69 6e 65 73 20 74 68 61 74 0a 2a 2a 20 66 75  fines that.** fu
c180: 6e 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75 72  nction, or retur
c190: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 75  n NULL if the fu
c1a0: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
c1b0: 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  exist..**.** If 
c1c0: 74 68 65 20 63 72 65 61 74 65 46 6c 61 67 20 61  the createFlag a
c1d0: 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
c1e0: 20 74 68 65 6e 20 61 20 6e 65 77 20 28 62 6c 61   then a new (bla
c1f0: 6e 6b 29 20 46 75 6e 63 44 65 66 0a 2a 2a 20 73  nk) FuncDef.** s
c200: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
c210: 74 65 64 20 61 6e 64 20 6c 69 6b 65 64 20 69 6e  ted and liked in
c220: 74 6f 20 74 68 65 20 22 64 62 22 20 73 74 72 75  to the "db" stru
c230: 63 74 75 72 65 20 69 66 20 61 0a 2a 2a 20 6e 6f  cture if a.** no
c240: 20 6d 61 74 63 68 69 6e 67 20 66 75 6e 63 74 69   matching functi
c250: 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78  on previously ex
c260: 69 73 74 65 64 2e 20 20 57 68 65 6e 20 63 72 65  isted.  When cre
c270: 61 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 0a  ateFlag is true.
c280: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 41 72 67 20  ** and the nArg 
c290: 70 61 72 61 6d 65 74 65 72 20 69 73 20 2d 31 2c  parameter is -1,
c2a0: 20 74 68 65 6e 20 6f 6e 6c 79 20 61 20 66 75 6e   then only a fun
c2b0: 63 74 69 6f 6e 20 74 68 61 74 20 61 63 63 65 70  ction that accep
c2c0: 74 73 0a 2a 2a 20 61 6e 79 20 6e 75 6d 62 65 72  ts.** any number
c2d0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77 69   of arguments wi
c2e0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a  ll be returned..
c2f0: 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74 65 46  **.** If createF
c300: 6c 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64  lag is false and
c310: 20 6e 41 72 67 20 69 73 20 2d 31 2c 20 74 68 65   nArg is -1, the
c320: 6e 20 74 68 65 20 66 69 72 73 74 20 76 61 6c 69  n the first vali
c330: 64 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 6f  d.** function fo
c340: 75 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e  und is returned.
c350: 20 20 41 20 66 75 6e 63 74 69 6f 6e 20 69 73 20    A function is 
c360: 76 61 6c 69 64 20 69 66 20 65 69 74 68 65 72 20  valid if either 
c370: 78 46 75 6e 63 0a 2a 2a 20 6f 72 20 78 53 74 65  xFunc.** or xSte
c380: 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  p is non-zero..*
c390: 2f 0a 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74  /.FuncDef *sqlit
c3a0: 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a 20  eFindFunction(. 
c3b0: 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20   sqlite *db,    
c3c0: 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64      /* An open d
c3d0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
c3e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
c3f0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
c400: 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e 75  unction.  Not nu
c410: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a 2f  ll-terminated */
c420: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20 20  .  int nName,   
c430: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c440: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
c450: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69   the name */.  i
c460: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
c470: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
c480: 72 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d 65  rguments.  -1 me
c490: 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72 20 2a  ans any number *
c4a0: 2f 0a 20 20 69 6e 74 20 63 72 65 61 74 65 46 6c  /.  int createFl
c4b0: 61 67 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ag     /* Create
c4c0: 20 6e 65 77 20 65 6e 74 72 79 20 69 66 20 74 72   new entry if tr
c4d0: 75 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ue and does not 
c4e0: 6f 74 68 65 72 77 69 73 65 20 65 78 69 73 74 20  otherwise exist 
c4f0: 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  */.){.  FuncDef 
c500: 2a 70 46 69 72 73 74 2c 20 2a 70 2c 20 2a 70 4d  *pFirst, *p, *pM
c510: 61 79 62 65 3b 0a 20 20 70 46 69 72 73 74 20 3d  aybe;.  pFirst =
c520: 20 70 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73   p = (FuncDef*)s
c530: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
c540: 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c  b->aFunc, zName,
c550: 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70   nName);.  if( p
c560: 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67 20   && !createFlag 
c570: 26 26 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20  && nArg<0 ){.   
c580: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
c590: 78 46 75 6e 63 3d 3d 30 20 26 26 20 70 2d 3e 78  xFunc==0 && p->x
c5a0: 53 74 65 70 3d 3d 30 20 29 7b 20 70 20 3d 20 70  Step==0 ){ p = p
c5b0: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 72  ->pNext; }.    r
c5c0: 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70  eturn p;.  }.  p
c5d0: 4d 61 79 62 65 20 3d 20 30 3b 0a 20 20 77 68 69  Maybe = 0;.  whi
c5e0: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 41 72 67  le( p && p->nArg
c5f0: 21 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66  !=nArg ){.    if
c600: 28 20 70 2d 3e 6e 41 72 67 3c 30 20 26 26 20 21  ( p->nArg<0 && !
c610: 63 72 65 61 74 65 46 6c 61 67 20 26 26 20 28 70  createFlag && (p
c620: 2d 3e 78 46 75 6e 63 20 7c 7c 20 70 2d 3e 78 53  ->xFunc || p->xS
c630: 74 65 70 29 20 29 20 70 4d 61 79 62 65 20 3d 20  tep) ) pMaybe = 
c640: 70 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  p;.    p = p->pN
c650: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
c660: 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67 20   && !createFlag 
c670: 26 26 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 26  && p->xFunc==0 &
c680: 26 20 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29 7b  & p->xStep==0 ){
c690: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c6a0: 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20 26 26   }.  if( p==0 &&
c6b0: 20 70 4d 61 79 62 65 20 29 7b 0a 20 20 20 20 61   pMaybe ){.    a
c6c0: 73 73 65 72 74 28 20 63 72 65 61 74 65 46 6c 61  ssert( createFla
c6d0: 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  g==0 );.    retu
c6e0: 72 6e 20 70 4d 61 79 62 65 3b 0a 20 20 7d 0a 20  rn pMaybe;.  }. 
c6f0: 20 69 66 28 20 70 3d 3d 30 20 26 26 20 63 72 65   if( p==0 && cre
c700: 61 74 65 46 6c 61 67 20 26 26 20 28 70 20 3d 20  ateFlag && (p = 
c710: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
c720: 65 6f 66 28 2a 70 29 29 29 21 3d 30 20 29 7b 0a  eof(*p)))!=0 ){.
c730: 20 20 20 20 70 2d 3e 6e 41 72 67 20 3d 20 6e 41      p->nArg = nA
c740: 72 67 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  rg;.    p->pNext
c750: 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 70   = pFirst;.    p
c760: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 70 46 69  ->dataType = pFi
c770: 72 73 74 20 3f 20 70 46 69 72 73 74 2d 3e 64 61  rst ? pFirst->da
c780: 74 61 54 79 70 65 20 3a 20 53 51 4c 49 54 45 5f  taType : SQLITE_
c790: 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 73 71 6c  NUMERIC;.    sql
c7a0: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
c7b0: 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c  b->aFunc, zName,
c7c0: 20 6e 4e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 70   nName, (void*)p
c7d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c7e0: 70 3b 0a 7d 0a                                   p;.}.