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

Artifact d2d1ddc0ee98f1d70c6caddc11b46a0121d9bddd:


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 38 20 32 30 30 34 2f 30 35 2f 31 36 20  .118 2004/05/16 
0220: 31 31 3a 31 35 3a 33 37 20 64 61 6e 69 65 6c 6b  11:15:37 danielk
0230: 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69  1977 Exp $.*/.#i
0240: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0250: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0260: 74 79 70 65 2e 68 3e 0a 0a 73 74 61 74 69 63 20  type.h>..static 
0270: 63 68 61 72 20 65 78 70 72 41 66 66 69 6e 69 74  char exprAffinit
0280: 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  y(Expr *pExpr){.
0290: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
02a0: 3d 54 4b 5f 41 53 20 29 7b 0a 20 20 20 20 72 65  =TK_AS ){.    re
02b0: 74 75 72 6e 20 65 78 70 72 41 66 66 69 6e 69 74  turn exprAffinit
02c0: 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  y(pExpr->pLeft);
02d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72  .  }.  if( pExpr
02e0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
02f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 65 78  ){.    return ex
0300: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0310: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
0320: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
0330: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
0340: 70 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a  pr->affinity;.}.
0350: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0360: 65 20 50 31 20 76 61 6c 75 65 20 74 68 61 74 20  e P1 value that 
0370: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
0380: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
0390: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
03a0: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
03b0: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
03c0: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
03d0: 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20 6a 75  pExpr2..** If ju
03e0: 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65  mpIfNull is true
03f0: 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 6c  , then set the l
0400: 6f 77 20 62 79 74 65 20 6f 66 20 74 68 65 20 72  ow byte of the r
0410: 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20 76 61  eturned.** P1 va
0420: 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74 68 65 20  lue to tell the 
0430: 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70 20 69  opcode to jump i
0440: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
0450: 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65 73  ion.** evaluates
0460: 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e 74   to NULL..*/.int
0470: 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 31   binaryCompareP1
0480: 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45  (Expr *pExpr1, E
0490: 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74  xpr *pExpr2, int
04a0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
04b0: 63 68 61 72 20 61 66 66 31 20 3d 20 65 78 70 72  char aff1 = expr
04c0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 29  Affinity(pExpr1)
04d0: 3b 0a 20 20 63 68 61 72 20 61 66 66 32 20 3d 20  ;.  char aff2 = 
04e0: 65 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  exprAffinity(pEx
04f0: 70 72 32 29 3b 0a 0a 20 20 69 66 28 20 61 66 66  pr2);..  if( aff
0500: 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20  1 && aff2 ){.   
0510: 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f   /* Both sides o
0520: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
0530: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66   are columns. If
0540: 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63   one has numeric
0550: 20 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67   or.    ** integ
0560: 65 72 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  er affinity, use
0570: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
0580: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
0590: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
05a0: 20 61 66 66 31 3d 3d 53 51 4c 49 54 45 5f 41 46   aff1==SQLITE_AF
05b0: 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
05c0: 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  2==SQLITE_AFF_IN
05d0: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 61  TEGER ){.      a
05e0: 66 66 31 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ff1 = SQLITE_AFF
05f0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 65  _INTEGER;.    }e
0600: 6c 73 65 0a 20 20 20 20 69 66 28 20 61 66 66 31  lse.    if( aff1
0610: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
0620: 45 52 49 43 20 7c 7c 20 61 66 66 32 3d 3d 53 51  ERIC || aff2==SQ
0630: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
0640: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 31 20 3d   ){.      aff1 =
0650: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
0660: 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  RIC;.    }else{.
0670: 20 20 20 20 20 20 61 66 66 31 20 3d 20 53 51 4c        aff1 = SQL
0680: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
0690: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
06a0: 21 61 66 66 31 20 29 7b 0a 20 20 20 20 61 66 66  !aff1 ){.    aff
06b0: 31 20 3d 20 61 66 66 32 3b 0a 20 20 7d 0a 0a 20  1 = aff2;.  }.. 
06c0: 20 72 65 74 75 72 6e 20 28 28 28 69 6e 74 29 61   return (((int)a
06d0: 66 66 31 29 3c 3c 38 29 2b 28 6a 75 6d 70 49 66  ff1)<<8)+(jumpIf
06e0: 4e 75 6c 6c 3f 31 3a 30 29 3b 0a 7d 0a 0a 2f 2a  Null?1:0);.}../*
06f0: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
0700: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
0710: 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ode and return a
0720: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20   pointer to it. 
0730: 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74   Memory.** for t
0740: 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74 61  his node is obta
0750: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
0760: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
0770: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
0780: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
0790: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
07a0: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
07b0: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
07c0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
07d0: 65 33 45 78 70 72 28 69 6e 74 20 6f 70 2c 20 45  e3Expr(int op, E
07e0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
07f0: 20 2a 70 52 69 67 68 74 2c 20 54 6f 6b 65 6e 20   *pRight, Token 
0800: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
0810: 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d   *pNew;.  pNew =
0820: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
0830: 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20  izeof(Expr) );. 
0840: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
0850: 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c 6c      /* When mall
0860: 6f 63 20 66 61 69 6c 73 2c 20 77 65 20 6c 65 61  oc fails, we lea
0870: 6b 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 70 4c  k memory from pL
0880: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 2a  eft and pRight *
0890: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
08a0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d    }.  pNew->op =
08b0: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
08c0: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
08d0: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
08e0: 67 68 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ght;.  if( pToke
08f0: 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
0900: 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20   pToken->dyn==0 
0910: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  );.    pNew->tok
0920: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
0930: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 2a    pNew->span = *
0940: 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b  pToken;.  }else{
0950: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
0960: 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20  w->token.dyn==0 
0970: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
0980: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20  New->token.z==0 
0990: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
09a0: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 30 20  New->token.n==0 
09b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  );.    if( pLeft
09c0: 20 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20   && pRight ){.  
09d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
09e0: 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74  pan(pNew, &pLeft
09f0: 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d  ->span, &pRight-
0a00: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  >span);.    }els
0a10: 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 73  e{.      pNew->s
0a20: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
0a30: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  n;.    }.  }.  r
0a40: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
0a50: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
0a60: 72 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f 66 20  r.span field of 
0a70: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
0a80: 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c  sion to span all
0a90: 0a 2a 2a 20 74 65 78 74 20 62 65 74 77 65 65 6e  .** text between
0aa0: 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 74   the two given t
0ab0: 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  okens..*/.void s
0ac0: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 45  qlite3ExprSpan(E
0ad0: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
0ae0: 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20  n *pLeft, Token 
0af0: 2a 70 52 69 67 68 74 29 7b 0a 20 20 61 73 73 65  *pRight){.  asse
0b00: 72 74 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b  rt( pRight!=0 );
0b10: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
0b20: 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 4e 6f 74 65  !=0 );.  /* Note
0b30: 3a 20 70 45 78 70 72 20 6d 69 67 68 74 20 62 65  : pExpr might be
0b40: 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61 20 70   NULL due to a p
0b50: 72 69 6f 72 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  rior malloc fail
0b60: 75 72 65 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ure */.  if( pEx
0b70: 70 72 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20  pr && pRight->z 
0b80: 26 26 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20  && pLeft->z ){. 
0b90: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 64 79     if( pLeft->dy
0ba0: 6e 3d 3d 30 20 26 26 20 70 52 69 67 68 74 2d 3e  n==0 && pRight->
0bb0: 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dyn==0 ){.      
0bc0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
0bd0: 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 20 20  pLeft->z;.      
0be0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20  pExpr->span.n = 
0bf0: 70 52 69 67 68 74 2d 3e 6e 20 2b 20 41 64 64 72  pRight->n + Addr
0c00: 28 70 52 69 67 68 74 2d 3e 7a 29 20 2d 20 41 64  (pRight->z) - Ad
0c10: 64 72 28 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20  dr(pLeft->z);.  
0c20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
0c30: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  Expr->span.z = 0
0c40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
0c50: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
0c60: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
0c70: 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74  node for a funct
0c80: 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c  ion with multipl
0c90: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a  e.** arguments..
0ca0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
0cb0: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ExprFunction(Exp
0cc0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
0cd0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
0ce0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  Expr *pNew;.  pN
0cf0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
0d00: 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20  c( sizeof(Expr) 
0d10: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
0d20: 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   ){.    /* sqlit
0d30: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0d40: 28 70 4c 69 73 74 29 3b 20 2f 2f 20 4c 65 61 6b  (pList); // Leak
0d50: 20 70 4c 69 73 74 20 77 68 65 6e 20 6d 61 6c 6c   pList when mall
0d60: 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  oc fails */.    
0d70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
0d80: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55  pNew->op = TK_FU
0d90: 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e  NCTION;.  pNew->
0da0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
0db0: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
0dc0: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65     assert( pToke
0dd0: 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20  n->dyn==0 );.   
0de0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a   pNew->token = *
0df0: 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b  pToken;.  }else{
0e00: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
0e10: 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  .z = 0;.  }.  pN
0e20: 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d  ew->span = pNew-
0e30: 3e 74 6f 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e  >token;.  return
0e40: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
0e50: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
0e60: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
0e70: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
0e80: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0e90: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
0ea0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0eb0: 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79    if( p->span.dy
0ec0: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
0ed0: 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29  char*)p->span.z)
0ee0: 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  ;.  if( p->token
0ef0: 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65  .dyn ) sqliteFre
0f00: 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  e((char*)p->toke
0f10: 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  n.z);.  sqlite3E
0f20: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65  xprDelete(p->pLe
0f30: 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ft);.  sqlite3Ex
0f40: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 52 69 67  prDelete(p->pRig
0f50: 68 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ht);.  sqlite3Ex
0f60: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
0f70: 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
0f80: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 2d  3SelectDelete(p-
0f90: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
0fa0: 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 0a  iteFree(p);.}...
0fb0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
0fc0: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
0fd0: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
0fe0: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
0ff0: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
1000: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
1010: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
1020: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
1030: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
1040: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
1050: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
1060: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
1070: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
1080: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
1090: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
10a0: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
10b0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
10c0: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
10d0: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
10e0: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
10f0: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
1100: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
1110: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
1120: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
1130: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
1140: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
1150: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
1160: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
1170: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
1180: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
1190: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
11a0: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
11b0: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
11c0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
11d0: 74 65 33 45 78 70 72 44 75 70 28 45 78 70 72 20  te3ExprDup(Expr 
11e0: 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  *p){.  Expr *pNe
11f0: 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  w;.  if( p==0 ) 
1200: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
1210: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
1220: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  aw( sizeof(*p) )
1230: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
1240: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65  ) return 0;.  me
1250: 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 73 69  mcpy(pNew, p, si
1260: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
1270: 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d  if( p->token.z!=
1280: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  0 ){.    pNew->t
1290: 6f 6b 65 6e 2e 7a 20 3d 20 73 71 6c 69 74 65 53  oken.z = sqliteS
12a0: 74 72 44 75 70 28 70 2d 3e 74 6f 6b 65 6e 2e 7a  trDup(p->token.z
12b0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  );.    pNew->tok
12c0: 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65  en.dyn = 1;.  }e
12d0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
12e0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d   pNew->token.z==
12f0: 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  0 );.  }.  pNew-
1300: 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70  >span.z = 0;.  p
1310: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
1320: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
1330: 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  Left);.  pNew->p
1340: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
1350: 78 70 72 44 75 70 28 70 2d 3e 70 52 69 67 68 74  xprDup(p->pRight
1360: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74  );.  pNew->pList
1370: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1380: 73 74 44 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b  stDup(p->pList);
1390: 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74  .  pNew->pSelect
13a0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13b0: 44 75 70 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b  Dup(p->pSelect);
13c0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
13d0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f  }.void sqlite3To
13e0: 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70  kenCopy(Token *p
13f0: 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d  To, Token *pFrom
1400: 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79  ){.  if( pTo->dy
1410: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
1420: 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20  char*)pTo->z);. 
1430: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b   if( pFrom->z ){
1440: 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46  .    pTo->n = pF
1450: 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d  rom->n;.    pTo-
1460: 3e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  >z = sqliteStrND
1470: 75 70 28 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72  up(pFrom->z, pFr
1480: 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d  om->n);.    pTo-
1490: 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  >dyn = 1;.  }els
14a0: 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20  e{.    pTo->z = 
14b0: 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73  0;.  }.}.ExprLis
14c0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
14d0: 73 74 44 75 70 28 45 78 70 72 4c 69 73 74 20 2a  stDup(ExprList *
14e0: 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  p){.  ExprList *
14f0: 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45  pNew;.  struct E
1500: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1510: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
1520: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1530: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
1540: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
1550: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
1560: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
1570: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
1580: 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  Expr = pNew->nAl
1590: 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  loc = p->nExpr;.
15a0: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65    pNew->a = pIte
15b0: 6d 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  m = sqliteMalloc
15c0: 28 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f  ( p->nExpr*sizeo
15d0: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
15e0: 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 20 72  if( pItem==0 ) r
15f0: 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4c 65 61  eturn 0;  /* Lea
1600: 6b 73 20 6d 65 6d 6f 72 79 20 61 66 74 65 72 20  ks memory after 
1610: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
1620: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1630: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  <p->nExpr; i++, 
1640: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pItem++){.    Ex
1650: 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70  pr *pNewExpr, *p
1660: 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74  OldExpr;.    pIt
1670: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77  em->pExpr = pNew
1680: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
1690: 70 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d  prDup(pOldExpr =
16a0: 20 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b   p->a[i].pExpr);
16b0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70  .    if( pOldExp
16c0: 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20  r->span.z!=0 && 
16d0: 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20 20  pNewExpr ){.    
16e0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65    /* Always make
16f0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
1700: 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65  pan for top-leve
1710: 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  l expressions in
1720: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78   the.      ** ex
1730: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
1740: 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c  The logic in SEL
1750: 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74  ECT processing t
1760: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20  hat determines. 
1770: 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65       ** the name
1780: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s of columns in 
1790: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6e  the result set n
17a0: 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d  eeds this inform
17b0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73  ation */.      s
17c0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
17d0: 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c  &pNewExpr->span,
17e0: 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e   &pOldExpr->span
17f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1800: 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30  ert( pNewExpr==0
1810: 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70   || pNewExpr->sp
1820: 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20  an.z!=0 .       
1830: 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72       || pOldExpr
1840: 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73  ->span.z==0 || s
1850: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
1860: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74 65  iled );.    pIte
1870: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
1880: 65 53 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e  eStrDup(p->a[i].
1890: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  zName);.    pIte
18a0: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  m->sortOrder = p
18b0: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
18c0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41  ;.    pItem->isA
18d0: 67 67 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73 41  gg = p->a[i].isA
18e0: 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64  gg;.    pItem->d
18f0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  one = 0;.  }.  r
1900: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 72  eturn pNew;.}.Sr
1910: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1920: 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69 73 74  cListDup(SrcList
1930: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
1940: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
1950: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
1960: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1970: 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   0;.  nByte = si
1980: 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e  zeof(*p) + (p->n
1990: 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70  Src>0 ? sizeof(p
19a0: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53  ->a[0]) * (p->nS
19b0: 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e  rc-1) : 0);.  pN
19c0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
19d0: 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a 20  cRaw( nByte );. 
19e0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
19f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
1a00: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
1a10: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
1a20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
1a30: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
1a40: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1a50: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
1a60: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
1a70: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1a80: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
1a90: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
1aa0: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
1ab0: 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  se = sqliteStrDu
1ac0: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  p(pOldItem->zDat
1ad0: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
1ae0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
1af0: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
1b00: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1b10: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61   pNewItem->zAlia
1b20: 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  s = sqliteStrDup
1b30: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61  (pOldItem->zAlia
1b40: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
1b50: 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c  ->jointype = pOl
1b60: 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b  dItem->jointype;
1b70: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
1b80: 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65  Cursor = pOldIte
1b90: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
1ba0: 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d  pNewItem->pTab =
1bb0: 20 30 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d   0;.    pNewItem
1bc0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
1bd0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 4f 6c  te3SelectDup(pOl
1be0: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  dItem->pSelect);
1bf0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
1c00: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
1c10: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  Dup(pOldItem->pO
1c20: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  n);.    pNewItem
1c30: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
1c40: 65 33 49 64 4c 69 73 74 44 75 70 28 70 4f 6c 64  e3IdListDup(pOld
1c50: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
1c60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
1c70: 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  ;.}.IdList *sqli
1c80: 74 65 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c  te3IdListDup(IdL
1c90: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
1ca0: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
1cb0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1cc0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
1cd0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
1ce0: 77 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  w( sizeof(*pNew)
1cf0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
1d00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1d10: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77  pNew->nId = pNew
1d20: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49  ->nAlloc = p->nI
1d30: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
1d40: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
1d50: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
1d60: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
1d70: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 20 72 65 74  pNew->a==0 ) ret
1d80: 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
1d90: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
1da0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
1db0: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
1dc0: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
1dd0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
1de0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
1df0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
1e00: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
1e10: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
1e20: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  p(pOldItem->zNam
1e30: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
1e40: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
1e50: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
1e60: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
1e70: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
1e80: 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b  tDup(Select *p){
1e90: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
1ea0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1eb0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
1ec0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
1ed0: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
1ee0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
1ef0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
1f00: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70  ->isDistinct = p
1f10: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
1f20: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
1f30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
1f40: 70 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  p(p->pEList);.  
1f50: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
1f60: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 70  ite3SrcListDup(p
1f70: 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d  ->pSrc);.  pNew-
1f80: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
1f90: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65  3ExprDup(p->pWhe
1fa0: 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  re);.  pNew->pGr
1fb0: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
1fc0: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47  xprListDup(p->pG
1fd0: 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d  roupBy);.  pNew-
1fe0: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
1ff0: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61  e3ExprDup(p->pHa
2000: 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  ving);.  pNew->p
2010: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
2020: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  3ExprListDup(p->
2030: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65  pOrderBy);.  pNe
2040: 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  w->op = p->op;. 
2050: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
2060: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
2070: 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70  (p->pPrior);.  p
2080: 4e 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d  New->nLimit = p-
2090: 3e 6e 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d  >nLimit;.  pNew-
20a0: 3e 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f  >nOffset = p->nO
20b0: 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 7a  ffset;.  pNew->z
20c0: 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 70 4e  Select = 0;.  pN
20d0: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
20e0: 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74  .  pNew->iOffset
20f0: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
2100: 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pNew;.}.../*.** 
2110: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
2120: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
2130: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
2140: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
2150: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
2160: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
2170: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
2180: 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69   list..*/.ExprLi
2190: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
21a0: 69 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69  istAppend(ExprLi
21b0: 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20  st *pList, Expr 
21c0: 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70  *pExpr, Token *p
21d0: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c 69  Name){.  if( pLi
21e0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
21f0: 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
2200: 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69  c( sizeof(ExprLi
2210: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
2220: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
2230: 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44   /* sqlite3ExprD
2240: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f  elete(pExpr); //
2250: 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20   Leak memory if 
2260: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
2270: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2280: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2290: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d  ( pList->nAlloc=
22a0: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  =0 );.  }.  if( 
22b0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70  pList->nAlloc<=p
22c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
22d0: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
22e0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
22f0: 2a 32 20 2b 20 34 3b 0a 20 20 20 20 70 4c 69 73  *2 + 4;.    pLis
2300: 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65 61  t->a = sqliteRea
2310: 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70  lloc(pList->a, p
2320: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a  List->nAlloc*siz
2330: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
2340: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
2350: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->a==0 ){.      
2360: 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  /* sqlite3ExprDe
2370: 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f 20  lete(pExpr); // 
2380: 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20 6d  Leak memory if m
2390: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
23a0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70       pList->nExp
23b0: 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  r = pList->nAllo
23c0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  c = 0;.      ret
23d0: 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d  urn pList;.    }
23e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
23f0: 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20  List->a!=0 );.  
2400: 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61  if( pExpr || pNa
2410: 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  me ){.    struct
2420: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2430: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
2440: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
2450: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
2460: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
2470: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
2480: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
2490: 72 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65  r;.    if( pName
24a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24b0: 33 53 65 74 4e 53 74 72 69 6e 67 28 26 70 49 74  3SetNString(&pIt
24c0: 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  em->zName, pName
24d0: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30  ->z, pName->n, 0
24e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24f0: 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a  Dequote(pItem->z
2500: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
2510: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
2520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2530: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
2540: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
2550: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
2560: 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69  istDelete(ExprLi
2570: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
2580: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
2590: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
25a0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
25b0: 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e  !=0 || (pList->n
25c0: 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74  Expr==0 && pList
25d0: 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a  ->nAlloc==0) );.
25e0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
25f0: 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e  >nExpr<=pList->n
2600: 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 69  Alloc );.  for(i
2610: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
2620: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  pr; i++){.    sq
2630: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2640: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
2650: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  r);.    sqliteFr
2660: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
2670: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
2680: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
2690: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
26a0: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
26b0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
26c0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
26d0: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
26e0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
26f0: 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74  t.** and 0 if it
2700: 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62   involves variab
2710: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
2720: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
2730: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
2740: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
2750: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
2760: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
2770: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
2780: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
2790: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
27a0: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
27b0: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
27c0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
27d0: 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 73  nt(Expr *p){.  s
27e0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
27f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a      case TK_ID:.
2800: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
2810: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
2820: 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  DOT:.    case TK
2830: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
2840: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
2850: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20  ase TK_NULL:.   
2860: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
2870: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
2880: 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54  EGER:.    case T
2890: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
28a0: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
28b0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
28c0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
28d0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
28e0: 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
28f0: 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c  IsConstant(p->pL
2900: 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
2910: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 52  .      if( p->pR
2920: 69 67 68 74 20 26 26 20 21 73 71 6c 69 74 65 33  ight && !sqlite3
2930: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
2940: 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75  ->pRight) ) retu
2950: 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 0;.      if( 
2960: 70 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  p->pList ){.    
2970: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2980: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
2990: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
29a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
29b0: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
29c0: 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 69  sConstant(p->pLi
29d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
29e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
29f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2a00: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 4c      return p->pL
2a10: 65 66 74 21 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  eft!=0 || p->pRi
2a20: 67 68 74 21 3d 30 20 7c 7c 20 28 70 2d 3e 70 4c  ght!=0 || (p->pL
2a30: 69 73 74 20 26 26 20 70 2d 3e 70 4c 69 73 74 2d  ist && p->pList-
2a40: 3e 6e 45 78 70 72 3e 30 29 3b 0a 20 20 20 20 7d  >nExpr>0);.    }
2a50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
2a70: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
2a80: 6e 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61  n codes a consta
2a90: 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  nt integer that 
2aa0: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a  is small enough.
2ab0: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33  ** to fit in a 3
2ac0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
2ad0: 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20  eturn 1 and put 
2ae0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2af0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a   integer.** in *
2b00: 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20  pValue.  If the 
2b10: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
2b20: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  t an integer or 
2b30: 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67  if it is too big
2b40: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
2b50: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
2b60: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20  teger, return 0 
2b70: 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75  and leave *pValu
2b80: 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
2b90: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
2ba0: 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70  sInteger(Expr *p
2bb0: 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
2bc0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
2bd0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
2be0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
2bf0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49  if( sqlite3FitsI
2c00: 6e 33 32 42 69 74 73 28 70 2d 3e 74 6f 6b 65 6e  n32Bits(p->token
2c10: 2e 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  .z) ){.        *
2c20: 70 56 61 6c 75 65 20 3d 20 61 74 6f 69 28 70 2d  pValue = atoi(p-
2c30: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20  >token.z);.     
2c40: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2c50: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
2c60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2c70: 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
2c80: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2c90: 7a 20 3d 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  z = p->token.z;.
2ca0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d        int n = p-
2cb0: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  >token.n;.      
2cc0: 69 66 28 20 6e 3e 30 20 26 26 20 7a 5b 30 5d 3d  if( n>0 && z[0]=
2cd0: 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d  ='-' ){ z++; n--
2ce0: 3b 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ; }.      while(
2cf0: 20 6e 3e 30 20 26 26 20 2a 7a 20 26 26 20 69 73   n>0 && *z && is
2d00: 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b  digit(*z) ){ z++
2d10: 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 69  ; n--; }.      i
2d20: 66 28 20 6e 3d 3d 30 20 26 26 20 73 71 6c 69 74  f( n==0 && sqlit
2d30: 65 33 46 69 74 73 49 6e 33 32 42 69 74 73 28 70  e3FitsIn32Bits(p
2d40: 2d 3e 74 6f 6b 65 6e 2e 7a 29 20 29 7b 0a 20 20  ->token.z) ){.  
2d50: 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
2d60: 61 74 6f 69 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  atoi(p->token.z)
2d70: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2d80: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2d90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2da0: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
2db0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
2dc0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
2dd0: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
2de0: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20  pValue);.    }. 
2df0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
2e00: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
2e10: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
2e20: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
2e30: 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
2e40: 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  {.        *pValu
2e50: 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
2e60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2e70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
2e80: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
2e90: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  : break;.  }.  r
2ea0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2eb0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2ec0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
2ed0: 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
2ee0: 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
2ef0: 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
2f00: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
2f10: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
2f20: 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
2f30: 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
2f40: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
2f50: 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
2f60: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
2f70: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
2f80: 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
2f90: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
2fa0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2fb0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
2fc0: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
2fd0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59   of the form X.Y
2fe0: 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73  .Z or Y.Z or jus
2ff0: 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20  t Z, look up.** 
3000: 74 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65  that name in the
3010: 20 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74   set of source t
3020: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73  ables in pSrcLis
3030: 74 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70  t and make the p
3040: 45 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73  Expr .** express
3050: 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62  ion node refer b
3060: 61 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72  ack to that sour
3070: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
3080: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
3090: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
30a0: 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20   pExpr:.**.**   
30b0: 20 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20   pExpr->iDb     
30c0: 20 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e        Set the in
30d0: 64 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  dex in db->aDb[]
30e0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
30f0: 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20   holding.**     
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 20 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a      the table..*
3120: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  *    pExpr->iTab
3130: 6c 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f  le        Set to
3140: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
3150: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
3160: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20   obtained.**    
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69       from pSrcLi
3190: 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  st..**    pExpr-
31a0: 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53  >iColumn       S
31b0: 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
31c0: 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74   number within t
31d0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  he table..**    
31e0: 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20  pExpr->dataType 
31f0: 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20       Set to the 
3200: 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61  appropriate data
3210: 20 74 79 70 65 20 66 6f 72 20 74 68 65 20 63 6f   type for the co
3220: 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 70 45 78 70  lumn..**    pExp
3230: 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
3240: 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d   Set to TK_COLUM
3250: 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  N..**    pExpr->
3260: 70 4c 65 66 74 20 20 20 20 20 20 20 20 20 41 6e  pLeft         An
3270: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69  y expression thi
3280: 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64  s points to is d
3290: 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78  eleted.**    pEx
32a0: 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20  pr->pRight      
32b0: 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e    Any expression
32c0: 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20   this points to 
32d0: 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
32e0: 2a 20 54 68 65 20 70 44 62 54 6f 6b 65 6e 20 69  * The pDbToken i
32f0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
3300: 65 20 64 61 74 61 62 61 73 65 20 28 74 68 65 20  e database (the 
3310: 22 58 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75  "X").  This valu
3320: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c  e may be.** NULL
3330: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61   meaning that na
3340: 6d 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  me is of the for
3350: 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79  m Y.Z or Z.  Any
3360: 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62   available datab
3370: 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ase.** can be us
3380: 65 64 2e 20 20 54 68 65 20 70 54 61 62 6c 65 54  ed.  The pTableT
3390: 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  oken is the name
33a0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 74   of the table (t
33b0: 68 65 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a  he "Y").  This.*
33c0: 2a 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e  * value can be N
33d0: 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e 20  ULL if pDbToken 
33e0: 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49  is also NULL.  I
33f0: 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  f pTableToken is
3400: 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e   NULL it.** mean
3410: 73 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20  s that the form 
3420: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a  of the name is Z
3430: 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e   and that column
3440: 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65  s from any table
3450: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e  .** can be used.
3460: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61  .**.** If the na
3470: 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73  me cannot be res
3480: 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75  olved unambiguou
3490: 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  sly, leave an er
34a0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
34b0: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
34c0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52  urn non-zero.  R
34d0: 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73 75  eturn zero on su
34e0: 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccess..*/.static
34f0: 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28   int lookupName(
3500: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3510: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
3520: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3530: 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b  .  Token *pDbTok
3540: 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  en,     /* Name 
3550: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3560: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65  containing table
3570: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
3580: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65  oken *pTableToke
3590: 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  n,  /* Name of t
35a0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
35b0: 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20  column, or NULL 
35c0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c  */.  Token *pCol
35d0: 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d  umnToken, /* Nam
35e0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
35f0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
3600: 53 72 63 4c 69 73 74 2c 20 20 20 2f 2a 20 4c 69  SrcList,   /* Li
3610: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65  st of tables use
3620: 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 63 6f 6c  d to resolve col
3630: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 45  umn names */.  E
3640: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
3650: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65      /* List of e
3660: 78 70 72 65 73 73 69 6f 6e 73 20 75 73 65 64 20  xpressions used 
3670: 74 6f 20 72 65 73 6f 6c 76 65 20 22 41 53 22 20  to resolve "AS" 
3680: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
3690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
36a0: 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65  e this EXPR node
36b0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65   point to the se
36c0: 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f  lected column */
36d0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20  .){.  char *zDb 
36e0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
36f0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
3700: 73 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e 20  se.  The "X" in 
3710: 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20  X.Y.Z */.  char 
3720: 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *zTab = 0;      
3730: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3740: 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20 69  able.  The "Y" i
3750: 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a  n X.Y.Z or Y.Z *
3760: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  /.  char *zCol =
3770: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65   0;      /* Name
3780: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
3790: 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69 6e   The "Z" */.  in
37a0: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
37b0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
37c0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ers */.  int cnt
37d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
37e0: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
37f0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
3800: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62   */.  int cntTab
3810: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
3820: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
3830: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a   table names */.
3840: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
3850: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54  Parse->db;  /* T
3860: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
3870: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d    assert( pColum
3880: 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d  nToken && pColum
3890: 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20  nToken->z ); /* 
38a0: 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63  The Z in X.Y.Z c
38b0: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  annot be NULL */
38c0: 0a 20 20 69 66 28 20 70 44 62 54 6f 6b 65 6e 20  .  if( pDbToken 
38d0: 26 26 20 70 44 62 54 6f 6b 65 6e 2d 3e 7a 20 29  && pDbToken->z )
38e0: 7b 0a 20 20 20 20 7a 44 62 20 3d 20 73 71 6c 69  {.    zDb = sqli
38f0: 74 65 53 74 72 4e 44 75 70 28 70 44 62 54 6f 6b  teStrNDup(pDbTok
3900: 65 6e 2d 3e 7a 2c 20 70 44 62 54 6f 6b 65 6e 2d  en->z, pDbToken-
3910: 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >n);.    sqlite3
3920: 44 65 71 75 6f 74 65 28 7a 44 62 29 3b 0a 20 20  Dequote(zDb);.  
3930: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d  }else{.    zDb =
3940: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54   0;.  }.  if( pT
3950: 61 62 6c 65 54 6f 6b 65 6e 20 26 26 20 70 54 61  ableToken && pTa
3960: 62 6c 65 54 6f 6b 65 6e 2d 3e 7a 20 29 7b 0a 20  bleToken->z ){. 
3970: 20 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65     zTab = sqlite
3980: 53 74 72 4e 44 75 70 28 70 54 61 62 6c 65 54 6f  StrNDup(pTableTo
3990: 6b 65 6e 2d 3e 7a 2c 20 70 54 61 62 6c 65 54 6f  ken->z, pTableTo
39a0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ken->n);.    sql
39b0: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 54 61 62  ite3Dequote(zTab
39c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
39d0: 61 73 73 65 72 74 28 20 7a 44 62 3d 3d 30 20 29  assert( zDb==0 )
39e0: 3b 0a 20 20 20 20 7a 54 61 62 20 3d 20 30 3b 0a  ;.    zTab = 0;.
39f0: 20 20 7d 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c    }.  zCol = sql
3a00: 69 74 65 53 74 72 4e 44 75 70 28 70 43 6f 6c 75  iteStrNDup(pColu
3a10: 6d 6e 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 43 6f 6c  mnToken->z, pCol
3a20: 75 6d 6e 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20  umnToken->n);.  
3a30: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
3a40: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Col);.  if( sqli
3a50: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
3a60: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
3a70: 31 3b 20 20 2f 2a 20 4c 65 61 6b 20 6d 65 6d 6f  1;  /* Leak memo
3a80: 72 79 20 28 7a 44 62 20 61 6e 64 20 7a 54 61 62  ry (zDb and zTab
3a90: 29 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  ) if malloc fail
3aa0: 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72  s */.  }.  asser
3ab0: 74 28 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 70 45  t( zTab==0 || pE
3ac0: 4c 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 45  List==0 );..  pE
3ad0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31  xpr->iTable = -1
3ae0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3af0: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
3b00: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
3b10: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
3b20: 74 65 6d 20 3d 20 26 70 53 72 63 4c 69 73 74 2d  tem = &pSrcList-
3b30: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
3b40: 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
3b50: 70 54 61 62 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e  pTab;.    Column
3b60: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 20 20 69 66 28   *pCol;..    if(
3b70: 20 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pTab==0 ) conti
3b80: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
3b90: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b   pTab->nCol>0 );
3ba0: 0a 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b  .    if( zTab ){
3bb0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
3bc0: 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
3bd0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
3be0: 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  me = pItem->zAli
3bf0: 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  as;.        if( 
3c00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
3c10: 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d  TabName, zTab)!=
3c20: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
3c30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3c40: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
3c50: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
3c60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61  .        if( zTa
3c70: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  bName==0 || sqli
3c80: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e  te3StrICmp(zTabN
3c90: 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20  ame, zTab)!=0 ) 
3ca0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3cb0: 20 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20    if( zDb!=0 && 
3cc0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64  sqlite3StrICmp(d
3cd0: 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62  b->aDb[pTab->iDb
3ce0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30  ].zName, zDb)!=0
3cf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
3d00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
3d10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
3d20: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
3d30: 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 70  ab++) ){.      p
3d40: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
3d50: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
3d60: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20       pExpr->iDb 
3d70: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20  = pTab->iDb;.   
3d80: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20   }.    for(j=0, 
3d90: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
3da0: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
3db0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
3dc0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
3dd0: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
3de0: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
3df0: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
3e00: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
3e10: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
3e20: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 45  rsor;.        pE
3e30: 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d  xpr->iDb = pTab-
3e40: 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 2f 2a  >iDb;.        /*
3e50: 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20   Substitute the 
3e60: 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31  rowid (column -1
3e70: 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45  ) for the INTEGE
3e80: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f  R PRIMARY KEY */
3e90: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
3ea0: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61  iColumn = j==pTa
3eb0: 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20  b->iPKey ? -1 : 
3ec0: 6a 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  j;.        pExpr
3ed0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61  ->affinity = pTa
3ee0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e  b->aCol[j].affin
3ef0: 69 74 79 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ity;..        /*
3f00: 20 46 49 58 20 4d 45 3a 20 45 78 70 72 3a 3a 64   FIX ME: Expr::d
3f10: 61 74 61 54 79 70 65 20 77 69 6c 6c 20 62 65 20  ataType will be 
3f20: 72 65 6d 6f 76 65 64 2e 2e 2e 20 2a 2f 0a 20 20  removed... */.  
3f30: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74        pExpr->dat
3f40: 61 54 79 70 65 20 3d 0a 20 20 20 20 20 20 20 20  aType =.        
3f50: 20 20 20 20 28 70 43 6f 6c 2d 3e 61 66 66 69 6e      (pCol->affin
3f60: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
3f70: 54 45 58 54 3f 53 51 4c 49 54 45 5f 53 4f 5f 54  TEXT?SQLITE_SO_T
3f80: 45 58 54 3a 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  EXT:SQLITE_SO_NU
3f90: 4d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  M);.        brea
3fa0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3fb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
3fc0: 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64   have not alread
3fd0: 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e  y resolved the n
3fe0: 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20  ame, then maybe 
3ff0: 0a 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65  .  ** it is a ne
4000: 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69  w.* or old.* tri
4010: 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65  gger argument re
4020: 66 65 72 65 6e 63 65 0a 20 20 2a 2f 0a 20 20 69  ference.  */.  i
4030: 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61  f( zDb==0 && zTa
4040: 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26  b!=0 && cnt==0 &
4050: 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  & pParse->trigSt
4060: 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 54 72  ack!=0 ){.    Tr
4070: 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69  iggerStack *pTri
4080: 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72  ggerStack = pPar
4090: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20  se->trigStack;. 
40a0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
40b0: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54 72 69   0;.    if( pTri
40c0: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64  ggerStack->newId
40d0: 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74  x != -1 && sqlit
40e0: 65 33 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c  e3StrICmp("new",
40f0: 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20   zTab) == 0 ){. 
4100: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
4110: 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  le = pTriggerSta
4120: 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20  ck->newIdx;.    
4130: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
4140: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b  erStack->pTab );
4150: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
4160: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
4170: 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  b;.    }else if(
4180: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
4190: 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26 26 20  oldIdx != -1 && 
41a0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22  sqlite3StrICmp("
41b0: 6f 6c 64 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30  old", zTab) == 0
41c0: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
41d0: 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67  >iTable = pTrigg
41e0: 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b  erStack->oldIdx;
41f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4200: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
4210: 61 62 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  ab );.      pTab
4220: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
4230: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d 0a 0a 20  ->pTab;.    }.. 
4240: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 20 0a     if( pTab ){ .
4250: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
4260: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20     Column *pCol 
4270: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  = pTab->aCol;.  
4280: 20 20 20 20 0a 20 20 20 20 20 20 70 45 78 70 72      .      pExpr
4290: 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44  ->iDb = pTab->iD
42a0: 62 3b 0a 20 20 20 20 20 20 63 6e 74 54 61 62 2b  b;.      cntTab+
42b0: 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  +;.      for(j=0
42c0: 3b 20 6a 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c  ; j < pTab->nCol
42d0: 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b  ; j++, pCol++) {
42e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
42f0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
4300: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ->zName, zCol)==
4310: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
4320: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
4330: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
4340: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
4350: 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20  ? -1 : j;.      
4360: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
4370: 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ity = pTab->aCol
4380: 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  [j].affinity;.  
4390: 20 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d          /* FIX M
43a0: 45 3a 20 45 78 70 72 3a 3a 64 61 74 61 54 79 70  E: Expr::dataTyp
43b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 6d 6f 76 65  e will be remove
43c0: 64 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  d... */.        
43d0: 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70    pExpr->dataTyp
43e0: 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
43f0: 20 20 28 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74    (pCol->affinit
4400: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
4410: 58 54 3f 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  XT?SQLITE_SO_TEX
4420: 54 3a 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 29  T:SQLITE_SO_NUM)
4430: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
4440: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
4450: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
4460: 20 20 2f 2a 0a 20 20 2a 2a 20 50 65 72 68 61 70    /*.  ** Perhap
4470: 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20 61 20  s the name is a 
4480: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
4490: 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 69 66   ROWID.  */.  if
44a0: 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54  ( cnt==0 && cntT
44b0: 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33  ab==1 && sqlite3
44c0: 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b  IsRowid(zCol) ){
44d0: 0a 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20  .    cnt = 1;.  
44e0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
44f0: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 45 78 70 72   = -1;.    pExpr
4500: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c  ->dataType = SQL
4510: 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20  ITE_SO_NUM;.    
4520: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
4530: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
4540: 45 47 45 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  EGER;.  }..  /*.
4550: 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75    ** If the inpu
4560: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
4570: 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58   Z (not Y.Z or X
4580: 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e  .Y.Z) then the n
4590: 61 6d 65 20 5a 0a 20 20 2a 2a 20 6d 69 67 68 74  ame Z.  ** might
45a0: 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73   refer to an res
45b0: 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20  ult-set alias.  
45c0: 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
45d0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
45e0: 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f    ** we are reso
45f0: 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74  lving names in t
4600: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4610: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4620: 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 2a 2a 0a 20   command:.  **. 
4630: 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
4640: 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62  +b AS x FROM tab
4650: 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20  le WHERE x<10;. 
4660: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73 65   **.  ** In case
4670: 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70  s like this, rep
4680: 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20  lace pExpr with 
4690: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
46a0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20  pression that.  
46b0: 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73  ** forms the res
46c0: 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22  ult set entry ("
46d0: 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d  a+b" in the exam
46e0: 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ple) and return 
46f0: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a  immediately..  *
4700: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
4710: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
4720: 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f  e result set sho
4730: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
4740: 20 62 65 65 6e 0a 20 20 2a 2a 20 72 65 73 6f 6c   been.  ** resol
4750: 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 20  ved by the time 
4760: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4770: 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20   is resolved..  
4780: 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  */.  if( cnt==0 
4790: 26 26 20 70 45 4c 69 73 74 21 3d 30 20 29 7b 0a  && pEList!=0 ){.
47a0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
47b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  EList->nExpr; j+
47c0: 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
47d0: 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  zAs = pEList->a[
47e0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
47f0: 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71  if( zAs!=0 && sq
4800: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73  lite3StrICmp(zAs
4810: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
4820: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
4830: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
4840: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
4850: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  0 );.        pEx
4860: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a  pr->op = TK_AS;.
4870: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
4880: 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
4890: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
48a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
48b0: 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  p(pEList->a[j].p
48c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
48d0: 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b  qliteFree(zCol);
48e0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
48f0: 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d   zTab==0 && zDb=
4900: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  =0 );.        re
4910: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
4920: 20 20 20 20 7d 20 0a 20 20 7d 0a 0a 20 20 2f 2a      } .  }..  /*
4930: 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59  .  ** If X and Y
4940: 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74   are NULL (in ot
4950: 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c  her words if onl
4960: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
4970: 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70  e Z is.  ** supp
4980: 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61  lied) and the va
4990: 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c  lue of Z is encl
49a0: 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71  osed in double-q
49b0: 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a  uotes, then.  **
49c0: 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c   Z is a string l
49d0: 69 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65  iteral if it doe
49e0: 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63  sn't match any c
49f0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e  olumn names.  In
4a00: 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c   that.  ** case,
4a10: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75   we need to retu
4a20: 72 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e  rn right away an
4a30: 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63  d not make any c
4a40: 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70  hanges to.  ** p
4a50: 45 78 70 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Expr..  */.  if(
4a60: 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d   cnt==0 && zTab=
4a70: 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b  =0 && pColumnTok
4a80: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b  en->z[0]=='"' ){
4a90: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4aa0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  zCol);.    retur
4ab0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  n 0;.  }..  /*. 
4ac0: 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73   ** cnt==0 means
4ad0: 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d   there was not m
4ae0: 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61  atch.  cnt>1 mea
4af0: 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77  ns there were tw
4b00: 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d  o or.  ** more m
4b10: 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20  atches.  Either 
4b20: 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20  way, we have an 
4b30: 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  error..  */.  if
4b40: 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20  ( cnt!=1 ){.    
4b50: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20  char *z = 0;.   
4b60: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
4b70: 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f   zErr = cnt==0 ?
4b80: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e   "no such column
4b90: 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f  : %s" : "ambiguo
4ba0: 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  us column name: 
4bb0: 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  %s";.    if( zDb
4bc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4bd0: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a  3SetString(&z, z
4be0: 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22  Db, ".", zTab, "
4bf0: 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20  .", zCol, 0);.  
4c00: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 62    }else if( zTab
4c10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4c20: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a  3SetString(&z, z
4c30: 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20  Tab, ".", zCol, 
4c40: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
4c50: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53       z = sqliteS
4c60: 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20  trDup(zCol);.   
4c70: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
4c80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a  rorMsg(pParse, z
4c90: 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  Err, z);.    sql
4ca0: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  iteFree(z);.  }.
4cb0: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61  .  /* Clean up a
4cc0: 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  nd return.  */. 
4cd0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29   sqliteFree(zDb)
4ce0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
4cf0: 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  Tab);.  sqliteFr
4d00: 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  ee(zCol);.  sqli
4d10: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
4d20: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  xpr->pLeft);.  p
4d30: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
4d40: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
4d50: 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67  lete(pExpr->pRig
4d60: 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  ht);.  pExpr->pR
4d70: 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70  ight = 0;.  pExp
4d80: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
4d90: 4e 3b 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68  N;.  sqlite3Auth
4da0: 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78  Read(pParse, pEx
4db0: 70 72 2c 20 70 53 72 63 4c 69 73 74 29 3b 0a 20  pr, pSrcList);. 
4dc0: 20 72 65 74 75 72 6e 20 63 6e 74 21 3d 31 3b 0a   return cnt!=1;.
4dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4de0: 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65  utine walks an e
4df0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
4e00: 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65  nd resolves refe
4e10: 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62  rences to.** tab
4e20: 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64  le columns.  Nod
4e30: 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 49  es of the form I
4e40: 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f 6c  D.ID or ID resol
4e50: 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e  ve into an.** in
4e60: 64 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c 65  dex to the table
4e70: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69   in the table li
4e80: 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e 20  st and a column 
4e90: 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a 2a  offset.  The .**
4ea0: 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f 72   Expr.opcode for
4eb0: 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20 63   such nodes is c
4ec0: 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c  hanged to TK_COL
4ed0: 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e 69  UMN.  The Expr.i
4ee0: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 69  Table.** value i
4ef0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65  s changed to the
4f00: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72 65   index of the re
4f10: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 69  ferenced table i
4f20: 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70 6c  n pTabList.** pl
4f30: 75 73 20 74 68 65 20 22 62 61 73 65 22 20 76 61  us the "base" va
4f40: 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65 20 76  lue.  The base v
4f50: 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d 61  alue will ultima
4f60: 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65 0a  tely become the.
4f70: 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  ** VDBE cursor n
4f80: 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72 73  umber for a curs
4f90: 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74  or that is point
4fa0: 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65 66  ing into the ref
4fb0: 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c 65  erenced.** table
4fc0: 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c  .  The Expr.iCol
4fd0: 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68 61  umn value is cha
4fe0: 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  nged to the inde
4ff0: 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
5000: 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65 72  .** of the refer
5010: 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54 68  enced table.  Th
5020: 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76  e Expr.iColumn v
5030: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70 65  alue for the spe
5040: 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63 6f  cial.** ROWID co
5050: 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e 79  lumn is -1.  Any
5060: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
5070: 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20 74   KEY column is t
5080: 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61 6c  ried as an.** al
5090: 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a 2a  ias for ROWID..*
50a0: 2a 0a 2a 2a 20 57 65 20 61 6c 73 6f 20 63 68 65  *.** We also che
50b0: 63 6b 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73  ck for instances
50c0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
50d0: 74 6f 72 2e 20 20 49 4e 20 63 6f 6d 65 73 20 69  tor.  IN comes i
50e0: 6e 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a 0a  n two.** forms:.
50f0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
5100: 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
5110: 74 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20  t).** and.**    
5120: 20 20 20 20 20 20 20 65 78 70 72 20 49 4e 20 28         expr IN (
5130: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a  SELECT ...).**.*
5140: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
5150: 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20 63   is handled by c
5160: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 68 6f  reating a set ho
5170: 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a  lding the list.*
5180: 2a 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c  * of allowed val
5190: 75 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  ues.  The second
51a0: 20 66 6f 72 6d 20 63 61 75 73 65 73 20 74 68 65   form causes the
51b0: 20 53 45 4c 45 43 54 20 74 6f 20 67 65 6e 65 72   SELECT to gener
51c0: 61 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72  ate .** a tempor
51d0: 61 72 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ary table..**.**
51e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
51f0: 73 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20 73 63 61  so looks for sca
5200: 6c 61 72 20 53 45 4c 45 43 54 73 20 74 68 61 74  lar SELECTs that
5210: 20 61 72 65 20 70 61 72 74 20 6f 66 20 61 6e 20   are part of an 
5220: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49  expression..** I
5230: 66 20 69 74 20 66 69 6e 64 73 20 61 6e 79 2c 20  f it finds any, 
5240: 69 74 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  it generates cod
5250: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 76  e to write the v
5260: 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73 65 6c  alue of that sel
5270: 65 63 74 0a 2a 2a 20 69 6e 74 6f 20 61 20 6d 65  ect.** into a me
5280: 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a  mory cell..**.**
5290: 20 55 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 73   Unknown columns
52a0: 20 6f 72 20 74 61 62 6c 65 73 20 70 72 6f 76 6f   or tables provo
52b0: 6b 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  ke an error.  Th
52c0: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
52d0: 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  ns.** the number
52e0: 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20   of errors seen 
52f0: 61 6e 64 20 6c 65 61 76 65 73 20 61 6e 20 65 72  and leaves an er
5300: 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e 20 70  ror message on p
5310: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
5320: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
5330: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 0a 20 20  prResolveIds(.  
5340: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5350: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
5360: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
5370: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 2c  cList *pSrcList,
5380: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
5390: 65 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c  es used to resol
53a0: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
53b0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
53c0: 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  EList,  /* List 
53d0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75  of expressions u
53e0: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 22  sed to resolve "
53f0: 41 53 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  AS" */.  Expr *p
5400: 45 78 70 72 20 20 20 20 20 20 20 20 2f 2a 20 54  Expr        /* T
5410: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
5420: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f   be analyzed. */
5430: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
5440: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20  if( pExpr==0 || 
5450: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
5460: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
5470: 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
5480: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Src; i++){.    a
5490: 73 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d  ssert( pSrcList-
54a0: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30  >a[i].iCursor>=0
54b0: 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b   && pSrcList->a[
54c0: 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73  i].iCursor<pPars
54d0: 65 2d 3e 6e 54 61 62 20 29 3b 0a 20 20 7d 0a 20  e->nTab );.  }. 
54e0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
54f0: 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 75  op ){.    /* Dou
5500: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
5510: 67 73 20 28 65 78 3a 20 22 61 62 63 22 29 20 61  gs (ex: "abc") a
5520: 72 65 20 75 73 65 64 20 61 73 20 69 64 65 6e 74  re used as ident
5530: 69 66 69 65 72 73 20 69 66 0a 20 20 20 20 2a 2a  ifiers if.    **
5540: 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74 68 65   possible.  Othe
5550: 72 77 69 73 65 20 74 68 65 79 20 72 65 6d 61 69  rwise they remai
5560: 6e 20 61 73 20 73 74 72 69 6e 67 73 2e 20 20 53  n as strings.  S
5570: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20 20 20  ingle-quoted.   
5580: 20 2a 2a 20 73 74 72 69 6e 67 73 20 28 65 78 3a   ** strings (ex:
5590: 20 27 61 62 63 27 29 20 61 72 65 20 61 6c 77 61   'abc') are alwa
55a0: 79 73 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61  ys string litera
55b0: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ls..    */.    c
55c0: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
55d0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
55e0: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c  ->token.z[0]=='\
55f0: 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  '' ) break;.    
5600: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69    /* Fall thru i
5610: 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44 20 63 61  nto the TK_ID ca
5620: 73 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  se if this is a 
5630: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
5640: 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ring */.    }.  
5650: 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e    /* A lone iden
5660: 74 69 66 69 65 72 20 69 73 20 74 68 65 20 6e 61  tifier is the na
5670: 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 64 2e  me of a columnd.
5680: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5690: 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20   TK_ID: {.      
56a0: 69 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70  if( lookupName(p
56b0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45  Parse, 0, 0, &pE
56c0: 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 53 72 63  xpr->token, pSrc
56d0: 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45  List, pEList, pE
56e0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
56f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
5700: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 0a  }.      break; .
5710: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
5720: 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  A table name and
5730: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20   column name:   
5740: 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f    ID.ID.    ** O
5750: 72 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61  r a database, ta
5760: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20  ble and column: 
5770: 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f   ID.ID.ID.    */
5780: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
5790: 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  : {.      Token 
57a0: 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  *pColumn;.      
57b0: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20  Token *pTable;. 
57c0: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b       Token *pDb;
57d0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
57e0: 67 68 74 3b 0a 0a 20 20 20 20 20 20 70 52 69 67  ght;..      pRig
57f0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
5800: 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  ht;.      if( pR
5810: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  ight->op==TK_ID 
5820: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d  ){.        pDb =
5830: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   0;.        pTab
5840: 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65  le = &pExpr->pLe
5850: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
5860: 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52     pColumn = &pR
5870: 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  ight->token;.   
5880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5890: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
58a0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a  ->op==TK_DOT );.
58b0: 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 26 70          pDb = &p
58c0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  Expr->pLeft->tok
58d0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  en;.        pTab
58e0: 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c  le = &pRight->pL
58f0: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
5900: 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70      pColumn = &p
5910: 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74  Right->pRight->t
5920: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oken;.      }.  
5930: 20 20 20 20 69 66 28 20 6c 6f 6f 6b 75 70 4e 61      if( lookupNa
5940: 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20  me(pParse, pDb, 
5950: 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c  pTable, pColumn,
5960: 20 70 53 72 63 4c 69 73 74 2c 20 30 2c 20 70 45   pSrcList, 0, pE
5970: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
5980: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
5990: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
59a0: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
59b0: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 56 64  K_IN: {.      Vd
59c0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
59d0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
59e0: 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29        if( v==0 )
59f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
5a00: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
5a10: 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
5a20: 65 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c  e, pSrcList, pEL
5a30: 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  ist, pExpr->pLef
5a40: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  t) ){.        re
5a50: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
5a60: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
5a70: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
5a80: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
5a90: 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
5aa0: 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
5ab0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
5ac0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
5ad0: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
5ae0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
5af0: 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 0a  nto a temporary.
5b00: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
5b10: 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
5b20: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
5b30: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 61 73 20  orary table has 
5b40: 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 20 20  already.        
5b50: 2a 2a 20 62 65 65 6e 20 70 75 74 20 69 6e 20 69  ** been put in i
5b60: 54 61 62 6c 65 20 62 79 20 73 71 6c 69 74 65 33  Table by sqlite3
5b70: 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c  ExprResolveInSel
5b80: 65 63 74 28 29 2e 0a 20 20 20 20 20 20 20 20 2a  ect()..        *
5b90: 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  /.        pExpr-
5ba0: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
5bb0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
5bc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5bd0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
5be0: 70 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  p, pExpr->iTable
5bf0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
5c00: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
5c10: 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  se, pExpr->pSele
5c20: 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78  ct, SRT_Set, pEx
5c30: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 30 2c  pr->iTable, 0,0,
5c40: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
5c50: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  if( pExpr->pList
5c60: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
5c70: 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
5c80: 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
5c90: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
5ca0: 20 2a 2a 20 43 72 65 61 74 65 20 61 20 73 65 74   ** Create a set
5cb0: 20 74 6f 20 70 75 74 20 74 68 65 20 65 78 70 72   to put the expr
5cc0: 6c 69 73 74 20 76 61 6c 75 65 73 20 69 6e 2e 20  list values in. 
5cd0: 20 54 68 65 20 53 65 74 20 69 64 20 69 73 20 73   The Set id is s
5ce0: 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  tored.        **
5cf0: 20 69 6e 20 69 54 61 62 6c 65 2e 0a 20 20 20 20   in iTable..    
5d00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
5d10: 6e 74 20 69 2c 20 69 53 65 74 3b 0a 20 20 20 20  nt i, iSet;.    
5d20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5d30: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
5d40: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
5d50: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
5d60: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
5d70: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
5d80: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
5d90: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
5da0: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
5db0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5dc0: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
5dd0: 20 20 20 20 20 20 20 20 20 22 72 69 67 68 74 2d           "right-
5de0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20  hand side of IN 
5df0: 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
5e00: 20 63 6f 6e 73 74 61 6e 74 22 29 3b 0a 20 20 20   constant");.   
5e10: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5e20: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
5e30: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
5e40: 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50  ite3ExprCheck(pP
5e50: 61 72 73 65 2c 20 70 45 32 2c 20 30 2c 20 30 29  arse, pE2, 0, 0)
5e60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5e70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
5e80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
5e90: 20 20 20 20 20 20 20 20 69 53 65 74 20 3d 20 70          iSet = p
5ea0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
5eb0: 50 61 72 73 65 2d 3e 6e 53 65 74 2b 2b 3b 0a 20  Parse->nSet++;. 
5ec0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
5ed0: 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  i<pExpr->pList->
5ee0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
5ef0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
5f00: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
5f10: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
5f20: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70         switch( p
5f30: 45 32 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20  E2->op ){.      
5f40: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c        case TK_FL
5f50: 4f 41 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OAT:.           
5f60: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
5f70: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  :.            ca
5f80: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
5fa0: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  t addr;.        
5fb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
5fc0: 32 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20  2->token.z );.  
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
5fe0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70   = sqlite3VdbeOp
5ff0: 33 28 76 2c 20 4f 50 5f 53 65 74 49 6e 73 65 72  3(v, OP_SetInser
6000: 74 2c 20 69 53 65 74 2c 20 30 2c 0a 20 20 20 20  t, iSet, 0,.    
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
6030: 32 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 32 2d  2->token.z, pE2-
6040: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
6050: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6060: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
6070: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20   addr);.        
6080: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6090: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
60a0: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
60b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
60c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
60d0: 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20 20  pParse, pE2);.  
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
60f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6100: 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 69 53  OP_SetInsert, iS
6110: 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  et, 0);.        
6120: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6130: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6160: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
6170: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
6180: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73   {.      /* This
6190: 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61   has to be a sca
61a0: 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e  lar SELECT.  Gen
61b0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
61c0: 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76  t the.      ** v
61d0: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c  alue of this sel
61e0: 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  ect in a memory 
61f0: 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20  cell and record 
6200: 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  the number.     
6210: 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72   ** of the memor
6220: 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
6230: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
6240: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
6250: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
6260: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  +;.      if( sql
6270: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
6280: 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  e, pExpr->pSelec
6290: 74 2c 20 53 52 54 5f 4d 65 6d 2c 20 70 45 78 70  t, SRT_Mem, pExp
62a0: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 30 2c 30 2c 30  r->iColumn,0,0,0
62b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
62c0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
62d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
62e0: 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6c  }..    /* For al
62f0: 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20 72 65 63  l else, just rec
6300: 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 74 68  ursively walk th
6310: 65 20 74 72 65 65 20 2a 2f 0a 20 20 20 20 64 65  e tree */.    de
6320: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
6330: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a  f( pExpr->pLeft.
6340: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
6350: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
6360: 50 61 72 73 65 2c 20 70 53 72 63 4c 69 73 74 2c  Parse, pSrcList,
6370: 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e   pEList, pExpr->
6380: 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20  pLeft) ){.      
6390: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
63a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
63b0: 78 70 72 2d 3e 70 52 69 67 68 74 20 0a 20 20 20  xpr->pRight .   
63c0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
63d0: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
63e0: 73 65 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45  se, pSrcList, pE
63f0: 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  List, pExpr->pRi
6400: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ght) ){.        
6410: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
6420: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
6430: 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  r->pList ){.    
6440: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
6450: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
6460: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
6470: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  t;.        for(i
6480: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
6490: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
64a0: 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d      Expr *pArg =
64b0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
64c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
64d0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
64e0: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
64f0: 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69 73 74  pSrcList, pEList
6500: 2c 20 70 41 72 67 29 20 29 7b 0a 20 20 20 20 20  , pArg) ){.     
6510: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
6520: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6540: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6550: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  n 0;.}../*.** pE
6560: 78 70 72 20 69 73 20 61 20 6e 6f 64 65 20 74 68  xpr is a node th
6570: 61 74 20 64 65 66 69 6e 65 73 20 61 20 66 75 6e  at defines a fun
6580: 63 74 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69  ction of some ki
6590: 6e 64 2e 20 20 49 74 20 6d 69 67 68 74 0a 2a 2a  nd.  It might.**
65a0: 20 62 65 20 61 20 73 79 6e 74 61 63 74 69 63 20   be a syntactic 
65b0: 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65 20 22 63  function like "c
65c0: 6f 75 6e 74 28 78 29 22 20 6f 72 20 69 74 20 6d  ount(x)" or it m
65d0: 69 67 68 74 20 62 65 20 61 20 66 75 6e 63 74 69  ight be a functi
65e0: 6f 6e 0a 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65  on.** that imple
65f0: 6d 65 6e 74 73 20 61 6e 20 6f 70 65 72 61 74 6f  ments an operato
6600: 72 2c 20 6c 69 6b 65 20 22 61 20 4c 49 4b 45 20  r, like "a LIKE 
6610: 62 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  b".  .**.** This
6620: 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 2a   routine makes *
6630: 70 7a 4e 61 6d 65 20 70 6f 69 6e 74 20 74 6f 20  pzName point to 
6640: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6650: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 0a 2a 2a  function and .**
6660: 20 2a 70 6e 4e 61 6d 65 20 68 6f 6c 64 20 74 68   *pnName hold th
6670: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
6680: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 66 75  acters in the fu
6690: 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  nction name..*/.
66a0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 46  static void getF
66b0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 45 78 70 72  unctionName(Expr
66c0: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
66d0: 68 61 72 20 2a 2a 70 7a 4e 61 6d 65 2c 20 69 6e  har **pzName, in
66e0: 74 20 2a 70 6e 4e 61 6d 65 29 7b 0a 20 20 73 77  t *pnName){.  sw
66f0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
6700: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  ){.    case TK_F
6710: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
6720: 20 2a 70 7a 4e 61 6d 65 20 3d 20 70 45 78 70 72   *pzName = pExpr
6730: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  ->token.z;.     
6740: 20 2a 70 6e 4e 61 6d 65 20 3d 20 70 45 78 70 72   *pnName = pExpr
6750: 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20  ->token.n;.     
6760: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6770: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 20    case TK_LIKE: 
6780: 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20  {.      *pzName 
6790: 3d 20 22 6c 69 6b 65 22 3b 0a 20 20 20 20 20 20  = "like";.      
67a0: 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20 20 20  *pnName = 4;.   
67b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
67c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42      case TK_GLOB
67d0: 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d  : {.      *pzNam
67e0: 65 20 3d 20 22 67 6c 6f 62 22 3b 0a 20 20 20 20  e = "glob";.    
67f0: 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20    *pnName = 4;. 
6800: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6810: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
6820: 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d  .      *pzName =
6830: 20 22 63 61 6e 27 74 20 68 61 70 70 65 6e 22 3b   "can't happen";
6840: 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d  .      *pnName =
6850: 20 31 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   12;.      break
6860: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
6870: 2a 0a 2a 2a 20 45 72 72 6f 72 20 63 68 65 63 6b  *.** Error check
6880: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 69   the functions i
6890: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n an expression.
68a0: 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 0a    Make sure all.
68b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ** function name
68c0: 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64  s are recognized
68d0: 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f   and all functio
68e0: 6e 73 20 68 61 76 65 20 74 68 65 20 63 6f 72 72  ns have the corr
68f0: 65 63 74 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  ect.** number of
6900: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61   arguments.  Lea
6910: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
6920: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
6930: 45 72 72 4d 73 67 0a 2a 2a 20 69 66 20 61 6e 79  ErrMsg.** if any
6940: 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20  thing is amiss. 
6950: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
6960: 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
6970: 0a 2a 2a 20 69 66 20 70 49 73 41 67 67 20 69 73  .** if pIsAgg is
6980: 20 6e 6f 74 20 6e 75 6c 6c 20 61 6e 64 20 74 68   not null and th
6990: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
69a0: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75   an aggregate fu
69b0: 6e 63 74 69 6f 6e 0a 2a 2a 20 28 6c 69 6b 65 20  nction.** (like 
69c0: 63 6f 75 6e 74 28 2a 29 20 6f 72 20 6d 61 78 28  count(*) or max(
69d0: 76 61 6c 75 65 29 29 20 74 68 65 6e 20 77 72 69  value)) then wri
69e0: 74 65 20 61 20 31 20 69 6e 74 6f 20 2a 70 49 73  te a 1 into *pIs
69f0: 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Agg..*/.int sqli
6a00: 74 65 33 45 78 70 72 43 68 65 63 6b 28 50 61 72  te3ExprCheck(Par
6a10: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
6a20: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 61 6c 6c   *pExpr, int all
6a30: 6f 77 41 67 67 2c 20 69 6e 74 20 2a 70 49 73 41  owAgg, int *pIsA
6a40: 67 67 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20  gg){.  int nErr 
6a50: 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  = 0;.  if( pExpr
6a60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6a70: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
6a80: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
6a90: 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61 73  TK_GLOB:.    cas
6aa0: 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63  e TK_LIKE:.    c
6ab0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
6ac0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d   {.      int n =
6ad0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20   pExpr->pList ? 
6ae0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
6af0: 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e 75 6d  xpr : 0;  /* Num
6b00: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
6b10: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f   */.      int no
6b20: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20  _such_func = 0; 
6b30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
6b40: 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f   no such functio
6b50: 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  n exists */.    
6b60: 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f    int wrong_num_
6b70: 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a  args = 0;     /*
6b80: 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67 20 6e   True if wrong n
6b90: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
6ba0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
6bb0: 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20 20 20  is_agg = 0;     
6bc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
6bd0: 69 66 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  if is an aggrega
6be0: 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  te function */. 
6bf0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
6c00: 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20    int nId;      
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6c20: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
6c30: 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f  cters in functio
6c40: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
6c50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6c70: 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
6c80: 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  . */.      FuncD
6c90: 65 66 20 2a 70 44 65 66 3b 0a 0a 20 20 20 20 20  ef *pDef;..     
6ca0: 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65   getFunctionName
6cb0: 28 70 45 78 70 72 2c 20 26 7a 49 64 2c 20 26 6e  (pExpr, &zId, &n
6cc0: 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20  Id);.      pDef 
6cd0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
6ce0: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
6cf0: 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 30  , zId, nId, n, 0
6d00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  );.      if( pDe
6d10: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
6d20: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
6d30: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
6d40: 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  e->db, zId, nId,
6d50: 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   -1, 0);.       
6d60: 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
6d70: 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63            no_suc
6d80: 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20  h_func = 1;.    
6d90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6da0: 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61       wrong_num_a
6db0: 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  rgs = 1;.       
6dc0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
6dd0: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
6de0: 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b   pDef->xFunc==0;
6df0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6e00: 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 61 6c  f( is_agg && !al
6e10: 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20  lowAgg ){.      
6e20: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6e30: 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
6e40: 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
6e50: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
6e60: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
6e70: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
6e80: 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a      is_agg = 0;.
6e90: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6ea0: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a  no_such_func ){.
6eb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6ec0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6ed0: 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f  "no such functio
6ee0: 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a  n: %.*s", nId, z
6ef0: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72  Id);.        nEr
6f00: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
6f10: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
6f20: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
6f30: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6f40: 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d  Parse,"wrong num
6f50: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
6f60: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a   to function %.*
6f70: 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s()",.          
6f80: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
6f90: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
6fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6fb0: 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20  is_agg ){.      
6fc0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
6fd0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20  _AGG_FUNCTION;. 
6fe0: 20 20 20 20 20 20 20 69 66 28 20 70 49 73 41 67         if( pIsAg
6ff0: 67 20 29 20 2a 70 49 73 41 67 67 20 3d 20 31 3b  g ) *pIsAgg = 1;
7000: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
7010: 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20  or(i=0; nErr==0 
7020: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
7030: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
7040: 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50  ite3ExprCheck(pP
7050: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69  arse, pExpr->pLi
7060: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 0a  st->a[i].pExpr,.
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
7090: 6c 6c 6f 77 41 67 67 20 26 26 20 21 69 73 5f 61  llowAgg && !is_a
70a0: 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20  gg, pIsAgg);.   
70b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
70c0: 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Def==0 ){.      
70d0: 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 72 65 70    /* Already rep
70e0: 6f 72 74 65 64 20 61 6e 20 65 72 72 6f 72 20 2a  orted an error *
70f0: 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  /.      }else if
7100: 28 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65  ( pDef->dataType
7110: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
7120: 66 28 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70  f( pDef->dataTyp
7130: 65 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e<n ){.         
7140: 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65   pExpr->dataType
7150: 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
7160: 20 73 71 6c 69 74 65 33 45 78 70 72 54 79 70 65   sqlite3ExprType
7170: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61  (pExpr->pList->a
7180: 5b 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65 5d  [pDef->dataType]
7190: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
71a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
71b0: 20 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70    pExpr->dataTyp
71c0: 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  e = SQLITE_SO_NU
71d0: 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
71e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65     }else if( pDe
71f0: 66 2d 3e 64 61 74 61 54 79 70 65 3d 3d 53 51 4c  f->dataType==SQL
7200: 49 54 45 5f 41 52 47 53 20 29 7b 0a 20 20 20 20  ITE_ARGS ){.    
7210: 20 20 20 20 70 44 65 66 2d 3e 64 61 74 61 54 79      pDef->dataTy
7220: 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54  pe = SQLITE_SO_T
7230: 45 58 54 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  EXT;.        for
7240: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
7250: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
7260: 71 6c 69 74 65 33 45 78 70 72 54 79 70 65 28 70  qlite3ExprType(p
7270: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
7280: 5d 2e 70 45 78 70 72 29 3d 3d 53 51 4c 49 54 45  ].pExpr)==SQLITE
7290: 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20  _SO_NUM ){.     
72a0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61         pExpr->da
72b0: 74 61 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  taType = SQLITE_
72c0: 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 20 20  SO_NUM;.        
72d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
72e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
72f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7300: 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65 3d   pDef->dataType=
7310: 3d 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 20  =SQLITE_NUMERIC 
7320: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
7330: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c  ->dataType = SQL
7340: 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20  ITE_SO_NUM;.    
7350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7360: 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65   pExpr->dataType
7370: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58   = SQLITE_SO_TEX
7380: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
7390: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
73a0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
73b0: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
73c0: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33    nErr = sqlite3
73d0: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
73e0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
73f0: 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67  allowAgg, pIsAgg
7400: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7410: 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20   if( nErr==0 && 
7420: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
7430: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
7440: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
7450: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
7460: 70 52 69 67 68 74 2c 20 61 6c 6c 6f 77 41 67 67  pRight, allowAgg
7470: 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20  , pIsAgg);.     
7480: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72   }.      if( nEr
7490: 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  r==0 && pExpr->p
74a0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
74b0: 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70  int n = pExpr->p
74c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
74d0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
74e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72      for(i=0; nEr
74f0: 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b  r==0 && i<n; i++
7500: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
7510: 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e  r *pE2 = pExpr->
7520: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
7530: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72  r;.          nEr
7540: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
7550: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 32  heck(pParse, pE2
7560: 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41  , allowAgg, pIsA
7570: 67 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  gg);.        }. 
7580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7590: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
75a0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a  return nErr;.}..
75b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 65 69 74  /*.** Return eit
75c0: 68 65 72 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  her SQLITE_SO_NU
75d0: 4d 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 54  M or SQLITE_SO_T
75e0: 45 58 54 20 74 6f 20 69 6e 64 69 63 61 74 65 20  EXT to indicate 
75f0: 77 68 65 74 68 65 72 20 74 68 65 0a 2a 2a 20 67  whether the.** g
7600: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
7610: 73 68 6f 75 6c 64 20 73 6f 72 74 20 61 73 20 6e  should sort as n
7620: 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 6f 72  umeric values or
7630: 20 61 73 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20   as text..**.** 
7640: 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 52  The sqlite3ExprR
7650: 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20  esolveIds() and 
7660: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
7670: 28 29 20 72 6f 75 74 69 6e 65 73 20 6d 75 73 74  () routines must
7680: 20 68 61 76 65 0a 2a 2a 20 62 6f 74 68 20 62 65   have.** both be
7690: 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
76a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 66 6f   expression befo
76b0: 72 65 20 69 74 20 69 73 20 70 61 73 73 65 64 20  re it is passed 
76c0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  to this routine.
76d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
76e0: 78 70 72 54 79 70 65 28 45 78 70 72 20 2a 70 29  xprType(Expr *p)
76f0: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
7700: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
7710: 4e 55 4d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  NUM;.  while( p 
7720: 29 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20  ) switch( p->op 
7730: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  ){.    case TK_P
7740: 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
7750: 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
7760: 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
7770: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
7780: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
7790: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
77a0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
77b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
77c0: 54 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  TNULL:.    case 
77d0: 54 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  TK_NOT:.    case
77e0: 20 54 4b 5f 55 4d 49 4e 55 53 3a 0a 20 20 20 20   TK_UMINUS:.    
77f0: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20  case TK_UPLUS:. 
7800: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
7810: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  D:.    case TK_B
7820: 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  ITOR:.    case T
7830: 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
7840: 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
7850: 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
7860: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
7870: 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  M:.    case TK_I
7880: 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
7890: 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
78a0: 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 63  ase TK_IN:.    c
78b0: 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 0a  ase TK_BETWEEN:.
78c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42      case TK_GLOB
78d0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49  :.    case TK_LI
78e0: 4b 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  KE:.      return
78f0: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a   SQLITE_SO_NUM;.
7900: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
7910: 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
7920: 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  _NULL:.    case 
7930: 54 4b 5f 43 4f 4e 43 41 54 3a 0a 20 20 20 20 63  TK_CONCAT:.    c
7940: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
7950: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
7960: 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 0a 20  LITE_SO_TEXT;.. 
7970: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
7980: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
7990: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
79a0: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
79b0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
79c0: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20     case TK_EQ:. 
79d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
79e0: 45 78 70 72 54 79 70 65 28 70 2d 3e 70 4c 65 66  ExprType(p->pLef
79f0: 74 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  t)==SQLITE_SO_NU
7a00: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  M ){.        ret
7a10: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  urn SQLITE_SO_NU
7a20: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
7a30: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
7a40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
7a50: 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 0a 20 20    case TK_AS:.  
7a60: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74      p = p->pLeft
7a70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
7a80: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
7a90: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
7aa0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
7ab0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
7ac0: 4f 4e 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ON:.      return
7ad0: 20 70 2d 3e 64 61 74 61 54 79 70 65 3b 0a 0a 20   p->dataType;.. 
7ae0: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
7af0: 54 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  T:.      assert(
7b00: 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20   p->pSelect );. 
7b10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
7b20: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 20  pSelect->pEList 
7b30: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
7b40: 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c   p->pSelect->pEL
7b50: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
7b60: 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 53 65        p = p->pSe
7b70: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
7b80: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
7b90: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
7ba0: 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20   TK_CASE: {.    
7bb0: 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20    if( p->pRight 
7bc0: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 54 79  && sqlite3ExprTy
7bd0: 70 65 28 70 2d 3e 70 52 69 67 68 74 29 3d 3d 53  pe(p->pRight)==S
7be0: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a  QLITE_SO_NUM ){.
7bf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
7c00: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20  QLITE_SO_NUM;.  
7c10: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7c20: 70 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  p->pList ){.    
7c30: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
7c40: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
7c50: 73 74 20 3d 20 70 2d 3e 70 4c 69 73 74 3b 0a 20  st = p->pList;. 
7c60: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
7c70: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
7c80: 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20  i+=2){.         
7c90: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
7ca0: 54 79 70 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Type(pList->a[i]
7cb0: 2e 70 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f  .pExpr)==SQLITE_
7cc0: 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20  SO_NUM ){.      
7cd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7ce0: 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20  ITE_SO_NUM;.    
7cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7d00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7d10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f  return SQLITE_SO
7d20: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _TEXT;.    }..  
7d30: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
7d40: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
7d50: 54 4b 5f 41 42 4f 52 54 20 29 3b 20 20 2f 2a 20  TK_ABORT );  /* 
7d60: 43 61 6e 27 74 20 48 61 70 70 65 6e 20 2a 2f 0a  Can't Happen */.
7d70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
7d80: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7d90: 5f 53 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a  _SO_NUM;.}../*.*
7da0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
7db0: 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
7dc0: 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
7dd0: 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
7de0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65  xpression and le
7df0: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ave the result o
7e00: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61  n the top of sta
7e10: 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
7e20: 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73  te3ExprCode(Pars
7e30: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
7e40: 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20  *pExpr){.  Vdbe 
7e50: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
7e60: 62 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20  be;.  int op;.  
7e70: 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
7e80: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
7e90: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
7ea0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
7eb0: 4b 5f 50 4c 55 53 3a 20 20 20 20 20 6f 70 20 3d  K_PLUS:     op =
7ec0: 20 4f 50 5f 41 64 64 3b 20 20 20 20 20 20 62 72   OP_Add;      br
7ed0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7ee0: 5f 4d 49 4e 55 53 3a 20 20 20 20 6f 70 20 3d 20  _MINUS:    op = 
7ef0: 4f 50 5f 53 75 62 74 72 61 63 74 3b 20 62 72 65  OP_Subtract; bre
7f00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7f10: 53 54 41 52 3a 20 20 20 20 20 6f 70 20 3d 20 4f  STAR:     op = O
7f20: 50 5f 4d 75 6c 74 69 70 6c 79 3b 20 62 72 65 61  P_Multiply; brea
7f30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
7f40: 4c 41 53 48 3a 20 20 20 20 6f 70 20 3d 20 4f 50  LASH:    op = OP
7f50: 5f 44 69 76 69 64 65 3b 20 20 20 62 72 65 61 6b  _Divide;   break
7f60: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  ;.    case TK_AN
7f70: 44 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  D:      op = OP_
7f80: 41 6e 64 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  And;      break;
7f90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
7fa0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f         op = OP_O
7fb0: 72 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  r;       break;.
7fc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20      case TK_LT: 
7fd0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74        op = OP_Lt
7fe0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
7ff0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
8000: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b       op = OP_Le;
8010: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8020: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20    case TK_GT:   
8030: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20      op = OP_Gt; 
8040: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8050: 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20   case TK_GE:    
8060: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20     op = OP_Ge;  
8070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8080: 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20  case TK_NE:     
8090: 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20    op = OP_Ne;   
80a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
80b0: 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20  ase TK_EQ:      
80c0: 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20   op = OP_Eq;    
80d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
80e0: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20  se TK_ISNULL:   
80f0: 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20  op = OP_IsNull; 
8100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8110: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f  e TK_NOTNULL:  o
8120: 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20  p = OP_NotNull; 
8130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8140: 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 20 6f 70   TK_NOT:      op
8150: 20 3d 20 4f 50 5f 4e 6f 74 3b 20 20 20 20 20 20   = OP_Not;      
8160: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8170: 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 20 6f 70 20  TK_UMINUS:   op 
8180: 3d 20 4f 50 5f 4e 65 67 61 74 69 76 65 3b 20 62  = OP_Negative; b
8190: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
81a0: 4b 5f 42 49 54 41 4e 44 3a 20 20 20 6f 70 20 3d  K_BITAND:   op =
81b0: 20 4f 50 5f 42 69 74 41 6e 64 3b 20 20 20 62 72   OP_BitAnd;   br
81c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
81d0: 5f 42 49 54 4f 52 3a 20 20 20 20 6f 70 20 3d 20  _BITOR:    op = 
81e0: 4f 50 5f 42 69 74 4f 72 3b 20 20 20 20 62 72 65  OP_BitOr;    bre
81f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8200: 42 49 54 4e 4f 54 3a 20 20 20 6f 70 20 3d 20 4f  BITNOT:   op = O
8210: 50 5f 42 69 74 4e 6f 74 3b 20 20 20 62 72 65 61  P_BitNot;   brea
8220: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
8230: 53 48 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50  SHIFT:   op = OP
8240: 5f 53 68 69 66 74 4c 65 66 74 3b 20 20 62 72 65  _ShiftLeft;  bre
8250: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8260: 52 53 48 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f  RSHIFT:   op = O
8270: 50 5f 53 68 69 66 74 52 69 67 68 74 3b 20 62 72  P_ShiftRight; br
8280: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8290: 5f 52 45 4d 3a 20 20 20 20 20 20 6f 70 20 3d 20  _REM:      op = 
82a0: 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3b 20 20 62  OP_Remainder;  b
82b0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
82c0: 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  t: break;.  }.  
82d0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
82e0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
82f0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
8300: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 75 73 65   if( pParse->use
8310: 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Agg ){.        s
8320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
8330: 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c  v, OP_AggGet, 0,
8340: 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20   pExpr->iAgg);. 
8350: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
8360: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
8370: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8380: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
8390: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72  OP_Column, pExpr
83a0: 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d  ->iTable, pExpr-
83b0: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
83c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
83d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
83e0: 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 70 45  (v, OP_Recno, pE
83f0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
8400: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
8410: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8420: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
8430: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
8440: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  T:.    case TK_I
8450: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
8460: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
8470: 4b 5f 49 4e 54 45 47 45 52 20 26 26 20 73 71 6c  K_INTEGER && sql
8480: 69 74 65 33 46 69 74 73 49 6e 33 32 42 69 74 73  ite3FitsIn32Bits
8490: 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29  (pExpr->token.z)
84a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
84b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
84c0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 61 74 6f 69  OP_Integer, atoi
84d0: 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29  (pExpr->token.z)
84e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
84f0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d  e if( pExpr->op=
8500: 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
8510: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8520: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 6c  AddOp(v, OP_Real
8530: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
8540: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
8550: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
8560: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
8570: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
8580: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
8590: 3e 74 6f 6b 65 6e 2e 7a 20 29 3b 0a 20 20 20 20  >token.z );.    
85a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
85b0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 45 78  ngeP3(v, -1, pEx
85c0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
85d0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
85e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
85f0: 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b  equoteP3(v, -1);
8600: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8610: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8620: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
8630: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
8640: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
8650: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
8660: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
8670: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
8680: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8690: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 61 72 69  AddOp(v, OP_Vari
86a0: 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61  able, pExpr->iTa
86b0: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ble, 0);.      b
86c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
86d0: 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
86e0: 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
86f0: 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
8700: 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
8710: 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
8720: 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
8730: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e      int p1 = bin
8740: 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70 45 78  aryCompareP1(pEx
8750: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
8760: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
8770: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
8780: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
8790: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
87a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
87b0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
87c0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
87d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
87e0: 76 2c 20 6f 70 2c 20 70 31 2c 20 30 29 3b 0a 20  v, op, p1, 0);. 
87f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 23 69 66 20       break;.#if 
8800: 30 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  0.      if( sqli
8810: 74 65 33 45 78 70 72 54 79 70 65 28 70 45 78 70  te3ExprType(pExp
8820: 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45  r)==SQLITE_SO_TE
8830: 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70  XT ){.        op
8840: 20 2b 3d 20 36 3b 20 20 2f 2a 20 43 6f 6e 76 65   += 6;  /* Conve
8850: 72 74 20 6e 75 6d 65 72 69 63 20 6f 70 63 6f 64  rt numeric opcod
8860: 65 73 20 74 6f 20 74 65 78 74 20 6f 70 63 6f 64  es to text opcod
8870: 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  es */.      }.  
8880: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
8890: 75 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78  ugh into the nex
88a0: 74 20 63 61 73 65 20 2a 2f 0a 23 65 6e 64 69 66  t case */.#endif
88b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
88c0: 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
88d0: 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
88e0: 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
88f0: 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
8900: 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
8910: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
8920: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
8930: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
8940: 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
8950: 54 4b 5f 53 4c 41 53 48 3a 20 7b 0a 20 20 20 20  TK_SLASH: {.    
8960: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
8970: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
8980: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
8990: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
89a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
89b0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ight);.      sql
89c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
89d0: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
89e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
89f0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
8a00: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
8a10: 53 48 49 46 54 3a 20 7b 0a 20 20 20 20 20 20 73  SHIFT: {.      s
8a20: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
8a30: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
8a40: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ight);.      sql
8a50: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
8a60: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
8a70: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
8a80: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
8a90: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
8aa0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8ab0: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
8ac0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8ad0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
8ae0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
8af0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8b00: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
8b10: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
8b20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8b30: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74  dOp(v, OP_Concat
8b40: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 2, 0);.      b
8b50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8b60: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
8b70: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
8b80: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a  pExpr->pLeft );.
8b90: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
8ba0: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46  >pLeft->op==TK_F
8bb0: 4c 4f 41 54 20 7c 7c 20 70 45 78 70 72 2d 3e 70  LOAT || pExpr->p
8bc0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
8bd0: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
8be0: 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 45 78 70  Token *p = &pExp
8bf0: 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  r->pLeft->token;
8c00: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8c10: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
8c20: 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20   p->n + 2 );.   
8c30: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 2c 20       sprintf(z, 
8c40: 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70  "-%.*s", p->n, p
8c50: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ->z);.        if
8c60: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  ( pExpr->pLeft->
8c70: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 26  op==TK_INTEGER &
8c80: 26 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e 33  & sqlite3FitsIn3
8c90: 32 42 69 74 73 28 7a 29 20 29 7b 0a 20 20 20 20  2Bits(z) ){.    
8ca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8cb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
8cc0: 65 67 65 72 2c 20 61 74 6f 69 28 7a 29 2c 20 30  eger, atoi(z), 0
8cd0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
8ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
8cf0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
8d00: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
8d10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8d20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
8d30: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
8d40: 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20  , p->n+1);.     
8d50: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
8d60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
8d70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
8d80: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
8d90: 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20  nto TK_NOT */.  
8da0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8db0: 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
8dc0: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
8dd0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
8de0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8df0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
8e00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
8e10: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
8e20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8e30: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
8e40: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
8e50: 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
8e60: 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20   int dest;.     
8e70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8e80: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
8e90: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
8ea0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
8eb0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
8ec0: 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20  ft);.      dest 
8ed0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
8ee0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
8ef0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8f00: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
8f10: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
8f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
8f30: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
8f40: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
8f50: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8f60: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
8f70: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
8f80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8f90: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
8fa0: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 62  ->iAgg);.      b
8fb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8fc0: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20  case TK_GLOB:.  
8fd0: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a    case TK_LIKE:.
8fe0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
8ff0: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
9000: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
9010: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
9020: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
9030: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
9040: 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
9050: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
9060: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20       int nId;.  
9070: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9080: 7a 49 64 3b 0a 20 20 20 20 20 20 67 65 74 46 75  zId;.      getFu
9090: 6e 63 74 69 6f 6e 4e 61 6d 65 28 70 45 78 70 72  nctionName(pExpr
90a0: 2c 20 26 7a 49 64 2c 20 26 6e 49 64 29 3b 0a 20  , &zId, &nId);. 
90b0: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
90c0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
90d0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c  pParse->db, zId,
90e0: 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20 30 29 3b   nId, nExpr, 0);
90f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9100: 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Def!=0 );.      
9110: 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  nExpr = sqlite3E
9120: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
9130: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
9140: 44 65 66 2d 3e 69 6e 63 6c 75 64 65 54 79 70 65  Def->includeType
9150: 73 29 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58  s);.      /* FIX
9160: 20 4d 45 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69   ME: The followi
9170: 6e 67 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  ng is a temporar
9180: 79 20 68 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20  y hack. */.     
9190: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
91a0: 74 72 4e 49 43 6d 70 28 7a 49 64 2c 20 22 63 6c  trNICmp(zId, "cl
91b0: 61 73 73 6f 66 22 2c 20 6e 49 64 29 20 29 7b 0a  assof", nId) ){.
91c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
91d0: 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
91e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
91f0: 70 33 28 76 2c 20 4f 50 5f 43 6c 61 73 73 2c 20  p3(v, OP_Class, 
9200: 6e 45 78 70 72 2c 20 30 2c 20 30 2c 20 30 29 3b  nExpr, 0, 0, 0);
9210: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9230: 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74  eOp3(v, OP_Funct
9240: 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 30 2c 20 28  ion, nExpr, 0, (
9250: 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 50  char*)pDef, P3_P
9260: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20 20 7d  OINTER);.      }
9270: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9280: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9290: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
92a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
92b0: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
92c0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
92d0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
92e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
92f0: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
9300: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73  nt addr;.      s
9310: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9320: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
9330: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
9340: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
9350: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
9360: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
9370: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9380: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
9390: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
93a0: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
93b0: 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 0a 20 20   -1, addr+4);.  
93c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
93d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
93e0: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
93f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9400: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
9410: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9420: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9430: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b 36 29  Goto, 0, addr+6)
9440: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
9450: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
9460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9470: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75  eAddOp(v, OP_Fou
9480: 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
9490: 65 2c 20 61 64 64 72 2b 36 29 3b 0a 20 20 20 20  e, addr+6);.    
94a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
94b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
94c0: 70 28 76 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64  p(v, OP_SetFound
94d0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
94e0: 20 61 64 64 72 2b 36 29 3b 0a 20 20 20 20 20 20   addr+6);.      
94f0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
9500: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
9510: 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20  ddImm, -1, 0);. 
9520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9530: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
9540: 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 73  TWEEN: {.      s
9550: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
9560: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
9570: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
9580: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9590: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
95a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
95b0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
95c0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
95d0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
95e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
95f0: 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a  , OP_Ge, 0, 0);.
9600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9610: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
9620: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
9630: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
9640: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9650: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
9660: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9670: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9680: 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Le, 0, 0);.     
9690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
96a0: 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20  p(v, OP_And, 0, 
96b0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
96c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
96d0: 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61  TK_UPLUS:.    ca
96e0: 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20  se TK_AS: {.    
96f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
9700: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9710: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62  >pLeft);.      b
9720: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9730: 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a  case TK_CASE: {.
9740: 20 20 20 20 20 20 69 6e 74 20 65 78 70 72 5f 65        int expr_e
9750: 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20  nd_label;.      
9760: 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20  int jumpInst;.  
9770: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
9780: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20      int nExpr;. 
9790: 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
97a0: 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
97b0: 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61  >pList);.      a
97c0: 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c  ssert((pExpr->pL
97d0: 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20  ist->nExpr % 2) 
97e0: 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  == 0);.      ass
97f0: 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
9800: 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
9810: 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 78 70      nExpr = pExp
9820: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  r->pList->nExpr;
9830: 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f  .      expr_end_
9840: 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  label = sqlite3V
9850: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
9860: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
9870: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
9880: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
9890: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
98a0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
98b0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
98c0: 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29   i<nExpr; i=i+2)
98d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
98e0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
98f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
9900: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
9910: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
9920: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
9930: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9940: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31  dOp(v, OP_Dup, 1
9950: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
9960: 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74  jumpInst = sqlit
9970: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9980: 50 5f 4e 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  P_Ne, 1, 0);.   
9990: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
99a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
99b0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
99c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
99d0: 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71     jumpInst = sq
99e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
99f0: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c 20 30  , OP_IfNot, 1, 0
9a00: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9a10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9a20: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
9a30: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2b 31  pr->pList->a[i+1
9a40: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
9a50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9a60: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
9a70: 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  , expr_end_label
9a80: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
9a90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
9aa0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
9ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9ac0: 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75 6d 70  ChangeP2(v, jump
9ad0: 49 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20 20 20  Inst, addr);.   
9ae0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
9af0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
9b00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9b10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
9b20: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
9b30: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
9b40: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
9b50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9b60: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
9b70: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
9b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9ba0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
9bb0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
9bc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9bd0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
9be0: 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29   expr_end_label)
9bf0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9c00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
9c10: 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
9c20: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69  if( !pParse->tri
9c30: 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  gStack ){.      
9c40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9c50: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c70: 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
9c80: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
9c90: 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
9ca0: 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ram");.        p
9cb0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 09  Parse->nErr++;..
9cc0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
9cd0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
9ce0: 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 52  >iColumn == OE_R
9cf0: 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 09 20 20 70 45  ollback ||..  pE
9d00: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
9d10: 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 09 20 20 70  OE_Abort ||..  p
9d20: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d  Expr->iColumn ==
9d30: 20 4f 45 5f 46 61 69 6c 20 29 7b 0a 09 20 20 73   OE_Fail ){..  s
9d40: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
9d50: 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
9d60: 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78  _CONSTRAINT, pEx
9d70: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
9da0: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
9db0: 6f 6b 65 6e 2e 6e 29 3b 0a 09 20 20 73 71 6c 69  oken.n);..  sqli
9dc0: 74 65 33 56 64 62 65 44 65 71 75 6f 74 65 50 33  te3VdbeDequoteP3
9dd0: 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d  (v, -1);.      }
9de0: 20 65 6c 73 65 20 7b 0a 09 20 20 61 73 73 65 72   else {..  asser
9df0: 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t( pExpr->iColum
9e00: 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29  n == OE_Ignore )
9e10: 3b 0a 09 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
9e20: 4f 70 33 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op3(v, OP_Goto, 
9e30: 30 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53  0, pParse->trigS
9e40: 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70  tack->ignoreJump
9e50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 28 49               "(I
9e70: 47 4e 4f 52 45 20 6a 75 6d 70 29 22 2c 20 30 29  GNORE jump)", 0)
9e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9e90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d      break;.  }.}
9ea0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
9eb0: 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65   code that pushe
9ec0: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  s the value of e
9ed0: 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
9ee0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
9ef0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e 74  ression list ont
9f00: 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66  o the stack.  If
9f10: 20 74 68 65 20 69 6e 63 6c 75 64 65 54 79 70 65   the includeType
9f20: 73 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 0a  s flag is true,.
9f30: 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 70 75 73  ** then also pus
9f40: 68 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  h a string that 
9f50: 69 73 20 74 68 65 20 64 61 74 61 74 79 70 65 20  is the datatype 
9f60: 6f 66 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20  of each element 
9f70: 6f 6e 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 63  onto.** the stac
9f80: 6b 20 61 66 74 65 72 20 74 68 65 20 76 61 6c 75  k after the valu
9f90: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
9fa0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
9fb0: 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f 6e  ements pushed on
9fc0: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f  to the stack..*/
9fd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
9fe0: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
9ff0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a000: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
a010: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
a020: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
a030: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
a040: 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
a050: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 63 6c 75 64   */.  int includ
a060: 65 54 79 70 65 73 20 20 20 2f 2a 20 54 52 55 45  eTypes   /* TRUE
a070: 20 74 6f 20 70 75 74 20 64 61 74 61 74 79 70 65   to put datatype
a080: 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 74  s on the stack t
a090: 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  oo */.){.  struc
a0a0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a0b0: 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
a0c0: 20 6e 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20   n;.  Vdbe *v;. 
a0d0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
a0e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 76 20 3d 20  return 0;.  v = 
a0f0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
a100: 50 61 72 73 65 29 3b 0a 20 20 6e 20 3d 20 70 4c  Parse);.  n = pL
a110: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f  ist->nExpr;.  fo
a120: 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
a130: 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c  , i=0; i<n; i++,
a140: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
a150: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
a160: 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
a170: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  xpr);.    if( in
a180: 63 6c 75 64 65 54 79 70 65 73 20 29 7b 0a 20 20  cludeTypes ){.  
a190: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
a1a0: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  p3(v, OP_String,
a1b0: 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   0, 0, .        
a1c0: 20 73 71 6c 69 74 65 33 45 78 70 72 54 79 70 65   sqlite3ExprType
a1d0: 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3d 3d  (pItem->pExpr)==
a1e0: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 3f 20  SQLITE_SO_NUM ? 
a1f0: 22 6e 75 6d 65 72 69 63 22 20 3a 20 22 74 65 78  "numeric" : "tex
a200: 74 22 2c 0a 20 20 20 20 20 20 20 20 20 50 33 5f  t",.         P3_
a210: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20  STATIC);.    }. 
a220: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 63 6c   }.  return incl
a230: 75 64 65 54 79 70 65 73 20 3f 20 6e 2a 32 20 3a  udeTypes ? n*2 :
a240: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
a250: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
a260: 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
a270: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
a280: 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
a290: 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
a2a0: 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
a2b0: 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
a2c0: 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
a2d0: 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
a2e0: 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
a2f0: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
a300: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
a310: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
a320: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
a330: 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
a340: 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
a350: 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
a360: 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
a370: 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  lag is true..*/.
a380: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
a390: 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
a3a0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
a3b0: 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
a3c0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
a3d0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a3e0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
a3f0: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d  p = 0;.  if( v==
a400: 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
a410: 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68  return;.  switch
a420: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
a430: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
a440: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b       op = OP_Lt;
a450: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a460: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
a470: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20      op = OP_Le; 
a480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a490: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
a4a0: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20     op = OP_Gt;  
a4b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a4c0: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
a4d0: 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20    op = OP_Ge;   
a4e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a4f0: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
a500: 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20   op = OP_Ne;    
a510: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a520: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20  se TK_EQ:       
a530: 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20  op = OP_Eq;     
a540: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a550: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f  e TK_ISNULL:   o
a560: 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20  p = OP_IsNull;  
a570: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a580: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70   TK_NOTNULL:  op
a590: 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20   = OP_NotNull;  
a5a0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
a5b0: 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  lt:  break;.  }.
a5c0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
a5d0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
a5e0: 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
a5f0: 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
a600: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
a610: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
a620: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
a630: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
a640: 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c   d2, !jumpIfNull
a650: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a660: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
a670: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
a680: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
a690: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
a6a0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
a6b0: 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
a6c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a6d0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
a6e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a6f0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
a700: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
a710: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
a720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
a730: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
a740: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
a750: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
a760: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a770: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
a780: 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73  K_NOT: {.      s
a790: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
a7a0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
a7b0: 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
a7c0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
a7d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a7e0: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
a7f0: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
a800: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
a810: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
a820: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
a830: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
a840: 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 62        int p1 = b
a850: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70  inaryCompareP1(p
a860: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
a870: 70 72 2d 3e 70 52 69 67 68 74 2c 20 6a 75 6d 70  pr->pRight, jump
a880: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
a890: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
a8a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
a8b0: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
a8c0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
a8d0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
a8e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
a8f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
a900: 2c 20 70 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , p1, dest);.   
a910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a920: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
a930: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
a940: 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
a950: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
a960: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
a970: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
a980: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a990: 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a  , op, 1, dest);.
a9a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a9b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
a9c0: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  N: {.      int a
a9d0: 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ddr;.      sqlit
a9e0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
a9f0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
aa00: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
aa10: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
aa20: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
aa30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aa40: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
aa50: 2d 31 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20  -1, addr+3);.   
aa60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aa70: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
aa80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
aa90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
aaa0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 75 6d 70  OP_Goto, 0, jump
aab0: 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20  IfNull ? dest : 
aac0: 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 20 20 69  addr+4);.      i
aad0: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
aae0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
aaf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ab00: 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
ab10: 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29 3b  ->iTable, dest);
ab20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ab30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ab40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
ab50: 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
ab60: 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20  able, dest);.   
ab70: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
ab80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ab90: 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
aba0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
abb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
abc0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
abd0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
abe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
abf0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
ac00: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
ac10: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
ac20: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
ac30: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
ac40: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
ac50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ac60: 50 5f 4c 74 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  P_Lt, !jumpIfNul
ac70: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  l, 0);.      sql
ac80: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ac90: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
aca0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  t->a[1].pExpr);.
acb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
acc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 65 2c  eAddOp(v, OP_Le,
acd0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73   jumpIfNull, des
ace0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
acf0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ad00: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
ad10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ad20: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
ad30: 64 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  dr, sqlite3VdbeC
ad40: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
ad50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ad60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
ad70: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 1, 0);.      b
ad80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ad90: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
ada0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
adb0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
adc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
add0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
ade0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
adf0: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
ae00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
ae10: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
ae20: 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
ae30: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
ae40: 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
ae50: 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
ae60: 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
ae70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
ae80: 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
ae90: 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
aea0: 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
aeb0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
aec0: 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
aed0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
aee0: 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
aef0: 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
af00: 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
af10: 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
af20: 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65  mpIfNull is true
af30: 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
af40: 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
af50: 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64  s false..*/.void
af60: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
af70: 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
af80: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
af90: 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
afa0: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
afb0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
afc0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
afd0: 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c   0;.  if( v==0 |
afe0: 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  | pExpr==0 ) ret
aff0: 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70  urn;.  switch( p
b000: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
b010: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
b020: 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20    op = OP_Ge;   
b030: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
b040: 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20  ase TK_LE:      
b050: 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20   op = OP_Gt;    
b060: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
b070: 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20  se TK_GT:       
b080: 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20  op = OP_Le;     
b090: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
b0a0: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f  e TK_GE:       o
b0b0: 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20  p = OP_Lt;      
b0c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
b0d0: 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70   TK_NE:       op
b0e0: 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20   = OP_Eq;       
b0f0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
b100: 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20  TK_EQ:       op 
b110: 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20 62  = OP_Ne;       b
b120: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
b130: 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d  K_ISNULL:   op =
b140: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72   OP_NotNull;  br
b150: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
b160: 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20  _NOTNULL:  op = 
b170: 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65  OP_IsNull;   bre
b180: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
b190: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73    break;.  }.  s
b1a0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
b1b0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
b1c0: 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AND: {.      sql
b1d0: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
b1e0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b1f0: 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
b200: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
b210: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
b220: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
b230: 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
b240: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
b250: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b260: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
b270: 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
b280: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
b290: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
b2a0: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
b2b0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
b2c0: 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70  pLeft, d2, !jump
b2d0: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
b2e0: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
b2f0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
b300: 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
b310: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
b320: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
b330: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
b340: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b350: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b360: 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  _NOT: {.      sq
b370: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
b380: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b390: 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
b3a0: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
b3b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b3c0: 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
b3d0: 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
b3e0: 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
b3f0: 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
b400: 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
b410: 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
b420: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e      int p1 = bin
b430: 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70 45 78  aryCompareP1(pEx
b440: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
b450: 2d 3e 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66  ->pRight, jumpIf
b460: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
b470: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
b480: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
b490: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
b4a0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b4b0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
b4c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b4d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
b4e0: 70 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  p1, dest);.     
b4f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b500: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
b510: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
b520: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
b530: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b540: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b550: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
b560: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b570: 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
b580: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b590: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
b5a0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
b5b0: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
b5c0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b5d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
b5e0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
b5f0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
b600: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
b610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b620: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
b630: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
b640: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b650: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
b660: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
b670: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b680: 5f 47 6f 74 6f 2c 20 30 2c 20 6a 75 6d 70 49 66  _Goto, 0, jumpIf
b690: 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 61 64  Null ? dest : ad
b6a0: 64 72 2b 34 29 3b 0a 20 20 20 20 20 20 69 66 28  dr+4);.      if(
b6b0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
b6c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b6d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b6e0: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_NotFound, pExp
b6f0: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29  r->iTable, dest)
b700: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b710: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b720: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
b730: 74 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72  tNotFound, pExpr
b740: 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29 3b  ->iTable, dest);
b750: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
b760: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b770: 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
b780: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
b790: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
b7a0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b7b0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
b7c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b7d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
b7e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b7f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b800: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b810: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
b820: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
b830: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
b840: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
b850: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b860: 28 76 2c 20 4f 50 5f 47 65 2c 20 21 6a 75 6d 70  (v, OP_Ge, !jump
b870: 49 66 4e 75 6c 6c 2c 20 61 64 64 72 2b 33 29 3b  IfNull, addr+3);
b880: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b890: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
b8a0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
b8b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b8c0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
b8d0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
b8e0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
b8f0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
b900: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  t->a[1].pExpr);.
b910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b920: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 74 2c  eAddOp(v, OP_Gt,
b930: 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73   jumpIfNull, des
b940: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
b950: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
b960: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  lt: {.      sqli
b970: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
b980: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
b990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b9a0: 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  Op(v, OP_IfNot, 
b9b0: 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74  jumpIfNull, dest
b9c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b9d0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
b9e0: 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
b9f0: 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
ba00: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
ba10: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e    Return TRUE (n
ba20: 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74  on-zero).** if t
ba30: 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
ba40: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c  l and return FAL
ba50: 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65  SE if they diffe
ba60: 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f  r in any way..*/
ba70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
ba80: 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
ba90: 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69  , Expr *pB){.  i
baa0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
bab0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
bac0: 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  pB==0;.  }else i
bad0: 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  f( pB==0 ){.    
bae0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
baf0: 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
bb00: 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  op ) return 0;. 
bb10: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
bb20: 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
bb30: 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29  ft, pB->pLeft) )
bb40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
bb50: 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
bb60: 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
bb70: 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
bb80: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
bb90: 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  A->pList ){.    
bba0: 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30  if( pB->pList==0
bbb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
bbc0: 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e   if( pA->pList->
bbd0: 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74  nExpr!=pB->pList
bbe0: 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e  ->nExpr ) return
bbf0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
bc00: 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45   i<pA->pList->nE
bc10: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
bc20: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
bc30: 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69  rCompare(pA->pLi
bc40: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
bc50: 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pB->pList->a[i].
bc60: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
bc70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
bc80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
bc90: 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20  e if( pB->pList 
bca0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
bcb0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70  .  }.  if( pA->p
bcc0: 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53  Select || pB->pS
bcd0: 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
bce0: 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62  ;.  if( pA->iTab
bcf0: 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c  le!=pB->iTable |
bd00: 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  | pA->iColumn!=p
bd10: 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
bd20: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
bd30: 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20  >token.z ){.    
bd40: 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d  if( pB->token.z=
bd50: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bd60: 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e     if( pB->token
bd70: 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20  .n!=pA->token.n 
bd80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
bd90: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
bda0: 43 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c  Cmp(pA->token.z,
bdb0: 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42   pB->token.z, pB
bdc0: 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20  ->token.n)!=0 ) 
bdd0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
bde0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
bdf0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
be00: 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 50 61 72  ment to the pPar
be10: 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
be20: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20   and return its 
be30: 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
be40: 20 69 6e 74 20 61 70 70 65 6e 64 41 67 67 49 6e   int appendAggIn
be50: 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
be60: 29 7b 0a 20 20 69 66 28 20 28 70 50 61 72 73 65  ){.  if( (pParse
be70: 2d 3e 6e 41 67 67 20 26 20 30 78 37 29 3d 3d 30  ->nAgg & 0x7)==0
be80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   ){.    int amt 
be90: 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 2b  = pParse->nAgg +
bea0: 20 38 3b 0a 20 20 20 20 41 67 67 45 78 70 72 20   8;.    AggExpr 
beb0: 2a 61 41 67 67 20 3d 20 73 71 6c 69 74 65 52 65  *aAgg = sqliteRe
bec0: 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61 41  alloc(pParse->aA
bed0: 67 67 2c 20 61 6d 74 2a 73 69 7a 65 6f 66 28 70  gg, amt*sizeof(p
bee0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29  Parse->aAgg[0]))
bef0: 3b 0a 20 20 20 20 69 66 28 20 61 41 67 67 3d 3d  ;.    if( aAgg==
bf00: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
bf10: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
bf20: 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 61  pParse->aAgg = a
bf30: 41 67 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  Agg;.  }.  memse
bf40: 74 28 26 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  t(&pParse->aAgg[
bf50: 70 50 61 72 73 65 2d 3e 6e 41 67 67 5d 2c 20 30  pParse->nAgg], 0
bf60: 2c 20 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  , sizeof(pParse-
bf70: 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 72 65  >aAgg[0]));.  re
bf80: 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 41 67  turn pParse->nAg
bf90: 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  g++;.}../*.** An
bfa0: 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20  alyze the given 
bfb0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
bfc0: 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
bfd0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
bfe0: 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
bff0: 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
c000: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61  added to the pPa
c010: 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
c020: 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74  y..** Make addit
c030: 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f  ional entries to
c040: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
c050: 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63  g[] array as nec
c060: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  essary..**.** Th
c070: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
c080: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
c090: 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65   after the expre
c0a0: 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a  ssion has been.*
c0b0: 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71  * analyzed by sq
c0c0: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
c0d0: 49 64 73 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Ids() and sqlite
c0e0: 33 45 78 70 72 43 68 65 63 6b 28 29 2e 0a 2a 2a  3ExprCheck()..**
c0f0: 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72  .** If errors ar
c100: 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e  e seen, leave an
c110: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
c120: 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65  n zErrMsg and re
c130: 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
c140: 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f  er of errors..*/
c150: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
c160: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
c170: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
c180: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
c190: 20 69 6e 74 20 69 3b 0a 20 20 41 67 67 45 78 70   int i;.  AggExp
c1a0: 72 20 2a 61 41 67 67 3b 0a 20 20 69 6e 74 20 6e  r *aAgg;.  int n
c1b0: 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Err = 0;..  if( 
c1c0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
c1d0: 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  n 0;.  switch( p
c1e0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
c1f0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
c200: 7b 0a 20 20 20 20 20 20 61 41 67 67 20 3d 20 70  {.      aAgg = p
c210: 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20  Parse->aAgg;.   
c220: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
c230: 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
c240: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 41  {.        if( aA
c250: 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f  gg[i].isAgg ) co
c260: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
c270: 69 66 28 20 61 41 67 67 5b 69 5d 2e 70 45 78 70  if( aAgg[i].pExp
c280: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  r->iTable==pExpr
c290: 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
c2a0: 20 20 26 26 20 61 41 67 67 5b 69 5d 2e 70 45 78    && aAgg[i].pEx
c2b0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pr->iColumn==pEx
c2c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
c2d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c2e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c2f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70  }.      if( i>=p
c300: 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20  Parse->nAgg ){. 
c310: 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e         i = appen
c320: 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29  dAggInfo(pParse)
c330: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
c340: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
c350: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
c360: 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 30 3b  gg[i].isAgg = 0;
c370: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
c380: 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d  >aAgg[i].pExpr =
c390: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a   pExpr;.      }.
c3a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
c3b0: 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 62 72 65  g = i;.      bre
c3c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
c3d0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
c3e0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67 67  ON: {.      aAgg
c3f0: 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b   = pParse->aAgg;
c400: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c410: 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
c420: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
c430: 28 20 21 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  ( !aAgg[i].isAgg
c440: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
c450: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
c460: 45 78 70 72 43 6f 6d 70 61 72 65 28 61 41 67 67  ExprCompare(aAgg
c470: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 78 70 72  [i].pExpr, pExpr
c480: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  ) ){.          b
c490: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
c4a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c4b0: 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67  ( i>=pParse->nAg
c4c0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  g ){.        i =
c4d0: 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70   appendAggInfo(p
c4e0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
c4f0: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
c500: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   1;.        pPar
c510: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
c520: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  g = 1;.        p
c530: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
c540: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
c550: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
c560: 67 67 5b 69 5d 2e 70 46 75 6e 63 20 3d 20 73 71  gg[i].pFunc = sq
c570: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
c580: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
c590: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
c5a0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
c5b0: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20  ->token.n,.     
c5c0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
c5d0: 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c  List ? pExpr->pL
c5e0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
c5f0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
c600: 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
c610: 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  i;.      break;.
c620: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
c630: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
c640: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
c650: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
c660: 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
c670: 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
c680: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
c690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c6a0: 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70  if( nErr==0 && p
c6b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
c6c0: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
c6d0: 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
c6e0: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
c6f0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
c700: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
c710: 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26    if( nErr==0 &&
c720: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
c730: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
c740: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
c750: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Expr;.        in
c760: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
c770: 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26  (i=0; nErr==0 &&
c780: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
c790: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
c7a0: 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
c7b0: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
c7c0: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
c7d0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
c7e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c7f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c800: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
c810: 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Err;.}../*.** Lo
c820: 63 61 74 65 20 61 20 75 73 65 72 20 66 75 6e 63  cate a user func
c830: 74 69 6f 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d  tion given a nam
c840: 65 20 61 6e 64 20 61 20 6e 75 6d 62 65 72 20 6f  e and a number o
c850: 66 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20  f arguments..** 
c860: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
c870: 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20   to the FuncDef 
c880: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
c890: 65 66 69 6e 65 73 20 74 68 61 74 0a 2a 2a 20 66  efines that.** f
c8a0: 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75  unction, or retu
c8b0: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
c8c0: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
c8d0: 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   exist..**.** If
c8e0: 20 74 68 65 20 63 72 65 61 74 65 46 6c 61 67 20   the createFlag 
c8f0: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
c900: 2c 20 74 68 65 6e 20 61 20 6e 65 77 20 28 62 6c  , then a new (bl
c910: 61 6e 6b 29 20 46 75 6e 63 44 65 66 0a 2a 2a 20  ank) FuncDef.** 
c920: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
c930: 61 74 65 64 20 61 6e 64 20 6c 69 6b 65 64 20 69  ated and liked i
c940: 6e 74 6f 20 74 68 65 20 22 64 62 22 20 73 74 72  nto the "db" str
c950: 75 63 74 75 72 65 20 69 66 20 61 0a 2a 2a 20 6e  ucture if a.** n
c960: 6f 20 6d 61 74 63 68 69 6e 67 20 66 75 6e 63 74  o matching funct
c970: 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 65  ion previously e
c980: 78 69 73 74 65 64 2e 20 20 57 68 65 6e 20 63 72  xisted.  When cr
c990: 65 61 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  eateFlag is true
c9a0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 41 72 67  .** and the nArg
c9b0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 2d 31   parameter is -1
c9c0: 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 61 20 66 75  , then only a fu
c9d0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 61 63 63 65  nction that acce
c9e0: 70 74 73 0a 2a 2a 20 61 6e 79 20 6e 75 6d 62 65  pts.** any numbe
c9f0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77  r of arguments w
ca00: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
ca10: 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74 65  .**.** If create
ca20: 46 6c 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e  Flag is false an
ca30: 64 20 6e 41 72 67 20 69 73 20 2d 31 2c 20 74 68  d nArg is -1, th
ca40: 65 6e 20 74 68 65 20 66 69 72 73 74 20 76 61 6c  en the first val
ca50: 69 64 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  id.** function f
ca60: 6f 75 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64  ound is returned
ca70: 2e 20 20 41 20 66 75 6e 63 74 69 6f 6e 20 69 73  .  A function is
ca80: 20 76 61 6c 69 64 20 69 66 20 65 69 74 68 65 72   valid if either
ca90: 20 78 46 75 6e 63 0a 2a 2a 20 6f 72 20 78 53 74   xFunc.** or xSt
caa0: 65 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  ep is non-zero..
cab0: 2a 2f 0a 46 75 6e 63 44 65 66 20 2a 73 71 6c 69  */.FuncDef *sqli
cac0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
cad0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20  .  sqlite *db,  
cae0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e        /* An open
caf0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
cb00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
cb10: 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  , /* Name of the
cb20: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20   function.  Not 
cb30: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20  null-terminated 
cb40: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20  */.  int nName, 
cb50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
cb60: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
cb70: 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  in the name */. 
cb80: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
cb90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cba0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20   arguments.  -1 
cbb0: 6d 65 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72  means any number
cbc0: 20 2a 2f 0a 20 20 69 6e 74 20 63 72 65 61 74 65   */.  int create
cbd0: 46 6c 61 67 20 20 20 20 20 2f 2a 20 43 72 65 61  Flag     /* Crea
cbe0: 74 65 20 6e 65 77 20 65 6e 74 72 79 20 69 66 20  te new entry if 
cbf0: 74 72 75 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  true and does no
cc00: 74 20 6f 74 68 65 72 77 69 73 65 20 65 78 69 73  t otherwise exis
cc10: 74 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65  t */.){.  FuncDe
cc20: 66 20 2a 70 46 69 72 73 74 2c 20 2a 70 2c 20 2a  f *pFirst, *p, *
cc30: 70 4d 61 79 62 65 3b 0a 20 20 70 46 69 72 73 74  pMaybe;.  pFirst
cc40: 20 3d 20 70 20 3d 20 28 46 75 6e 63 44 65 66 2a   = p = (FuncDef*
cc50: 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64  )sqlite3HashFind
cc60: 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61  (&db->aFunc, zNa
cc70: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66  me, nName);.  if
cc80: 28 20 70 20 26 26 20 21 63 72 65 61 74 65 46 6c  ( p && !createFl
cc90: 61 67 20 26 26 20 6e 41 72 67 3c 30 20 29 7b 0a  ag && nArg<0 ){.
cca0: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
ccb0: 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 26 26 20 70  p->xFunc==0 && p
ccc0: 2d 3e 78 53 74 65 70 3d 3d 30 20 29 7b 20 70 20  ->xStep==0 ){ p 
ccd0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20  = p->pNext; }.  
cce0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a    return p;.  }.
ccf0: 20 20 70 4d 61 79 62 65 20 3d 20 30 3b 0a 20 20    pMaybe = 0;.  
cd00: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
cd10: 41 72 67 21 3d 6e 41 72 67 20 29 7b 0a 20 20 20  Arg!=nArg ){.   
cd20: 20 69 66 28 20 70 2d 3e 6e 41 72 67 3c 30 20 26   if( p->nArg<0 &
cd30: 26 20 21 63 72 65 61 74 65 46 6c 61 67 20 26 26  & !createFlag &&
cd40: 20 28 70 2d 3e 78 46 75 6e 63 20 7c 7c 20 70 2d   (p->xFunc || p-
cd50: 3e 78 53 74 65 70 29 20 29 20 70 4d 61 79 62 65  >xStep) ) pMaybe
cd60: 20 3d 20 70 3b 0a 20 20 20 20 70 20 3d 20 70 2d   = p;.    p = p-
cd70: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
cd80: 28 20 70 20 26 26 20 21 63 72 65 61 74 65 46 6c  ( p && !createFl
cd90: 61 67 20 26 26 20 70 2d 3e 78 46 75 6e 63 3d 3d  ag && p->xFunc==
cda0: 30 20 26 26 20 70 2d 3e 78 53 74 65 70 3d 3d 30  0 && p->xStep==0
cdb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
cdc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30  ;.  }.  if( p==0
cdd0: 20 26 26 20 70 4d 61 79 62 65 20 29 7b 0a 20 20   && pMaybe ){.  
cde0: 20 20 61 73 73 65 72 74 28 20 63 72 65 61 74 65    assert( create
cdf0: 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Flag==0 );.    r
ce00: 65 74 75 72 6e 20 70 4d 61 79 62 65 3b 0a 20 20  eturn pMaybe;.  
ce10: 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20 26 26 20  }.  if( p==0 && 
ce20: 63 72 65 61 74 65 46 6c 61 67 20 26 26 20 28 70  createFlag && (p
ce30: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
ce40: 73 69 7a 65 6f 66 28 2a 70 29 29 29 21 3d 30 20  sizeof(*p)))!=0 
ce50: 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 72 67 20 3d  ){.    p->nArg =
ce60: 20 6e 41 72 67 3b 0a 20 20 20 20 70 2d 3e 70 4e   nArg;.    p->pN
ce70: 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
ce80: 20 20 70 2d 3e 64 61 74 61 54 79 70 65 20 3d 20    p->dataType = 
ce90: 70 46 69 72 73 74 20 3f 20 70 46 69 72 73 74 2d  pFirst ? pFirst-
cea0: 3e 64 61 74 61 54 79 70 65 20 3a 20 53 51 4c 49  >dataType : SQLI
ceb0: 54 45 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  TE_NUMERIC;.    
cec0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
ced0: 74 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e  t(&db->aFunc, zN
cee0: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 28 76 6f 69  ame, nName, (voi
cef0: 64 2a 29 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  d*)p);.  }.  ret
cf00: 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 0a              urn p;.}....