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

Artifact 90f440e1fe065717bbe391cc4de455997794399d:


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 37 31 20 32 30 30 34 2f 31 31 2f 32 30 20  .171 2004/11/20 
0220: 31 38 3a 31 33 3a 31 30 20 64 72 68 20 45 78 70  18:13:10 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
04b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29 7b 0a  r->op==TK_AS ){.
04c0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
04d0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
04e0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
04f0: 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  }.  if( pExpr->o
0500: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
0510: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
0520: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0530: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Expr->pSelect->p
0540: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
0550: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
0560: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
0570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0580: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  n the default co
0590: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
05a0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
05b0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
05c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
05d0: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 74  ault collation t
05e0: 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ype, return 0..*
05f0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
0600: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61  e3ExprCollSeq(Pa
0610: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
0620: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c  r *pExpr){.  Col
0630: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
0640: 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a  .  if( pExpr ){.
0650: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 45 78 70      pColl = pExp
0660: 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  r->pColl;.    if
0670: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
0680: 41 53 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  AS && !pColl ){.
0690: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
06a0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
06b0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
06c0: 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Left);.    }.  }
06d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
06e0: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
06f0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
0700: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
0710: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
0720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
0730: 69 73 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  is the left oper
0740: 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  and of a compari
0750: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61  son operator.  a
0760: 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79  ff2 is the.** ty
0770: 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  pe affinity of t
0780: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
0790: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
07a0: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74  returns the.** t
07b0: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
07c0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
07d0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
07e0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
07f0: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d  .char sqlite3Com
0800: 70 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70  pareAffinity(Exp
0810: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61  r *pExpr, char a
0820: 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ff2){.  char aff
0830: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  1 = sqlite3ExprA
0840: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
0850: 20 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66    if( aff1 && af
0860: 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74  f2 ){.    /* Bot
0870: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
0880: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f  omparison are co
0890: 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61  lumns. If one ha
08a0: 73 20 6e 75 6d 65 72 69 63 20 6f 72 0a 20 20 20  s numeric or.   
08b0: 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 66 66 69   ** integer affi
08c0: 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20  nity, use that. 
08d0: 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f  Otherwise use no
08e0: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a   affinity..    *
08f0: 2f 0a 20 20 20 20 69 66 28 20 61 66 66 31 3d 3d  /.    if( aff1==
0900: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
0910: 45 52 20 7c 7c 20 61 66 66 32 3d 3d 53 51 4c 49  ER || aff2==SQLI
0920: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
0930: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
0940: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
0950: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
0960: 20 61 66 66 31 3d 3d 53 51 4c 49 54 45 5f 41 46   aff1==SQLITE_AF
0970: 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66  F_NUMERIC || aff
0980: 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  2==SQLITE_AFF_NU
0990: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 72  MERIC ){.      r
09a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
09b0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65  _NUMERIC;.    }e
09c0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
09d0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  n SQLITE_AFF_NON
09e0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
09f0: 20 69 66 28 20 21 61 66 66 31 20 26 26 20 21 61   if( !aff1 && !a
0a00: 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ff2 ){.    /* Ne
0a10: 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68  ither side of th
0a20: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
0a30: 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61  a column.  Compa
0a40: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  re the.    ** re
0a50: 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a  sults directly..
0a60: 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 20 72 65      */.    /* re
0a70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
0a80: 4e 55 4d 45 52 49 43 3b 20 20 2f 2f 20 54 69 63  NUMERIC;  // Tic
0a90: 6b 65 74 20 23 38 30 35 20 2a 2f 0a 20 20 20 20  ket #805 */.    
0aa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0ab0: 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  F_NONE;.  }else{
0ac0: 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65  .    /* One side
0ad0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
0ae0: 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20  e other is not. 
0af0: 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  Use the columns 
0b00: 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
0b10: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
0b20: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
0b30: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
0b40: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
0b50: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
0b60: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
0b70: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
0b80: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
0b90: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
0ba0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
0bb0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
0bc0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
0bd0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
0be0: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
0bf0: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
0c00: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
0c10: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
0c20: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
0c30: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
0c40: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
0c50: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
0c60: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
0c70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
0c80: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
0c90: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20  >op==TK_NE );.  
0ca0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
0cb0: 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20  Left );.  aff = 
0cc0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
0cd0: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
0ce0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
0cf0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66  pRight ){.    af
0d00: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
0d10: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
0d20: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a  ->pRight, aff);.
0d30: 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 70    }.  else if( p
0d40: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
0d50: 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
0d60: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
0d70: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0d80: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0d90: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 0a  Expr, aff);.  }.
0da0: 20 20 65 6c 73 65 20 69 66 28 20 21 61 66 66 20    else if( !aff 
0db0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c  ){.    aff = SQL
0dc0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
0dd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
0de0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  f;.}../*.** pExp
0df0: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
0e00: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67  n expression, eg
0e10: 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e  . '=', '<', IN(.
0e20: 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f  ..) etc..** idx_
0e30: 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20  affinity is the 
0e40: 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69  affinity of an i
0e50: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52  ndexed column. R
0e60: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
0e70: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
0e80: 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66  affinity idx_aff
0e90: 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65  inity may be use
0ea0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
0eb0: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
0ec0: 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e   in pExpr..*/.in
0ed0: 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  t sqlite3IndexAf
0ee0: 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70  finityOk(Expr *p
0ef0: 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61  Expr, char idx_a
0f00: 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72  ffinity){.  char
0f10: 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f   aff = compariso
0f20: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
0f30: 3b 0a 20 20 72 65 74 75 72 6e 20 0a 20 20 20 20  ;.  return .    
0f40: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
0f50: 5f 4e 4f 4e 45 29 20 7c 7c 0a 20 20 20 20 28 61  _NONE) ||.    (a
0f60: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
0f70: 55 4d 45 52 49 43 20 26 26 20 69 64 78 5f 61 66  UMERIC && idx_af
0f80: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
0f90: 46 46 5f 49 4e 54 45 47 45 52 29 20 7c 7c 0a 20  FF_INTEGER) ||. 
0fa0: 20 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f     (aff==SQLITE_
0fb0: 41 46 46 5f 49 4e 54 45 47 45 52 20 26 26 20 69  AFF_INTEGER && i
0fc0: 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  dx_affinity==SQL
0fd0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
0fe0: 20 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d 69 64   ||.    (aff==id
0ff0: 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 7d 0a 0a  x_affinity);.}..
1000: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1010: 20 50 31 20 76 61 6c 75 65 20 74 68 61 74 20 73   P1 value that s
1020: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
1030: 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61  r a binary compa
1040: 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20  rison.** opcode 
1050: 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74  (OP_Eq, OP_Ge et
1060: 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  c.) used to comp
1070: 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70  are pExpr1 and p
1080: 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20 6a 75 6d  Expr2..** If jum
1090: 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 2c  pIfNull is true,
10a0: 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 6c 6f   then set the lo
10b0: 77 20 62 79 74 65 20 6f 66 20 74 68 65 20 72 65  w byte of the re
10c0: 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20 76 61 6c  turned.** P1 val
10d0: 75 65 20 74 6f 20 74 65 6c 6c 20 74 68 65 20 6f  ue to tell the o
10e0: 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70 20 69 66  pcode to jump if
10f0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
1100: 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65 73 20  on.** evaluates 
1110: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  to NULL..*/.stat
1120: 69 63 20 69 6e 74 20 62 69 6e 61 72 79 43 6f 6d  ic int binaryCom
1130: 70 61 72 65 50 31 28 45 78 70 72 20 2a 70 45 78  pareP1(Expr *pEx
1140: 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pr1, Expr *pExpr
1150: 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  2, int jumpIfNul
1160: 6c 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d  l){.  char aff =
1170: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1180: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
1190: 72 65 74 75 72 6e 20 28 28 28 69 6e 74 29 73 71  return (((int)sq
11a0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
11b0: 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66  nity(pExpr1, aff
11c0: 29 29 3c 3c 38 29 2b 28 6a 75 6d 70 49 66 4e 75  ))<<8)+(jumpIfNu
11d0: 6c 6c 3f 31 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ll?1:0);.}../*.*
11e0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
11f0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
1200: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
1210: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1220: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
1230: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1240: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
1250: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
1260: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
1270: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1280: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
1290: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
12a0: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
12b0: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
12c0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
12d0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
12e0: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
12f0: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
1300: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
1310: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
1320: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
1330: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
1340: 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   type..*/.static
1350: 20 43 6f 6c 6c 53 65 71 2a 20 62 69 6e 61 72 79   CollSeq* binary
1360: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 50  CompareCollSeq(P
1370: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1380: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
1390: 2a 70 52 69 67 68 74 29 7b 0a 20 20 43 6f 6c 6c  *pRight){.  Coll
13a0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
13b0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
13c0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
13d0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
13e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
13f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1400: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
1410: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
1420: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ll;.}../*.** Gen
1430: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1440: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
1450: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
1460: 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  int codeCompare(
1470: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1480: 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  ,    /* The pars
1490: 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65  ing (and code ge
14a0: 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78  nerating) contex
14b0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  t */.  Expr *pLe
14c0: 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ft,      /* The 
14d0: 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  left operand */.
14e0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
14f0: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1500: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1510: 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20  t opcode,       
1520: 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  /* The compariso
1530: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  n opcode */.  in
1540: 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
1550: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
1560: 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  true.  */.  int 
1570: 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
1580: 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69   If true, jump i
1590: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
15a0: 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
15b0: 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61 72 79   int p1 = binary
15c0: 43 6f 6d 70 61 72 65 50 31 28 70 4c 65 66 74 2c  CompareP1(pLeft,
15d0: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
15e0: 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  ull);.  CollSeq 
15f0: 2a 70 33 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70  *p3 = binaryComp
1600: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
1610: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
1620: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1630: 74 65 33 56 64 62 65 4f 70 33 28 70 50 61 72 73  te3VdbeOp3(pPars
1640: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
1650: 2c 20 70 31 2c 20 64 65 73 74 2c 20 28 76 6f 69  , p1, dest, (voi
1660: 64 2a 29 70 33 2c 20 50 33 5f 43 4f 4c 4c 53 45  d*)p3, P3_COLLSE
1670: 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  Q);.}../*.** Con
1680: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
1690: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
16a0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
16b0: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
16c0: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
16d0: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
16e0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
16f0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
1700: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
1710: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
1720: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
1730: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
1740: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78  ets freed..*/.Ex
1750: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
1760: 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c  int op, Expr *pL
1770: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
1780: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
1790: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
17a0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
17b0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
17c0: 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  xpr) );.  if( pN
17d0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ew==0 ){.    /* 
17e0: 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  When malloc fail
17f0: 73 2c 20 77 65 20 6c 65 61 6b 20 6d 65 6d 6f 72  s, we leak memor
1800: 79 20 66 72 6f 6d 20 70 4c 65 66 74 20 61 6e 64  y from pLeft and
1810: 20 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 72   pRight */.    r
1820: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1830: 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20  New->op = op;.  
1840: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  pNew->pLeft = pL
1850: 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  eft;.  pNew->pRi
1860: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
1870: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
1880: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
1890: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ->dyn==0 );.    
18a0: 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65  pNew->span = pNe
18b0: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
18c0: 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  en;.  }else if( 
18d0: 70 4c 65 66 74 20 26 26 20 70 52 69 67 68 74 20  pLeft && pRight 
18e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
18f0: 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c  prSpan(pNew, &pL
1900: 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67  eft->span, &pRig
1910: 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d 0a 20  ht->span);.  }. 
1920: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1930: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e  ./*.** When doin
1940: 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65  g a nested parse
1950: 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64  , you can includ
1960: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78  e terms in an ex
1970: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74  pression.** that
1980: 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a   look like this:
1990: 20 20 20 23 30 20 23 31 20 23 32 20 2e 2e 2e 20     #0 #1 #2 ... 
19a0: 20 54 68 65 73 65 20 74 65 72 6d 73 20 72 65 66   These terms ref
19b0: 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73 0a 2a  er to elements.*
19c0: 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  * on the stack. 
19d0: 20 22 23 30 22 20 28 6f 72 20 6a 75 73 74 20 22   "#0" (or just "
19e0: 23 22 29 20 6d 65 61 6e 73 20 74 68 65 20 74 6f  #") means the to
19f0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
1a00: 2a 2a 20 22 23 31 22 20 6d 65 61 6e 73 20 74 68  ** "#1" means th
1a10: 65 20 6e 65 78 74 20 64 6f 77 6e 20 6f 6e 20 74  e next down on t
1a20: 68 65 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 73  he stack.  And s
1a30: 6f 20 66 6f 72 74 68 2e 20 20 23 2d 31 20 6d 65  o forth.  #-1 me
1a40: 61 6e 73 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f  ans.** memory lo
1a50: 63 61 74 69 6f 6e 20 30 2e 20 20 23 2d 32 20 6d  cation 0.  #-2 m
1a60: 65 61 6e 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  eans memory loca
1a70: 74 69 6f 6e 20 31 2e 20 20 41 6e 64 20 73 6f 20  tion 1.  And so 
1a80: 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  forth..**.** Thi
1a90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1aa0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1ab0: 72 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6f  r to deal with o
1ac0: 6e 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  n of those terms
1ad0: 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61 74  ..** It immediat
1ae0: 65 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ely generates co
1af0: 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
1b00: 76 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72  value in a memor
1b10: 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54  y location..** T
1b20: 68 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78  he returns an ex
1b30: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 69  pression that wi
1b40: 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  ll code to extra
1b50: 63 74 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ct the value fro
1b60: 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79  m.** that memory
1b70: 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65 65   location as nee
1b80: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ded..*/.Expr *sq
1b90: 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70  lite3RegisterExp
1ba0: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1bb0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1bc0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1bd0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78  rse->pVdbe;.  Ex
1be0: 70 72 20 2a 70 3b 0a 20 20 69 6e 74 20 64 65 70  pr *p;.  int dep
1bf0: 74 68 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  th;.  if( v==0 )
1c00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1c10: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
1c20: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1c30: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1c40: 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20  , "near \"%T\": 
1c50: 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 70  syntax error", p
1c60: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  Token);.    retu
1c70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  rn 0;.  }.  p = 
1c80: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52  sqlite3Expr(TK_R
1c90: 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20 70  EGISTER, 0, 0, p
1ca0: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 3d  Token);.  if( p=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1cc0: 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66   0;  /* Malloc f
1cd0: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 64  ailed */.  }.  d
1ce0: 65 70 74 68 20 3d 20 61 74 6f 69 28 26 70 54 6f  epth = atoi(&pTo
1cf0: 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 69 66  ken->z[1]);.  if
1d00: 28 20 64 65 70 74 68 3e 3d 30 20 29 7b 0a 20 20  ( depth>=0 ){.  
1d10: 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50    p->iTable = pP
1d20: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
1d30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d40: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64 65  Op(v, OP_Dup, de
1d50: 70 74 68 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  pth, 0);.    sql
1d60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1d70: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d   OP_MemStore, p-
1d80: 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 7d  >iTable, 1);.  }
1d90: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69 54 61  else{.    p->iTa
1da0: 62 6c 65 20 3d 20 2d 31 2d 64 65 70 74 68 3b 0a  ble = -1-depth;.
1db0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
1dc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
1dd0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
1de0: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
1df0: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
1e00: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
1e10: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
1e20: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
1e30: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  r expression..*/
1e40: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
1e50: 70 72 41 6e 64 28 45 78 70 72 20 2a 70 4c 65 66  prAnd(Expr *pLef
1e60: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
1e70: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
1e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1e90: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
1ea0: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
1eb0: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
1ec0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1ed0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
1ee0: 72 28 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c  r(TK_AND, pLeft,
1ef0: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d   pRight, 0);.  }
1f00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1f10: 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c  e Expr.span fiel
1f20: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
1f30: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
1f40: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
1f50: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
1f60: 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ven tokens..*/.v
1f70: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
1f80: 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c  pan(Expr *pExpr,
1f90: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
1fa0: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20  oken *pRight){. 
1fb0: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21   assert( pRight!
1fc0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1fd0: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66  pLeft!=0 );.  if
1fe0: 28 20 21 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ( !sqlite3_mallo
1ff0: 63 5f 66 61 69 6c 65 64 20 26 26 20 70 52 69 67  c_failed && pRig
2000: 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e  ht->z && pLeft->
2010: 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  z ){.    assert(
2020: 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c   pLeft->dyn==0 |
2030: 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74  | pLeft->z[pLeft
2040: 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ->n]==0 );.    i
2050: 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30  f( pLeft->dyn==0
2060: 20 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d   && pRight->dyn=
2070: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
2080: 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66  r->span.z = pLef
2090: 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70  t->z;.      pExp
20a0: 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67  r->span.n = pRig
20b0: 68 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 52 69  ht->n + Addr(pRi
20c0: 67 68 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70  ght->z) - Addr(p
20d0: 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Left->z);.    }e
20e0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72  lse{.      pExpr
20f0: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20  ->span.z = 0;.  
2100: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2110: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
2120: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
2130: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
2140: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
2150: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
2160: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
2170: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73  Function(ExprLis
2180: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
2190: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
21a0: 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d   *pNew;.  pNew =
21b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
21c0: 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20  izeof(Expr) );. 
21d0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
21e0: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78      /* sqlite3Ex
21f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
2200: 73 74 29 3b 20 2f 2f 20 4c 65 61 6b 20 70 4c 69  st); // Leak pLi
2210: 73 74 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66  st when malloc f
2220: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ails */.    retu
2230: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  rn 0;.  }.  pNew
2240: 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49  ->op = TK_FUNCTI
2250: 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73  ON;.  pNew->pLis
2260: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 69 66 28  t = pList;.  if(
2270: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61   pToken ){.    a
2280: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64  ssert( pToken->d
2290: 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65  yn==0 );.    pNe
22a0: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
22b0: 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  en;.  }else{.   
22c0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d   pNew->token.z =
22d0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
22e0: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
22f0: 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  en;.  return pNe
2300: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
2310: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
2320: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
2330: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
2340: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
2350: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
2360: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
2370: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
2380: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
2390: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
23a0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
23b0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
23c0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
23d0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
23e0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
23f0: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
2400: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
2410: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
2420: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
2430: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
2440: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
2450: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
2460: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
2470: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
2480: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
2490: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
24a0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
24b0: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
24c0: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
24d0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
24e0: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
24f0: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
2500: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
2510: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
2520: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
2530: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
2540: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
2550: 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61   sequenial varia
2560: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
2570: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
2580: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
2590: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
25a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
25b0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f 6b  r *pExpr){.  Tok
25c0: 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 69 66  en *pToken;.  if
25d0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
25e0: 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d 20  urn;.  pToken = 
25f0: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20  &pExpr->token;. 
2600: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
2610: 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  >n>=1 );.  asser
2620: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
2630: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  );.  assert( pTo
2640: 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  ken->z[0]!=0 );.
2650: 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d    if( pToken->n=
2660: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =1 ){.    /* Wil
2670: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
2680: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
2690: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
26a0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 70   number */.    p
26b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b  Expr->iTable = +
26c0: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20  +pParse->nVar;. 
26d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b 65   }else if( pToke
26e0: 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  n->z[0]=='?' ){.
26f0: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
2700: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
2710: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
2720: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
2730: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65 20   and.    ** use 
2740: 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61 62  it as the variab
2750: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
2760: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78 70   int i;.    pExp
2770: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d 20  r->iTable = i = 
2780: 61 74 6f 69 28 26 70 54 6f 6b 65 6e 2d 3e 7a 5b  atoi(&pToken->z[
2790: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31  1]);.    if( i<1
27a0: 20 7c 7c 20 69 3e 53 51 4c 49 54 45 5f 4d 41 58   || i>SQLITE_MAX
27b0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
27c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
27e0: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
27f0: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
2800: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
2810: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2820: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
2830: 4d 42 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20  MBER);.    }.   
2840: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
2850: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Var ){.      pPa
2860: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20  rse->nVar = i;. 
2870: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2880: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f    /* Wildcards o
2890: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
28a0: 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65  " or "$aaa".  Re
28b0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
28c0: 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  iable.    ** num
28d0: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
28e0: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
28f0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
2900: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
2910: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
2920: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
2930: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
2940: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
2950: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20    */.    int i, 
2960: 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65  n;.    n = pToke
2970: 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  n->n;.    for(i=
2980: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61  0; i<pParse->nVa
2990: 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  rExpr; i++){.   
29a0: 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
29b0: 20 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61     if( (pE = pPa
29c0: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69  rse->apVarExpr[i
29d0: 5d 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ])!=0.          
29e0: 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d  && pE->token.n==
29f0: 6e 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d  n.          && m
2a00: 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e  emcmp(pE->token.
2a10: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29  z, pToken->z, n)
2a20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2a30: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
2a40: 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  E->iTable;.     
2a50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2a70: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  i>=pParse->nVarE
2a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78  xpr ){.      pEx
2a90: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70  pr->iTable = ++p
2aa0: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20  Parse->nVar;.   
2ab0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
2ac0: 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d  VarExpr>=pParse-
2ad0: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31  >nVarExprAlloc-1
2ae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
2af0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
2b00: 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  c += pParse->nVa
2b10: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b  rExprAlloc + 10;
2b20: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
2b30: 3e 61 70 56 61 72 45 78 70 72 20 3d 20 73 71 6c  >apVarExpr = sql
2b40: 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61 72 73  iteRealloc(pPars
2b50: 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20  e->apVarExpr,.  
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
2b80: 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f  rExprAlloc*sizeo
2b90: 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  f(pParse->apVarE
2ba0: 78 70 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20  xpr[0]) );.     
2bb0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 71   }.      if( !sq
2bc0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
2bd0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  led ){.        a
2be0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
2bf0: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
2c00: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
2c10: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
2c20: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
2c30: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
2c40: 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a    }.  } .}../*.*
2c50: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
2c60: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
2c70: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  on tree..*/.void
2c80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
2c90: 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  te(Expr *p){.  i
2ca0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
2cb0: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e  ;.  if( p->span.
2cc0: 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65  dyn ) sqliteFree
2cd0: 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e  ((char*)p->span.
2ce0: 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b  z);.  if( p->tok
2cf0: 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46  en.dyn ) sqliteF
2d00: 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f  ree((char*)p->to
2d10: 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65  ken.z);.  sqlite
2d20: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
2d30: 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Left);.  sqlite3
2d40: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 52  ExprDelete(p->pR
2d50: 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ight);.  sqlite3
2d60: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2d70: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  ->pList);.  sqli
2d80: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
2d90: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  p->pSelect);.  s
2da0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
2db0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2dc0: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
2dd0: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
2de0: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
2df0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
2e00: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
2e10: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
2e20: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
2e30: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
2e40: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
2e50: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
2e60: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
2e70: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
2e80: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
2e90: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
2ea0: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
2eb0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
2ec0: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
2ed0: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
2ee0: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
2ef0: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
2f00: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
2f10: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
2f20: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
2f30: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
2f40: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
2f50: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
2f60: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
2f70: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
2f80: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
2f90: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
2fa0: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
2fb0: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
2fc0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
2fd0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 45 78 70  lite3ExprDup(Exp
2fe0: 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70  r *p){.  Expr *p
2ff0: 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  New;.  if( p==0 
3000: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3010: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
3020: 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 29  cRaw( sizeof(*p)
3030: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
3040: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3050: 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c 20  memcpy(pNew, p, 
3060: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
3070: 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a    if( p->token.z
3080: 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  !=0 ){.    pNew-
3090: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 73 71 6c 69 74  >token.z = sqlit
30a0: 65 53 74 72 44 75 70 28 70 2d 3e 74 6f 6b 65 6e  eStrDup(p->token
30b0: 2e 7a 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  .z);.    pNew->t
30c0: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20  oken.dyn = 1;.  
30d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
30e0: 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a  t( pNew->token.z
30f0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  ==0 );.  }.  pNe
3100: 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20  w->span.z = 0;. 
3110: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
3120: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d  qlite3ExprDup(p-
3130: 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d  >pLeft);.  pNew-
3140: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
3150: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 52 69 67  3ExprDup(p->pRig
3160: 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ht);.  pNew->pLi
3170: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
3180: 4c 69 73 74 44 75 70 28 70 2d 3e 70 4c 69 73 74  ListDup(p->pList
3190: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65  );.  pNew->pSele
31a0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
31b0: 63 74 44 75 70 28 70 2d 3e 70 53 65 6c 65 63 74  ctDup(p->pSelect
31c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
31d0: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
31e0: 54 6f 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20  TokenCopy(Token 
31f0: 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72  *pTo, Token *pFr
3200: 6f 6d 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e  om){.  if( pTo->
3210: 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65  dyn ) sqliteFree
3220: 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b  ((char*)pTo->z);
3230: 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20  .  if( pFrom->z 
3240: 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20  ){.    pTo->n = 
3250: 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54  pFrom->n;.    pT
3260: 6f 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72  o->z = sqliteStr
3270: 4e 44 75 70 28 70 46 72 6f 6d 2d 3e 7a 2c 20 70  NDup(pFrom->z, p
3280: 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54  From->n);.    pT
3290: 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65  o->dyn = 1;.  }e
32a0: 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20  lse{.    pTo->z 
32b0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c  = 0;.  }.}.ExprL
32c0: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
32d0: 4c 69 73 74 44 75 70 28 45 78 70 72 4c 69 73 74  ListDup(ExprList
32e0: 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74   *p){.  ExprList
32f0: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
3300: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
3310: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
3320: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
3330: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
3340: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
3350: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
3360: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
3370: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
3380: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70   0;.  pNew->nExp
3390: 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  r = pNew->nAlloc
33a0: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70   = p->nExpr;.  p
33b0: 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d  New->a = pItem =
33c0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
33d0: 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70  ->nExpr*sizeof(p
33e0: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
33f0: 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20   pItem==0 ){.   
3400: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77   sqliteFree(pNew
3410: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
3420: 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d  .  } .  pOldItem
3430: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
3440: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
3450: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
3460: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
3470: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a  xpr *pNewExpr, *
3480: 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49  pOldExpr;.    pI
3490: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65  tem->pExpr = pNe
34a0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  wExpr = sqlite3E
34b0: 78 70 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20  xprDup(pOldExpr 
34c0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70  = pOldItem->pExp
34d0: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  r);.    if( pOld
34e0: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  Expr->span.z!=0 
34f0: 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20  && pNewExpr ){. 
3500: 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d       /* Always m
3510: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
3520: 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c  e span for top-l
3530: 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73  evel expressions
3540: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
3550: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
3560: 2e 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20  .  The logic in 
3570: 53 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e  SELECT processin
3580: 67 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  g that determine
3590: 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  s.      ** the n
35a0: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  ames of columns 
35b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
35c0: 74 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66  t needs this inf
35d0: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
35e0: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
35f0: 70 79 28 26 70 4e 65 77 45 78 70 72 2d 3e 73 70  py(&pNewExpr->sp
3600: 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73  an, &pOldExpr->s
3610: 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pan);.    }.    
3620: 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72  assert( pNewExpr
3630: 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d  ==0 || pNewExpr-
3640: 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20  >span.z!=0 .    
3650: 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45          || pOldE
3660: 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c  xpr->span.z==0 |
3670: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
3680: 5f 66 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  _failed );.    p
3690: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
36a0: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
36b0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
36c0: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
36d0: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f  r = pOldItem->so
36e0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74  rtOrder;.    pIt
36f0: 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70 4f 6c 64  em->isAgg = pOld
3700: 49 74 65 6d 2d 3e 69 73 41 67 67 3b 0a 20 20 20  Item->isAgg;.   
3710: 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30   pItem->done = 0
3720: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3730: 4e 65 77 3b 0a 7d 0a 53 72 63 4c 69 73 74 20 2a  New;.}.SrcList *
3740: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
3750: 70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  p(SrcList *p){. 
3760: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
3770: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
3780: 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  Byte;.  if( p==0
3790: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
37a0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
37b0: 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f  ) + (p->nSrc>0 ?
37c0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
37d0: 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a   * (p->nSrc-1) :
37e0: 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71   0);.  pNew = sq
37f0: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
3800: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
3810: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
3820: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
3830: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
3840: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
3850: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
3860: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
3870: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
3880: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
3890: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
38a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
38b0: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
38c0: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
38d0: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
38e0: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
38f0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
3900: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
3910: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
3920: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  Dup(pOldItem->zN
3930: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
3940: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
3950: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
3960: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
3970: 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pNewItem->joint
3980: 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ype = pOldItem->
3990: 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e  jointype;.    pN
39a0: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
39b0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
39c0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
39d0: 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  m->pTab = 0;.   
39e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65   pNewItem->pSele
39f0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
3a00: 63 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  ctDup(pOldItem->
3a10: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e  pSelect);.    pN
3a20: 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71  ewItem->pOn = sq
3a30: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4f 6c  lite3ExprDup(pOl
3a40: 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20  dItem->pOn);.   
3a50: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e   pNewItem->pUsin
3a60: 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  g = sqlite3IdLis
3a70: 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70  tDup(pOldItem->p
3a80: 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65  Using);.  }.  re
3a90: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
3aa0: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
3ab0: 73 74 44 75 70 28 49 64 4c 69 73 74 20 2a 70 29  stDup(IdList *p)
3ac0: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
3ad0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
3ae0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
3af0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
3b00: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
3b10: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
3b20: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
3b30: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
3b40: 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  Id = pNew->nAllo
3b50: 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  c = p->nId;.  pN
3b60: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61  ew->a = sqliteMa
3b70: 6c 6c 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a  llocRaw( p->nId*
3b80: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
3b90: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
3ba0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3bb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
3bc0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
3bd0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
3be0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
3bf0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
3c00: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
3c10: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
3c20: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
3c30: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
3c40: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
3c50: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
3c60: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
3c70: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
3c80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3c90: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
3ca0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 53 65  ite3SelectDup(Se
3cb0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65  lect *p){.  Sele
3cc0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  ct *pNew;.  if( 
3cd0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3ce0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3cf0: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
3d00: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
3d10: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
3d20: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73  0;.  pNew->isDis
3d30: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
3d40: 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  tinct;.  pNew->p
3d50: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
3d60: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 45  xprListDup(p->pE
3d70: 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  List);.  pNew->p
3d80: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
3d90: 4c 69 73 74 44 75 70 28 70 2d 3e 70 53 72 63 29  ListDup(p->pSrc)
3da0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
3db0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
3dc0: 70 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  p(p->pWhere);.  
3dd0: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
3de0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3df0: 44 75 70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  Dup(p->pGroupBy)
3e00: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
3e10: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
3e20: 75 70 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  up(p->pHaving);.
3e30: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
3e40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
3e50: 73 74 44 75 70 28 70 2d 3e 70 4f 72 64 65 72 42  stDup(p->pOrderB
3e60: 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  y);.  pNew->op =
3e70: 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e   p->op;.  pNew->
3e80: 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33  pPrior = sqlite3
3e90: 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 50 72  SelectDup(p->pPr
3ea0: 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  ior);.  pNew->nL
3eb0: 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74  imit = p->nLimit
3ec0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65  ;.  pNew->nOffse
3ed0: 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t = p->nOffset;.
3ee0: 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 65 63 74 20    pNew->zSelect 
3ef0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  = 0;.  pNew->iLi
3f00: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  mit = -1;.  pNew
3f10: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
3f20: 20 20 70 4e 65 77 2d 3e 70 70 4f 70 65 6e 54 65    pNew->ppOpenTe
3f30: 6d 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  mp = 0;.  return
3f40: 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   pNew;.}.../*.**
3f50: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
3f60: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
3f70: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
3f80: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
3f90: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
3fa0: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
3fb0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
3fc0: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c  n list..*/.ExprL
3fd0: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
3fe0: 4c 69 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c  ListAppend(ExprL
3ff0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72  ist *pList, Expr
4000: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
4010: 70 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c  pName){.  if( pL
4020: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
4030: 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
4040: 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  oc( sizeof(ExprL
4050: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
4060: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
4070: 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72    /* sqlite3Expr
4080: 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f  Delete(pExpr); /
4090: 2f 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66  / Leak memory if
40a0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
40b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
40c0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
40d0: 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  t( pList->nAlloc
40e0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ==0 );.  }.  if(
40f0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d   pList->nAlloc<=
4100: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  pList->nExpr ){.
4110: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
4120: 63 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  c = pList->nAllo
4130: 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 70 4c 69  c*2 + 4;.    pLi
4140: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65  st->a = sqliteRe
4150: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
4160: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69  pList->nAlloc*si
4170: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
4180: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
4190: 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t->a==0 ){.     
41a0: 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44   /* sqlite3ExprD
41b0: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f  elete(pExpr); //
41c0: 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20   Leak memory if 
41d0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
41e0: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78        pList->nEx
41f0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  pr = pList->nAll
4200: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  oc = 0;.      re
4210: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20  turn pList;.    
4220: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
4230: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
4240: 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e   if( pExpr || pN
4250: 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ame ){.    struc
4260: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
4270: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
4280: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
4290: 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  +];.    memset(p
42a0: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
42b0: 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49  *pItem));.    pI
42c0: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
42d0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  pr;.    pItem->z
42e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
42f0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
4300: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4310: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
4320: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
4330: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
4340: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
4350: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
4360: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
4370: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
4380: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
4390: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
43a0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
43b0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
43c0: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c  ist->a!=0 || (pL
43d0: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26  ist->nExpr==0 &&
43e0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d   pList->nAlloc==
43f0: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
4400: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c  pList->nExpr<=pL
4410: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20  ist->nAlloc );. 
4420: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
4430: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
4440: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
4450: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
4460: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
4470: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
4480: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
4490: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
44a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
44b0: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
44c0: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
44d0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
44e0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
44f0: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
4500: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
4510: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
4520: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
4530: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
4540: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
4550: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
4560: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
4570: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
4580: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
4590: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
45a0: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
45b0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
45c0: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
45d0: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
45e0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
45f0: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
4600: 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  {.  switch( p->o
4610: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
4620: 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _ID:.    case TK
4630: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
4640: 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61  e TK_DOT:.    ca
4650: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
4660: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
4670: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
4680: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
4690: 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
46a0: 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65  K_BLOB:.    case
46b0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
46c0: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
46d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
46e0: 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  ABLE:.    case T
46f0: 4b 5f 43 54 49 4d 45 3a 0a 20 20 20 20 63 61 73  K_CTIME:.    cas
4700: 65 20 54 4b 5f 43 54 49 4d 45 53 54 41 4d 50 3a  e TK_CTIMESTAMP:
4710: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 44 41  .    case TK_CDA
4720: 54 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  TE:.      return
4730: 20 31 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   1;.    default:
4740: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
4750: 70 4c 65 66 74 20 26 26 20 21 73 71 6c 69 74 65  pLeft && !sqlite
4760: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
4770: 70 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  p->pLeft) ) retu
4780: 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 0;.      if( 
4790: 70 2d 3e 70 52 69 67 68 74 20 26 26 20 21 73 71  p->pRight && !sq
47a0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
47b0: 61 6e 74 28 70 2d 3e 70 52 69 67 68 74 29 20 29  ant(p->pRight) )
47c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
47d0: 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b   if( p->pList ){
47e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
47f0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
4800: 20 69 3c 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78   i<p->pList->nEx
4810: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
4820: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
4830: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
4840: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
4850: 78 70 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  xpr) ) return 0;
4860: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4870: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
4880: 70 2d 3e 70 4c 65 66 74 21 3d 30 20 7c 7c 20 70  p->pLeft!=0 || p
4890: 2d 3e 70 52 69 67 68 74 21 3d 30 20 7c 7c 20 28  ->pRight!=0 || (
48a0: 70 2d 3e 70 4c 69 73 74 20 26 26 20 70 2d 3e 70  p->pList && p->p
48b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 3b 0a  List->nExpr>0);.
48c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
48d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
48e0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
48f0: 65 73 73 69 6f 6e 20 63 6f 64 65 73 20 61 20 63  ession codes a c
4900: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
4910: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
4920: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
4930: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
4940: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
4950: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
4960: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
4970: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
4980: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
4990: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
49a0: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
49b0: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
49c0: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
49d0: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
49e0: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
49f0: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
4a00: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4a10: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
4a20: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
4a30: 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  ue){.  switch( p
4a40: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
4a50: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
4a60: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4a70: 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b 65  GetInt32(p->toke
4a80: 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a  n.z, pValue) ){.
4a90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
4aa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4ab0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4ac0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
4ad0: 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75   {.      const u
4ae0: 38 20 2a 7a 20 3d 20 28 75 38 2a 29 70 2d 3e 74  8 *z = (u8*)p->t
4af0: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
4b00: 74 20 6e 20 3d 20 70 2d 3e 74 6f 6b 65 6e 2e 6e  t n = p->token.n
4b10: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20  ;.      if( n>0 
4b20: 26 26 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20  && z[0]=='-' ){ 
4b30: 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20  z++; n--; }.    
4b40: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
4b50: 2a 7a 20 26 26 20 69 73 64 69 67 69 74 28 2a 7a  *z && isdigit(*z
4b60: 29 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d  ) ){ z++; n--; }
4b70: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
4b80: 26 26 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  && sqlite3GetInt
4b90: 33 32 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  32(p->token.z, p
4ba0: 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20  Value) ){.      
4bb0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4bc0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4be0: 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
4bf0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4c00: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
4c10: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
4c20: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4c30: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
4c40: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
4c50: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
4c60: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
4c70: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
4c80: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
4c90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
4ca0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4cb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4cc0: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
4cd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4ce0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4cf0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
4d00: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
4d10: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
4d20: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
4d30: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
4d40: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
4d50: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
4d60: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
4d70: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
4d80: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
4d90: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
4da0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
4db0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
4dc0: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
4dd0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
4de0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n 0;.}../*.** Gi
4df0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
4e00: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  a column of the 
4e10: 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  form X.Y.Z or Y.
4e20: 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f  Z or just Z, loo
4e30: 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d  k up.** that nam
4e40: 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e in the set of 
4e50: 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e  source tables in
4e60: 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61   pSrcList and ma
4e70: 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a  ke the pExpr .**
4e80: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
4e90: 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74   refer back to t
4ea0: 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d  hat source colum
4eb0: 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  n.  The followin
4ec0: 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  g changes.** are
4ed0: 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a   made to pExpr:.
4ee0: 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  **.**    pExpr->
4ef0: 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65  iDb           Se
4f00: 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64  t the index in d
4f10: 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20  b->aDb[] of the 
4f20: 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  database holding
4f30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
4f50: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78  table..**    pEx
4f60: 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20  pr->iTable      
4f70: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
4f80: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
4f90: 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65  he table obtaine
4fa0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f               fro
4fc0: 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20  m pSrcList..**  
4fd0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
4fe0: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68         Set to th
4ff0: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
5000: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
5010: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f  ..**    pExpr->o
5020: 70 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  p            Set
5030: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a   to TK_COLUMN..*
5040: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  *    pExpr->pLef
5050: 74 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78  t         Any ex
5060: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f  pression this po
5070: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74  ints to is delet
5080: 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  ed.**    pExpr->
5090: 70 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e  pRight        An
50a0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69  y expression thi
50b0: 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64  s points to is d
50c0: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
50d0: 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68  e pDbToken is th
50e0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
50f0: 74 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29  tabase (the "X")
5100: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
5110: 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61  y be.** NULL mea
5120: 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69  ning that name i
5130: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e  s of the form Y.
5140: 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61  Z or Z.  Any ava
5150: 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a  ilable database.
5160: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20  ** can be used. 
5170: 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e   The pTableToken
5180: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
5190: 74 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22  the table (the "
51a0: 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61  Y").  This.** va
51b0: 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  lue can be NULL 
51c0: 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61  if pDbToken is a
51d0: 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54  lso NULL.  If pT
51e0: 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  ableToken is NUL
51f0: 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  L it.** means th
5200: 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74  at the form of t
5210: 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64  he name is Z and
5220: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72   that columns fr
5230: 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20  om any table.** 
5240: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  can be used..**.
5250: 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63  ** If the name c
5260: 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65  annot be resolve
5270: 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c  d unambiguously,
5280: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
5290: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
52a0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
52b0: 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72  non-zero.  Retur
52c0: 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n zero on succes
52d0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
52e0: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50   lookupName(.  P
52f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5300: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
5310: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
5320: 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20  oken *pDbToken, 
5330: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
5340: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
5350: 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72  aining table, or
5360: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
5370: 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20   *pTableToken,  
5380: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
5390: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75   containing colu
53a0: 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  mn, or NULL */. 
53b0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54   Token *pColumnT
53c0: 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66  oken, /* Name of
53d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a   the column. */.
53e0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
53f0: 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ist,   /* List o
5400: 66 20 74 61 62 6c 65 73 20 75 73 65 64 20 74 6f  f tables used to
5410: 20 72 65 73 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20   resolve column 
5420: 6e 61 6d 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  names */.  ExprL
5430: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
5440: 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65  /* List of expre
5450: 73 73 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 72  ssions used to r
5460: 65 73 6f 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20  esolve "AS" */. 
5470: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
5480: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68        /* Make th
5490: 69 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69  is EXPR node poi
54a0: 6e 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74  nt to the select
54b0: 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a  ed column */.){.
54c0: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b    char *zDb = 0;
54d0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
54e0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
54f0: 20 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e   The "X" in X.Y.
5500: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61  Z */.  char *zTa
5510: 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  b = 0;      /* N
5520: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5530: 2e 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e  .  The "Y" in X.
5540: 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20  Y.Z or Y.Z */.  
5550: 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20  char *zCol = 0; 
5560: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
5570: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  the column.  The
5580: 20 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c   "Z" */.  int i,
5590: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
55a0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
55b0: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  */.  int cnt = 0
55c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
55d0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
55e0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
55f0: 20 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30    int cntTab = 0
5600: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
5610: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62   of matching tab
5620: 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71  le names */.  sq
5630: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5640: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
5650: 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61  database */..  a
5660: 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f  ssert( pColumnTo
5670: 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f  ken && pColumnTo
5680: 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65  ken->z ); /* The
5690: 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e   Z in X.Y.Z cann
56a0: 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ot be NULL */.  
56b0: 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  zDb = sqlite3Nam
56c0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62 54 6f  eFromToken(pDbTo
56d0: 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20 73  ken);.  zTab = s
56e0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
56f0: 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65 6e 29  ken(pTableToken)
5700: 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  ;.  zCol = sqlit
5710: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5720: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20  pColumnToken);. 
5730: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
5740: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20  loc_failed ){.  
5750: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
5760: 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 28 7a 44 62  Leak memory (zDb
5770: 20 61 6e 64 20 7a 54 61 62 29 20 69 66 20 6d 61   and zTab) if ma
5780: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
5790: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62  }.  assert( zTab
57a0: 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30  ==0 || pEList==0
57b0: 20 29 3b 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54   );..  pExpr->iT
57c0: 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 66 6f 72  able = -1;.  for
57d0: 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
57e0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
57f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
5800: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
5810: 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pSrcList->a[i];.
5820: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
5830: 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
5840: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b     Column *pCol;
5850: 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ..    if( pTab==
5860: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
5870: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
5880: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 69 66  nCol>0 );.    if
5890: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
58a0: 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
58b0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  s ){.        cha
58c0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49  r *zTabName = pI
58d0: 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  tem->zAlias;.   
58e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
58f0: 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65  StrICmp(zTabName
5900: 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e  , zTab)!=0 ) con
5910: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  tinue;.      }el
5920: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  se{.        char
5930: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61   *zTabName = pTa
5940: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
5950: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
5960: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  0 || sqlite3StrI
5970: 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54  Cmp(zTabName, zT
5980: 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ab)!=0 ) continu
5990: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  e;.        if( z
59a0: 44 62 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  Db!=0 && sqlite3
59b0: 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b  StrICmp(db->aDb[
59c0: 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  pTab->iDb].zName
59d0: 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  , zDb)!=0 ){.   
59e0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
59f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5a00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5a10: 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29   0==(cntTab++) )
5a20: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  {.      pExpr->i
5a30: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
5a40: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 70 45  Cursor;.      pE
5a50: 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d  xpr->iDb = pTab-
5a60: 3e 69 44 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >iDb;.    }.    
5a70: 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(j=0, pCol=pT
5a80: 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62  ab->aCol; j<pTab
5a90: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f  ->nCol; j++, pCo
5aa0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
5ab0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
5ac0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
5ad0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5ae0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
5af0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
5b00: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
5b10: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
5b20: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
5b30: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69         /* Substi
5b40: 74 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28  tute the rowid (
5b50: 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74  column -1) for t
5b60: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
5b70: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20  RY KEY */.      
5b80: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
5b90: 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65   = j==pTab->iPKe
5ba0: 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20  y ? -1 : j;.    
5bb0: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
5bc0: 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ity = pTab->aCol
5bd0: 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  [j].affinity;.  
5be0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f        pExpr->pCo
5bf0: 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
5c00: 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].pColl;.      
5c10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5c20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
5c30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5c40: 54 52 49 47 47 45 52 0a 20 20 2f 2a 20 49 66 20  TRIGGER.  /* If 
5c50: 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65  we have not alre
5c60: 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65  ady resolved the
5c70: 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62   name, then mayb
5c80: 65 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 61 20  e .  ** it is a 
5c90: 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74  new.* or old.* t
5ca0: 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20  rigger argument 
5cb0: 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2f 0a 20  reference.  */. 
5cc0: 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a   if( zDb==0 && z
5cd0: 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30  Tab!=0 && cnt==0
5ce0: 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67   && pParse->trig
5cf0: 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20  Stack!=0 ){.    
5d00: 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54  TriggerStack *pT
5d10: 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50  riggerStack = pP
5d20: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b  arse->trigStack;
5d30: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
5d40: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54   = 0;.    if( pT
5d50: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77  riggerStack->new
5d60: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
5d70: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e 65 77  ite3StrICmp("new
5d80: 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b  ", zTab) == 0 ){
5d90: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
5da0: 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53  able = pTriggerS
5db0: 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20  tack->newIdx;.  
5dc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
5dd0: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20  ggerStack->pTab 
5de0: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
5df0: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
5e00: 54 61 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Tab;.    }else i
5e10: 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  f( pTriggerStack
5e20: 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26  ->oldIdx != -1 &
5e30: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
5e40: 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29 20 3d 3d  ("old", zTab) ==
5e50: 20 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70   0 ){.      pExp
5e60: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
5e70: 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64  ggerStack->oldId
5e80: 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  x;.      assert(
5e90: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
5ea0: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 70 54  pTab );.      pT
5eb0: 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  ab = pTriggerSta
5ec0: 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d 0a  ck->pTab;.    }.
5ed0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
5ee0: 20 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20   .      int j;. 
5ef0: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f       Column *pCo
5f00: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a  l = pTab->aCol;.
5f10: 20 20 20 20 20 20 0a 20 20 20 20 20 20 70 45 78        .      pEx
5f20: 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e  pr->iDb = pTab->
5f30: 69 44 62 3b 0a 20 20 20 20 20 20 63 6e 74 54 61  iDb;.      cntTa
5f40: 62 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  b++;.      for(j
5f50: 3d 30 3b 20 6a 20 3c 20 70 54 61 62 2d 3e 6e 43  =0; j < pTab->nC
5f60: 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; j++, pCol++)
5f70: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   {.        if( s
5f80: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
5f90: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ol->zName, zCol)
5fa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
5fb0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
5fc0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
5fd0: 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65   = j==pTab->iPKe
5fe0: 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20  y ? -1 : j;.    
5ff0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
6000: 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43  inity = pTab->aC
6010: 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  ol[j].affinity;.
6020: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6030: 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61  >pColl = pTab->a
6040: 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20  Col[j].pColl;.  
6050: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6060: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6070: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
6080: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
6090: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
60a0: 52 29 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  R) */..  /*.  **
60b0: 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d   Perhaps the nam
60c0: 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  e is a reference
60d0: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20   to the ROWID.  
60e0: 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  */.  if( cnt==0 
60f0: 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20  && cntTab==1 && 
6100: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
6110: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 6e 74 20  Col) ){.    cnt 
6120: 3d 20 31 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  = 1;.    pExpr->
6130: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
6140: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
6150: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y = SQLITE_AFF_I
6160: 4e 54 45 47 45 52 3b 0a 20 20 7d 0a 0a 20 20 2f  NTEGER;.  }..  /
6170: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e  *.  ** If the in
6180: 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  put is of the fo
6190: 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72  rm Z (not Y.Z or
61a0: 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65   X.Y.Z) then the
61b0: 20 6e 61 6d 65 20 5a 0a 20 20 2a 2a 20 6d 69 67   name Z.  ** mig
61c0: 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72  ht refer to an r
61d0: 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e  esult-set alias.
61e0: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
61f0: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
6200: 6e 0a 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65  n.  ** we are re
6210: 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e  solving names in
6220: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
6230: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
6240: 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 2a 2a  ng command:.  **
6250: 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
6260: 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74   a+b AS x FROM t
6270: 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b  able WHERE x<10;
6280: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61  .  **.  ** In ca
6290: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72  ses like this, r
62a0: 65 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74  eplace pExpr wit
62b0: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
62c0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a  expression that.
62d0: 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72    ** forms the r
62e0: 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20  esult set entry 
62f0: 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78  ("a+b" in the ex
6300: 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72  ample) and retur
6310: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  n immediately.. 
6320: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
6330: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
6340: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73  the result set s
6350: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
6360: 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20 72 65 73  dy been.  ** res
6370: 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d  olved by the tim
6380: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
6390: 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a  se is resolved..
63a0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d    */.  if( cnt==
63b0: 30 20 26 26 20 70 45 4c 69 73 74 21 3d 30 20 29  0 && pEList!=0 )
63c0: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
63d0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
63e0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  j++){.      char
63f0: 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e   *zAs = pEList->
6400: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
6410: 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20    if( zAs!=0 && 
6420: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
6430: 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  As, zCol)==0 ){.
6440: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6450: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
6460: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
6470: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
6480: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53  Expr->op = TK_AS
6490: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
64a0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  >iColumn = j;.  
64b0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
64c0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
64d0: 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  Dup(pEList->a[j]
64e0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
64f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
6500: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
6510: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
6520: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
6530: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6540: 7d 0a 20 20 20 20 7d 20 0a 20 20 7d 0a 0a 20 20  }.    } .  }..  
6550: 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64  /*.  ** If X and
6560: 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20   Y are NULL (in 
6570: 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f  other words if o
6580: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
6590: 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75  ame Z is.  ** su
65a0: 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20  pplied) and the 
65b0: 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e  value of Z is en
65c0: 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65  closed in double
65d0: 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20  -quotes, then.  
65e0: 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67  ** Z is a string
65f0: 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20 64   literal if it d
6600: 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79  oesn't match any
6610: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
6620: 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73  In that.  ** cas
6630: 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  e, we need to re
6640: 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 20  turn right away 
6650: 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79  and not make any
6660: 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a   changes to.  **
6670: 20 70 45 78 70 72 2e 0a 20 20 2a 2f 0a 20 20 69   pExpr..  */.  i
6680: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61  f( cnt==0 && zTa
6690: 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54  b==0 && pColumnT
66a0: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20  oken->z[0]=='"' 
66b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
66c0: 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74  e(zCol);.    ret
66d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
66e0: 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61  .  ** cnt==0 mea
66f0: 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74  ns there was not
6700: 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d   match.  cnt>1 m
6710: 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20  eans there were 
6720: 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65  two or.  ** more
6730: 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65   matches.  Eithe
6740: 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61  r way, we have a
6750: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
6760: 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20  if( cnt!=1 ){.  
6770: 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
6780: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20     char *zErr;. 
6790: 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30     zErr = cnt==0
67a0: 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75   ? "no such colu
67b0: 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67  mn: %s" : "ambig
67c0: 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uous column name
67d0: 3a 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a  : %s";.    if( z
67e0: 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Db ){.      sqli
67f0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  te3SetString(&z,
6800: 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c   zDb, ".", zTab,
6810: 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a   ".", zCol, 0);.
6820: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54      }else if( zT
6830: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
6840: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  te3SetString(&z,
6850: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
6860: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
6870: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
6880: 65 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20  eStrDup(zCol);. 
6890: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
68a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
68b0: 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73   zErr, z);.    s
68c0: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
68d0: 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
68e0: 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f   and return.  */
68f0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44  .  sqliteFree(zD
6900: 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
6910: 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65  (zTab);.  sqlite
6920: 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 73 71  Free(zCol);.  sq
6930: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6940: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
6950: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
6960: 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
6970: 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52  Delete(pExpr->pR
6980: 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  ight);.  pExpr->
6990: 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45  pRight = 0;.  pE
69a0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
69b0: 55 4d 4e 3b 0a 20 20 73 71 6c 69 74 65 33 41 75  UMN;.  sqlite3Au
69c0: 74 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70  thRead(pParse, p
69d0: 45 78 70 72 2c 20 70 53 72 63 4c 69 73 74 29 3b  Expr, pSrcList);
69e0: 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 21 3d 31  .  return cnt!=1
69f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6a00: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e  routine walks an
6a10: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6a20: 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65   and resolves re
6a30: 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74  ferences to.** t
6a40: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e  able columns.  N
6a50: 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  odes of the form
6a60: 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73   ID.ID or ID res
6a70: 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20  olve into an.** 
6a80: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62  index to the tab
6a90: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
6aa0: 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d  list and a colum
6ab0: 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a  n offset.  The .
6ac0: 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66  ** Expr.opcode f
6ad0: 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73  or such nodes is
6ae0: 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43   changed to TK_C
6af0: 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72  OLUMN.  The Expr
6b00: 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65  .iTable.** value
6b10: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74   is changed to t
6b20: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
6b30: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
6b40: 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20   in pTabList.** 
6b50: 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20  plus the "base" 
6b60: 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65  value.  The base
6b70: 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69   value will ulti
6b80: 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68  mately become th
6b90: 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72  e.** VDBE cursor
6ba0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75   number for a cu
6bb0: 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69  rsor that is poi
6bc0: 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72  nting into the r
6bd0: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62  eferenced.** tab
6be0: 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  le.  The Expr.iC
6bf0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63  olumn value is c
6c00: 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e  hanged to the in
6c10: 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
6c20: 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66  n .** of the ref
6c30: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20  erenced table.  
6c40: 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  The Expr.iColumn
6c50: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
6c60: 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20  pecial.** ROWID 
6c70: 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41  column is -1.  A
6c80: 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ny INTEGER PRIMA
6c90: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73  RY KEY column is
6ca0: 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20   tried as an.** 
6cb0: 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e  alias for ROWID.
6cc0: 0a 2a 2a 0a 2a 2a 20 57 65 20 61 6c 73 6f 20 63  .**.** We also c
6cd0: 68 65 63 6b 20 66 6f 72 20 69 6e 73 74 61 6e 63  heck for instanc
6ce0: 65 73 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  es of the IN ope
6cf0: 72 61 74 6f 72 2e 20 20 49 4e 20 63 6f 6d 65 73  rator.  IN comes
6d00: 20 69 6e 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73   in two.** forms
6d10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
6d20: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
6d30: 69 73 74 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20  ist).** and.**  
6d40: 20 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e           expr IN
6d50: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
6d60: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f  .** The first fo
6d70: 72 6d 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79  rm is handled by
6d80: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
6d90: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74  holding the list
6da0: 0a 2a 2a 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76  .** of allowed v
6db0: 61 6c 75 65 73 2e 20 20 54 68 65 20 73 65 63 6f  alues.  The seco
6dc0: 6e 64 20 66 6f 72 6d 20 63 61 75 73 65 73 20 74  nd form causes t
6dd0: 68 65 20 53 45 4c 45 43 54 20 74 6f 20 67 65 6e  he SELECT to gen
6de0: 65 72 61 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70  erate .** a temp
6df0: 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a  orary table..**.
6e00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6e10: 61 6c 73 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20 73  also looks for s
6e20: 63 61 6c 61 72 20 53 45 4c 45 43 54 73 20 74 68  calar SELECTs th
6e30: 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 61  at are part of a
6e40: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
6e50: 20 49 66 20 69 74 20 66 69 6e 64 73 20 61 6e 79   If it finds any
6e60: 2c 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 63  , it generates c
6e70: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
6e80: 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73   value of that s
6e90: 65 6c 65 63 74 0a 2a 2a 20 69 6e 74 6f 20 61 20  elect.** into a 
6ea0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a  memory cell..**.
6eb0: 2a 2a 20 55 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d  ** Unknown colum
6ec0: 6e 73 20 6f 72 20 74 61 62 6c 65 73 20 70 72 6f  ns or tables pro
6ed0: 76 6f 6b 65 20 61 6e 20 65 72 72 6f 72 2e 20 20  voke an error.  
6ee0: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  The function ret
6ef0: 75 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  urns.** the numb
6f00: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
6f10: 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 61 6e 20  n and leaves an 
6f20: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e  error message on
6f30: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
6f40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6f50: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 0a  ExprResolveIds(.
6f60: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6f70: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
6f80: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
6f90: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
6fa0: 74 2c 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  t, /* List of ta
6fb0: 62 6c 65 73 20 75 73 65 64 20 74 6f 20 72 65 73  bles used to res
6fc0: 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  olve column name
6fd0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
6fe0: 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  *pEList,  /* Lis
6ff0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
7000: 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65   used to resolve
7010: 20 22 41 53 22 20 2a 2f 0a 20 20 45 78 70 72 20   "AS" */.  Expr 
7020: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 2f 2a  *pExpr        /*
7030: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
7040: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20  to be analyzed. 
7050: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
7060: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
7070: 7c 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  | pSrcList==0 ) 
7080: 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
7090: 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
70a0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
70b0: 20 61 73 73 65 72 74 28 20 70 53 72 63 4c 69 73   assert( pSrcLis
70c0: 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e  t->a[i].iCursor>
70d0: 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e  =0 && pSrcList->
70e0: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61  a[i].iCursor<pPa
70f0: 72 73 65 2d 3e 6e 54 61 62 20 29 3b 0a 20 20 7d  rse->nTab );.  }
7100: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
7110: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ->op ){.    /* D
7120: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
7130: 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22 29  ings (ex: "abc")
7140: 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64 65   are used as ide
7150: 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20 20  ntifiers if.    
7160: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74  ** possible.  Ot
7170: 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65 6d  herwise they rem
7180: 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e 20  ain as strings. 
7190: 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20   Single-quoted. 
71a0: 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28 65     ** strings (e
71b0: 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61 6c  x: 'abc') are al
71c0: 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74 65  ways string lite
71d0: 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rals..    */.   
71e0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
71f0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
7200: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d  pr->token.z[0]==
7210: 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  '\'' ) break;.  
7220: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
7230: 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44 20   into the TK_ID 
7240: 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73 20  case if this is 
7250: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
7260: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a  string */.    }.
7270: 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64      /* A lone id
7280: 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20  entifier is the 
7290: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
72a0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
72b0: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
72c0: 20 20 69 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65    if( lookupName
72d0: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26  (pParse, 0, 0, &
72e0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 53  pExpr->token, pS
72f0: 72 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  rcList, pEList, 
7300: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
7310: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
7320: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7330: 20 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f   .    }.  .    /
7340: 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  * A table name a
7350: 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  nd column name: 
7360: 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a      ID.ID.    **
7370: 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c 20   Or a database, 
7380: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
7390: 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20  :  ID.ID.ID.    
73a0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  */.    case TK_D
73b0: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65  OT: {.      Toke
73c0: 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  n *pColumn;.    
73d0: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b    Token *pTable;
73e0: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44  .      Token *pD
73f0: 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  b;.      Expr *p
7400: 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 70 52  Right;..      pR
7410: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
7420: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
7430: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  pRight->op==TK_I
7440: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  D ){.        pDb
7450: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54   = 0;.        pT
7460: 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70  able = &pExpr->p
7470: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
7480: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26       pColumn = &
7490: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  pRight->token;. 
74a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
74b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
74c0: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  ht->op==TK_DOT )
74d0: 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  ;.        pDb = 
74e0: 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74  &pExpr->pLeft->t
74f0: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  oken;.        pT
7500: 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e  able = &pRight->
7510: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
7520: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
7530: 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d  &pRight->pRight-
7540: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a  >token;.      }.
7550: 20 20 20 20 20 20 69 66 28 20 6c 6f 6f 6b 75 70        if( lookup
7560: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62  Name(pParse, pDb
7570: 2c 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d  , pTable, pColum
7580: 6e 2c 20 70 53 72 63 4c 69 73 74 2c 20 30 2c 20  n, pSrcList, 0, 
7590: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
75a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
75b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
75c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
75d0: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
75e0: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
75f0: 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73       Vdbe *v = s
7600: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
7610: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 4b 65 79  arse);.      Key
7620: 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20  Info keyInfo;.  
7630: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
7640: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
7650: 6f 66 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69  of OP_OpenTemp i
7660: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
7670: 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20       if( v==0 ) 
7680: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
7690: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
76a0: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
76b0: 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69  , pSrcList, pELi
76c0: 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  st, pExpr->pLeft
76d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
76e0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
76f0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
7700: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
7710: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
7720: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
7730: 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
7740: 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
7750: 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
7760: 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
7770: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
7780: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
7790: 20 73 61 6d 65 20 77 61 79 2e 20 41 20 74 65 6d   same way. A tem
77a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 73 20  porary table is 
77b0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
77c0: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
77d0: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
77e0: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
77f0: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
7800: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
7810: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
7820: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
7830: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
7840: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
7850: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
7860: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
7870: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
7880: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
7890: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
78a0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
78b0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
78c0: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
78d0: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
78e0: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
78f0: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
7900: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
7910: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
7920: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
7930: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
7940: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
7950: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
7960: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
7970: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
7980: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
7990: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
79a0: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
79b0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
79c0: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
79d0: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
79e0: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
79f0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
7a00: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
7a10: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
7a20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7a30: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
7a40: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
7a50: 20 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65   0);.      memse
7a60: 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73  t(&keyInfo, 0, s
7a70: 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b  izeof(keyInfo));
7a80: 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e  .      keyInfo.n
7a90: 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Field = 1;.     
7aa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7ab0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
7ac0: 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54  lumns, pExpr->iT
7ad0: 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20  able, 1);..     
7ae0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
7af0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
7b00: 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
7b10: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
7b20: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
7b30: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
7b40: 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
7b50: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
7b60: 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
7b70: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
7b80: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
7b90: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
7ba0: 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
7bb0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
7bc0: 20 69 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e   iParm = pExpr->
7bd0: 69 54 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74  iTable +  (((int
7be0: 29 61 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b  )affinity)<<16);
7bf0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
7c00: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t *pEList;.     
7c10: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
7c20: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
7c30: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
7c40: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
7c50: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
7c60: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
7c70: 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69  lect, SRT_Set, i
7c80: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Parm, 0, 0, 0, 0
7c90: 29 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73  );.        pELis
7ca0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  t = pExpr->pSele
7cb0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
7cc0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
7cd0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
7ce0: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
7cf0: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
7d00: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
7d10: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
7d20: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69              pELi
7d40: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
7d50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7d60: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
7d70: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
7d80: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
7d90: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
7da0: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
7db0: 09 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70  .** For each exp
7dc0: 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
7dd0: 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
7de0: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
7df0: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
7e00: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
7e10: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
7e20: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
7e30: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
7e40: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
7e50: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
7e60: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
7e70: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
7e80: 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
7e90: 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
7ea0: 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
7eb0: 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
7ec0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
7ed0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
7ee0: 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
7ef0: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
7f00: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
7f10: 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  C;.        }.   
7f20: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
7f30: 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70  ll[0] = pExpr->p
7f40: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20  Left->pColl;..  
7f50: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
7f60: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
7f70: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
7f80: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
7f90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72  for(i=0; i<pExpr
7fa0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  ->pList->nExpr; 
7fb0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
7fc0: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70  Expr *pE2 = pExp
7fd0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
7fe0: 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  Expr;..         
7ff0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
8000: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
8010: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 76 61   constant and va
8020: 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lid. */.        
8030: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
8040: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
8050: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
8060: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8070: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
8080: 20 20 20 20 20 20 20 22 72 69 67 68 74 2d 68 61         "right-ha
8090: 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 6f 70  nd side of IN op
80a0: 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 63  erator must be c
80b0: 6f 6e 73 74 61 6e 74 22 29 3b 0a 20 20 20 20 20  onstant");.     
80c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
80d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
80e0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
80f0: 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  e3ExprCheck(pPar
8100: 73 65 2c 20 70 45 32 2c 20 30 2c 20 30 29 20 29  se, pE2, 0, 0) )
8110: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
8120: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
8130: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
8140: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
8150: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
8160: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
8170: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
8180: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8190: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
81a0: 20 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20   pE2);.         
81b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
81c0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
81d0: 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 1, 0, &affinit
81e0: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 1);.         
81f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8200: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
8210: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
8220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8230: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
8240: 65 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ey, pExpr->iTabl
8250: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 0);.        }
8260: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
8270: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8280: 50 33 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P3(v, addr, (voi
8290: 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33  d *)&keyInfo, P3
82a0: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20  _KEYINFO);..    
82b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
82c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
82d0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
82e0: 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
82f0: 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
8300: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
8310: 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
8320: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
8330: 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
8340: 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
8350: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
8360: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
8370: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
8380: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
8390: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
83a0: 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  umn = pParse->nM
83b0: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 73  em++;.      if(s
83c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
83d0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c  rse, pExpr->pSel
83e0: 65 63 74 2c 20 53 52 54 5f 4d 65 6d 2c 70 45 78  ect, SRT_Mem,pEx
83f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 30 2c 30 2c  pr->iColumn,0,0,
8400: 30 2c 30 29 29 7b 0a 20 20 20 20 20 20 20 20 72  0,0)){.        r
8410: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
8420: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8430: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
8440: 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20 72  all else, just r
8450: 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20  ecursively walk 
8460: 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 20 20  the tree */.    
8470: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
8480: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
8490: 74 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  t.      && sqlit
84a0: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  e3ExprResolveIds
84b0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 4c 69 73  (pParse, pSrcLis
84c0: 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72  t, pEList, pExpr
84d0: 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  ->pLeft) ){.    
84e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
84f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8500: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 0a 20  pExpr->pRight . 
8510: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
8520: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
8530: 61 72 73 65 2c 20 70 53 72 63 4c 69 73 74 2c 20  arse, pSrcList, 
8540: 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70  pEList, pExpr->p
8550: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
8560: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
8570: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
8580: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
8590: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
85a0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
85b0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
85c0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
85d0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
85e0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
85f0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 72 67        Expr *pArg
8600: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
8610: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
8620: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
8630: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
8640: 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69  , pSrcList, pELi
8650: 73 74 2c 20 70 41 72 67 29 20 29 7b 0a 20 20 20  st, pArg) ){.   
8660: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
8670: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
8680: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
86a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
86b0: 70 45 78 70 72 20 69 73 20 61 20 6e 6f 64 65 20  pExpr is a node 
86c0: 74 68 61 74 20 64 65 66 69 6e 65 73 20 61 20 66  that defines a f
86d0: 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f 6d 65 20  unction of some 
86e0: 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67 68 74 0a  kind.  It might.
86f0: 2a 2a 20 62 65 20 61 20 73 79 6e 74 61 63 74 69  ** be a syntacti
8700: 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65 20  c function like 
8710: 22 63 6f 75 6e 74 28 78 29 22 20 6f 72 20 69 74  "count(x)" or it
8720: 20 6d 69 67 68 74 20 62 65 20 61 20 66 75 6e 63   might be a func
8730: 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 69 6d 70  tion.** that imp
8740: 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70 65 72 61  lements an opera
8750: 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20 4c 49 4b  tor, like "a LIK
8760: 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  E b".  .**.** Th
8770: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
8780: 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e 74 20 74   *pzName point t
8790: 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  o the name of th
87a0: 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 0a  e function and .
87b0: 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f 6c 64 20  ** *pnName hold 
87c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
87d0: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
87e0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 0a 2a  function name..*
87f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
8800: 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 45 78  tFunctionName(Ex
8810: 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74  pr *pExpr, const
8820: 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d 65 2c 20   char **pzName, 
8830: 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b 0a 20 20  int *pnName){.  
8840: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
8850: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
8860: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
8870: 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 70 45 78     *pzName = pEx
8880: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
8890: 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 70 45 78     *pnName = pEx
88a0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
88b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
88c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45      case TK_LIKE
88d0: 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d  : {.      *pzNam
88e0: 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20 20 20 20  e = "like";.    
88f0: 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20    *pnName = 4;. 
8900: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8910: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c  }.    case TK_GL
8920: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  OB: {.      *pzN
8930: 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b 0a 20 20  ame = "glob";.  
8940: 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b      *pnName = 4;
8950: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8960: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8970: 43 54 49 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  CTIME: {.      *
8980: 70 7a 4e 61 6d 65 20 3d 20 22 63 75 72 72 65 6e  pzName = "curren
8990: 74 5f 74 69 6d 65 22 3b 0a 20 20 20 20 20 20 2a  t_time";.      *
89a0: 70 6e 4e 61 6d 65 20 3d 20 31 32 3b 0a 20 20 20  pnName = 12;.   
89b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
89c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 44 41 54      case TK_CDAT
89d0: 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61  E: {.      *pzNa
89e0: 6d 65 20 3d 20 22 63 75 72 72 65 6e 74 5f 64 61  me = "current_da
89f0: 74 65 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61  te";.      *pnNa
8a00: 6d 65 20 3d 20 31 32 3b 0a 20 20 20 20 20 20 62  me = 12;.      b
8a10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8a20: 63 61 73 65 20 54 4b 5f 43 54 49 4d 45 53 54 41  case TK_CTIMESTA
8a30: 4d 50 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  MP: {.      *pzN
8a40: 61 6d 65 20 3d 20 22 63 75 72 72 65 6e 74 5f 74  ame = "current_t
8a50: 69 6d 65 73 74 61 6d 70 22 3b 0a 20 20 20 20 20  imestamp";.     
8a60: 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 37 3b 0a 20   *pnName = 17;. 
8a70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8a80: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
8a90: 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d  .      *pzName =
8aa0: 20 22 63 61 6e 27 74 20 68 61 70 70 65 6e 22 3b   "can't happen";
8ab0: 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d  .      *pnName =
8ac0: 20 31 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   12;.      break
8ad0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
8ae0: 2a 0a 2a 2a 20 45 72 72 6f 72 20 63 68 65 63 6b  *.** Error check
8af0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 69   the functions i
8b00: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n an expression.
8b10: 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 0a    Make sure all.
8b20: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ** function name
8b30: 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64  s are recognized
8b40: 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f   and all functio
8b50: 6e 73 20 68 61 76 65 20 74 68 65 20 63 6f 72 72  ns have the corr
8b60: 65 63 74 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  ect.** number of
8b70: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61   arguments.  Lea
8b80: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
8b90: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
8ba0: 45 72 72 4d 73 67 0a 2a 2a 20 69 66 20 61 6e 79  ErrMsg.** if any
8bb0: 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20  thing is amiss. 
8bc0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
8bd0: 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
8be0: 0a 2a 2a 20 69 66 20 70 49 73 41 67 67 20 69 73  .** if pIsAgg is
8bf0: 20 6e 6f 74 20 6e 75 6c 6c 20 61 6e 64 20 74 68   not null and th
8c00: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
8c10: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75   an aggregate fu
8c20: 6e 63 74 69 6f 6e 0a 2a 2a 20 28 6c 69 6b 65 20  nction.** (like 
8c30: 63 6f 75 6e 74 28 2a 29 20 6f 72 20 6d 61 78 28  count(*) or max(
8c40: 76 61 6c 75 65 29 29 20 74 68 65 6e 20 77 72 69  value)) then wri
8c50: 74 65 20 61 20 31 20 69 6e 74 6f 20 2a 70 49 73  te a 1 into *pIs
8c60: 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Agg..*/.int sqli
8c70: 74 65 33 45 78 70 72 43 68 65 63 6b 28 50 61 72  te3ExprCheck(Par
8c80: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
8c90: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 61 6c 6c   *pExpr, int all
8ca0: 6f 77 41 67 67 2c 20 69 6e 74 20 2a 70 49 73 41  owAgg, int *pIsA
8cb0: 67 67 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20  gg){.  int nErr 
8cc0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  = 0;.  if( pExpr
8cd0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8ce0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
8cf0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
8d00: 54 4b 5f 43 54 49 4d 45 3a 0a 20 20 20 20 63 61  TK_CTIME:.    ca
8d10: 73 65 20 54 4b 5f 43 54 49 4d 45 53 54 41 4d 50  se TK_CTIMESTAMP
8d20: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 44  :.    case TK_CD
8d30: 41 54 45 3a 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  ATE:.    /* Note
8d40: 3a 20 54 68 65 20 61 62 6f 76 65 20 74 68 72 65  : The above thre
8d50: 65 20 77 65 72 65 20 61 20 73 65 70 65 72 61 74  e were a seperat
8d60: 65 20 63 61 73 65 20 69 6e 20 73 71 6c 6d 6f 74  e case in sqlmot
8d70: 6f 2e 20 52 65 61 73 6f 6e 3f 20 2a 2f 0a 20 20  o. Reason? */.  
8d80: 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a    case TK_GLOB:.
8d90: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45      case TK_LIKE
8da0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
8db0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
8dc0: 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70  int n = pExpr->p
8dd0: 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c  List ? pExpr->pL
8de0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20  ist->nExpr : 0; 
8df0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8e00: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
8e10: 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e   int no_such_fun
8e20: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  c = 0;       /* 
8e30: 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20  True if no such 
8e40: 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20  function exists 
8e50: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f  */.      int wro
8e60: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b  ng_num_args = 0;
8e70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
8e80: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
8e90: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
8ea0: 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20     int is_agg = 
8eb0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
8ec0: 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e 20  * True if is an 
8ed0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
8ee0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
8ef0: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  i;.      int nId
8f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8f10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8f20: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
8f30: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
8f40: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
8f50: 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20  r *zId;         
8f60: 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
8f70: 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  on name. */.    
8f80: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
8f90: 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d  .      int enc =
8fa0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63   pParse->db->enc
8fb0: 3b 0a 0a 20 20 20 20 20 20 67 65 74 46 75 6e 63  ;..      getFunc
8fc0: 74 69 6f 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20  tionName(pExpr, 
8fd0: 26 7a 49 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20  &zId, &nId);.   
8fe0: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
8ff0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
9000: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
9010: 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a  Id, n, enc, 0);.
9020: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
9030: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
9040: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
9050: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
9060: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31  db, zId, nId, -1
9070: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
9080: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
9090: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73  {.          no_s
90a0: 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20  uch_func = 1;.  
90b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
90c0: 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d         wrong_num
90d0: 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20  _args = 1;.     
90e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
90f0: 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  {.        is_agg
9100: 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d   = pDef->xFunc==
9110: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
9120: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21   if( is_agg && !
9130: 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20  allowAgg ){.    
9140: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9150: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
9160: 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
9170: 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29   function %.*s()
9180: 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20  ", nId, zId);.  
9190: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
91a0: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30        is_agg = 0
91b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
91c0: 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29  ( no_such_func )
91d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
91e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
91f0: 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  , "no such funct
9200: 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c  ion: %.*s", nId,
9210: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 6e   zId);.        n
9220: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  Err++;.      }el
9230: 73 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d  se if( wrong_num
9240: 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20  _args ){.       
9250: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9260: 28 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e  (pParse,"wrong n
9270: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
9280: 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25  ts to function %
9290: 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20  .*s()",.        
92a0: 20 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a       nId, zId);.
92b0: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
92c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
92d0: 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20  ( is_agg ){.    
92e0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
92f0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b  TK_AGG_FUNCTION;
9300: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 73  .        if( pIs
9310: 41 67 67 20 29 20 2a 70 49 73 41 67 67 20 3d 20  Agg ) *pIsAgg = 
9320: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
9330: 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d   for(i=0; nErr==
9340: 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  0 && i<n; i++){.
9350: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
9360: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28  qlite3ExprCheck(
9370: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9380: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
9390: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 61 6c 6c 6f 77 41 67 67 20 26 26 20 21 69 73   allowAgg && !is
93c0: 5f 61 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20  _agg, pIsAgg);. 
93d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
93e0: 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65  FIX ME:  Compute
93f0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
9400: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65 78   based on the ex
9410: 70 65 63 74 65 64 20 72 65 74 75 72 6e 0a 20 20  pected return.  
9420: 20 20 20 20 2a 2a 20 74 79 70 65 20 6f 66 20 74      ** type of t
9430: 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20  he function .   
9440: 20 20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20     */.    }.    
9450: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
9460: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
9470: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72  t ){.        nEr
9480: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
9490: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78  heck(pParse, pEx
94a0: 70 72 2d 3e 70 4c 65 66 74 2c 20 61 6c 6c 6f 77  pr->pLeft, allow
94b0: 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20  Agg, pIsAgg);.  
94c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
94d0: 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72  nErr==0 && pExpr
94e0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
94f0: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
9500: 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  e3ExprCheck(pPar
9510: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
9520: 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73  t, allowAgg, pIs
9530: 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Agg);.      }.  
9540: 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20      if( nErr==0 
9550: 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20  && pExpr->pList 
9560: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
9570: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
9580: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
9590: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
95a0: 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20  or(i=0; nErr==0 
95b0: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
95c0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
95d0: 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  2 = pExpr->pList
95e0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
95f0: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
9600: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28  qlite3ExprCheck(
9610: 70 50 61 72 73 65 2c 20 70 45 32 2c 20 61 6c 6c  pParse, pE2, all
9620: 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a  owAgg, pIsAgg);.
9630: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9640: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9650: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9660: 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nErr;.}../*.**
9670: 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
9680: 72 52 65 73 6f 6c 76 65 49 64 73 28 29 20 66 6f  rResolveIds() fo
9690: 6c 6c 6f 77 65 64 20 62 79 20 73 71 6c 69 74 65  llowed by sqlite
96a0: 33 45 78 70 72 43 68 65 63 6b 28 29 2e 0a 2a 2a  3ExprCheck()..**
96b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
96c0: 20 69 73 20 70 72 6f 76 69 64 65 64 20 61 73 20   is provided as 
96d0: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 73 69  a convenience si
96e0: 6e 63 65 20 69 74 20 69 73 20 76 65 72 79 20 63  nce it is very c
96f0: 6f 6d 6d 6f 6e 0a 2a 2a 20 74 6f 20 63 61 6c 6c  ommon.** to call
9700: 20 52 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e   ResolveIds() an
9710: 64 20 43 68 65 63 6b 28 29 20 62 61 63 6b 20 74  d Check() back t
9720: 6f 20 62 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  o back..*/.int s
9730: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
9740: 65 41 6e 64 43 68 65 63 6b 28 0a 20 20 50 61 72  eAndCheck(.  Par
9750: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9760: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
9770: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
9780: 73 74 20 2a 70 53 72 63 4c 69 73 74 2c 20 2f 2a  st *pSrcList, /*
9790: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
97a0: 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20  used to resolve 
97b0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
97c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
97d0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
97e0: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 65 64  expressions used
97f0: 20 74 6f 20 72 65 73 6f 6c 76 65 20 22 41 53 22   to resolve "AS"
9800: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
9810: 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r,       /* The 
9820: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
9830: 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 20 20   analyzed. */.  
9840: 69 6e 74 20 61 6c 6c 6f 77 41 67 67 2c 20 20 20  int allowAgg,   
9850: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 61 6c     /* True to al
9860: 6c 6f 77 20 61 67 67 72 65 67 61 74 65 20 65 78  low aggregate ex
9870: 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69  pressions */.  i
9880: 6e 74 20 2a 70 49 73 41 67 67 20 20 20 20 20 20  nt *pIsAgg      
9890: 20 20 2f 2a 20 53 65 74 20 74 6f 20 54 52 55 45    /* Set to TRUE
98a0: 20 69 66 20 61 67 67 72 65 67 61 74 65 73 20 61   if aggregates a
98b0: 72 65 20 66 6f 75 6e 64 20 2a 2f 0a 29 7b 0a 20  re found */.){. 
98c0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
98d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
98e0: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
98f0: 76 65 49 64 73 28 70 50 61 72 73 65 2c 70 53 72  veIds(pParse,pSr
9900: 63 4c 69 73 74 2c 70 45 4c 69 73 74 2c 70 45 78  cList,pEList,pEx
9910: 70 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  pr) ){.    retur
9920: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
9930: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  n sqlite3ExprChe
9940: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ck(pParse, pExpr
9950: 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41  , allowAgg, pIsA
9960: 67 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  gg);.}../*.** Ge
9970: 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
9980: 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
9990: 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  put the integer 
99a0: 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74  describe by.** t
99b0: 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e  ext z[0..n-1] on
99c0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73   the stack..*/.s
99d0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
99e0: 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20  nteger(Vdbe *v, 
99f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
9a00: 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nt n){.  int i;.
9a10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74    if( sqlite3Get
9a20: 49 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a  Int32(z, &i) ){.
9a30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9a40: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
9a50: 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c  er, i, 0);.  }el
9a60: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  se if( sqlite3Fi
9a70: 74 73 49 6e 36 34 42 69 74 73 28 7a 29 20 29 7b  tsIn64Bits(z) ){
9a80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9a90: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op3(v, OP_Intege
9aa0: 72 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a  r, 0, 0, z, n);.
9ab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
9ac0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
9ad0: 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c  P_Real, 0, 0, z,
9ae0: 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   n);.  }.}../*.*
9af0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
9b00: 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
9b10: 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
9b20: 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
9b30: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65  xpression and le
9b40: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ave the result o
9b50: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61  n the top of sta
9b60: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ck..**.** This c
9b70: 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
9b80: 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
9b90: 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
9ba0: 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
9bb0: 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
9bc0: 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
9bd0: 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
9be0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
9bf0: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
9c00: 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
9c10: 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
9c20: 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
9c30: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
9c40: 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
9c50: 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
9c60: 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
9c70: 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
9c80: 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
9c90: 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
9ca0: 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
9cb0: 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
9cc0: 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
9cd0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
9ce0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
9cf0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62  r *pExpr){.  Vdb
9d00: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
9d10: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a  Vdbe;.  int op;.
9d20: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
9d30: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
9d40: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
9d50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9d60: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
9d70: 3b 20 20 2f 2a 20 45 6d 70 74 79 20 65 78 70 72  ;  /* Empty expr
9d80: 65 73 73 69 6f 6e 20 65 76 61 6c 73 20 74 6f 20  ession evals to 
9d90: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 72 65 74 75  NULL */.    retu
9da0: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70  rn;.  }.  op = p
9db0: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
9dc0: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
9dd0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
9de0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
9df0: 2d 3e 75 73 65 41 67 67 20 29 7b 0a 20 20 20 20  ->useAgg ){.    
9e00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9e10: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65  ddOp(v, OP_AggGe
9e20: 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67  t, 0, pExpr->iAg
9e30: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
9e40: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
9e50: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
9e60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9e70: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
9e80: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70  pExpr->iTable, p
9e90: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
9ea0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
9eb0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
9ec0: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 45 78 70  ->span.z && pExp
9ed0: 72 2d 3e 73 70 61 6e 2e 6e 3e 30 20 26 26 20 70  r->span.n>0 && p
9ee0: 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 3c 31 30 30  Expr->span.n<100
9ef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 56 64   ){.          Vd
9f00: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
9f10: 20 25 54 22 2c 20 26 70 45 78 70 72 2d 3e 73 70   %T", &pExpr->sp
9f20: 61 6e 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  an));.        }.
9f30: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
9f40: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
9f50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9f60: 4f 50 5f 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d  OP_Recno, pExpr-
9f70: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
9f80: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
9f90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9fa0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
9fb0: 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
9fc0: 28 76 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  (v, pExpr->token
9fd0: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
9fe0: 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .n);.      break
9ff0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a000: 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
a010: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
a020: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
a030: 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65 61 6c  K_FLOAT==OP_Real
a040: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a050: 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f 50 5f  ( TK_STRING==OP_
a060: 53 74 72 69 6e 67 38 20 29 3b 0a 20 20 20 20 20  String8 );.     
a070: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
a080: 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45 78  v, op, 0, 0, pEx
a090: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
a0a0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
a0b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
a0c0: 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b  equoteP3(v, -1);
a0d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a0e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a0f0: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 61 73  BLOB: {.      as
a100: 73 65 72 74 28 20 54 4b 5f 42 4c 4f 42 3d 3d 4f  sert( TK_BLOB==O
a110: 50 5f 48 65 78 42 6c 6f 62 20 29 3b 0a 20 20 20  P_HexBlob );.   
a120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
a130: 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70  3(v, op, 0, 0, p
a140: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c  Expr->token.z+1,
a150: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d   pExpr->token.n-
a160: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
a170: 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76  3VdbeDequoteP3(v
a180: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , -1);.      bre
a190: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a1a0: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
a1b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a1c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
a1d0: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
a1e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a1f0: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
a200: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
a210: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a220: 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
a230: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
a240: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
a250: 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20  >token.n>1 ){.  
a260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a270: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
a280: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
a290: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
a2a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a2b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a2c0: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
a2d0: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
a2e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a2f0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72  P_MemLoad, pExpr
a300: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
a310: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a320: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
a330: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
a340: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
a350: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
a360: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
a370: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
a380: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
a390: 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
a3a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
a3b0: 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
a3c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
a3d0: 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
a3e0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
a3f0: 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
a400: 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
a410: 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
a420: 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
a430: 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  _Ne );.      sql
a440: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
a450: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
a460: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
a470: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
a480: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
a490: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
a4a0: 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
a4b0: 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
a4c0: 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c 20  >pRight, op, 0, 
a4d0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
a4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a4f0: 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
a500: 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
a510: 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
a520: 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
a530: 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
a540: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
a550: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
a560: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
a570: 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
a580: 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
a590: 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
a5a0: 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
a5b0: 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  : .    case TK_C
a5c0: 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  ONCAT: {.      a
a5d0: 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f  ssert( TK_AND==O
a5e0: 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  P_And );.      a
a5f0: 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
a600: 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Or );.      ass
a610: 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
a620: 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _Add );.      as
a630: 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d  sert( TK_MINUS==
a640: 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20  OP_Subtract );. 
a650: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
a660: 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
a670: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
a680: 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
a690: 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20  _BitAnd );.     
a6a0: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
a6b0: 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20  R==OP_BitOr );. 
a6c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
a6d0: 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
a6e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a6f0: 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
a700: 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20  ShiftLeft );.   
a710: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
a720: 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
a730: 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ght );.      ass
a740: 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
a750: 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20  OP_Concat );.   
a760: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a770: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
a780: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
a790: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a7a0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a7b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71  Right);.      sq
a7c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a7d0: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
a7e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a7f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
a800: 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  US: {.      Expr
a810: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
a820: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73  >pLeft;.      as
a830: 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
a840: 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
a850: 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20  op==TK_FLOAT || 
a860: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
a870: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
a880: 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65   Token *p = &pLe
a890: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
a8a0: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c     char *z = sql
a8b0: 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 20  iteMalloc( p->n 
a8c0: 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 2 );.        s
a8d0: 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a 73  printf(z, "-%.*s
a8e0: 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a  ", p->n, p->z);.
a8f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66          if( pLef
a900: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
a910: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
a920: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
a930: 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c  P_Real, 0, 0, z,
a940: 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20   p->n+1);.      
a950: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a960: 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76     codeInteger(v
a970: 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20  , z, p->n+1);.  
a980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a990: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
a9a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a9b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
a9c0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
a9d0: 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d   TK_NOT */.    }
a9e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
a9f0: 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
aa00: 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
aa10: 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
aa20: 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20  =OP_BitNot );.  
aa30: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
aa40: 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20  OT==OP_Not );.  
aa50: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
aa60: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
aa70: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
aa80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
aa90: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
aaa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aab0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
aac0: 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
aad0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
aae0: 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20 20      int dest;.  
aaf0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
ab00: 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
ab10: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ab20: 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
ab30: 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  _NotNull );.    
ab40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ab50: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
ab60: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
ab70: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
ab80: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
ab90: 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74  eft);.      dest
aba0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
abb0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32  rrentAddr(v) + 2
abc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
abd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
abe0: 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
abf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ac00: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d  (v, OP_AddImm, -
ac10: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
ac20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ac30: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
ac40: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ON: {.      sqli
ac50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ac60: 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 45  OP_AggGet, 0, pE
ac70: 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20  xpr->iAgg);.    
ac80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ac90: 20 20 20 63 61 73 65 20 54 4b 5f 43 44 41 54 45     case TK_CDATE
aca0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 54  :.    case TK_CT
acb0: 49 4d 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IME:.    case TK
acc0: 5f 43 54 49 4d 45 53 54 41 4d 50 3a 0a 20 20 20  _CTIMESTAMP:.   
acd0: 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20   case TK_GLOB:. 
ace0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a     case TK_LIKE:
acf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
ad00: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
ad10: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
ad20: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
ad30: 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d       int nExpr =
ad40: 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
ad50: 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20  nExpr : 0;.     
ad60: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a   FuncDef *pDef;.
ad70: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20        int nId;. 
ad80: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
ad90: 2a 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  *zId;.      int 
ada0: 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  p2 = 0;.      in
adb0: 74 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e  t i;.      u8 en
adc0: 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
add0: 65 6e 63 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  enc;.      CollS
ade0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
adf0: 20 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e       getFunction
ae00: 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64  Name(pExpr, &zId
ae10: 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70  , &nId);.      p
ae20: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
ae30: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
ae40: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
ae50: 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a  nExpr, enc, 0);.
ae60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
ae70: 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ef!=0 );.      n
ae80: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
ae90: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
aea0: 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20  Parse, pList);. 
aeb0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
aec0: 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69  nExpr && i<32; i
aed0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
aee0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
aef0: 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b  nstant(pList->a[
af00: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
af10: 20 20 20 20 20 20 20 70 32 20 7c 3d 20 28 31 3c         p2 |= (1<
af20: 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <i);.        }. 
af30: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d         if( pDef-
af40: 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26 20  >needCollSeq && 
af50: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
af60: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
af70: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
af80: 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
af90: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
afa0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
afb0: 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65     if( pDef->nee
afc0: 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
afd0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
afe0: 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
aff0: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20  >db->pDfltColl; 
b000: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b010: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
b020: 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68  llSeq, 0, 0, (ch
b030: 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43  ar *)pColl, P3_C
b040: 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
b050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b060: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63  beOp3(v, OP_Func
b070: 74 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 70 32 2c  tion, nExpr, p2,
b080: 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33   (char*)pDef, P3
b090: 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
b0a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b0b0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
b0c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b0d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b0e0: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d  _MemLoad, pExpr-
b0f0: 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20  >iColumn, 0);.  
b100: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
b110: 28 76 2c 20 22 23 20 6c 6f 61 64 20 73 75 62 71  (v, "# load subq
b120: 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
b130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b140: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
b150: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  N: {.      int a
b160: 64 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ddr;.      char 
b170: 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20 20  affinity;..     
b180: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
b190: 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75  he affinity to u
b1a0: 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b  se to create a k
b1b0: 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75  ey from the resu
b1c0: 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  lts.      ** of 
b1d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
b1e0: 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72  affinityStr stor
b1f0: 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69  es a static stri
b200: 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a  ng suitable for.
b210: 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20 4f        ** P3 of O
b220: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20  P_MakeRecord..  
b230: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66      */.      aff
b240: 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73  inity = comparis
b250: 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  onAffinity(pExpr
b260: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
b270: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b280: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b  _Integer, 1, 0);
b290: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
b2a0: 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
b2b0: 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
b2c0: 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79  ". The temporary
b2d0: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
b2e0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f  pExpr->iTable co
b2f0: 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
b300: 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
b310: 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20  he (...) set..  
b320: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
b330: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
b340: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
b350: 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  t);.      addr =
b360: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
b370: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
b380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b390: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
b3a0: 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20 20  , -1, addr+4);  
b3b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64            /* add
b3c0: 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20 73  r + 0 */.      s
b3d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b3e0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29  v, OP_Pop, 2, 0)
b3f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b400: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
b410: 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20  tring8, 0, 0);. 
b420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b430: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
b440: 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20  , 0, addr+7);.  
b450: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
b460: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
b470: 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 69  ord, 1, 0, &affi
b480: 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a 20 61  nity, 1);   /* a
b490: 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20 20 20  ddr + 4 */.     
b4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b4b0: 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  p(v, OP_Found, p
b4c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64  Expr->iTable, ad
b4d0: 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+7);.      sql
b4e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b4f0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20   OP_AddImm, -1, 
b500: 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0);             
b510: 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 36       /* addr + 6
b520: 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72 65 61 6b   */..      break
b530: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b540: 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
b550: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
b560: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
b570: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
b580: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49  prList_item *pLI
b590: 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  tem = pExpr->pLi
b5a0: 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70  st->a;.      Exp
b5b0: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74  r *pRight = pLIt
b5c0: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
b5d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
b5e0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
b5f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b600: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
b610: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
b620: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b630: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
b640: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
b650: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
b660: 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c  , pRight, OP_Ge,
b670: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
b680: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b690: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
b6a0: 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b  ;.      pLItem++
b6b0: 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
b6c0: 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
b6d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b6e0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
b6f0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
b700: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
b710: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
b720: 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20  OP_Le, 0, 0);.  
b730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b740: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20  ddOp(v, OP_And, 
b750: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
b760: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b770: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20  se TK_UPLUS:.   
b780: 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20   case TK_AS: {. 
b790: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b7a0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
b7b0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
b7c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b7d0: 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a     case TK_CASE:
b7e0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70   {.      int exp
b7f0: 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20  r_end_label;.   
b800: 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b     int jumpInst;
b810: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
b820: 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
b830: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
b840: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
b850: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72  EList;.      str
b860: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
b870: 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20  m *aListelem;.. 
b880: 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
b890: 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r->pList);.     
b8a0: 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e   assert((pExpr->
b8b0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32  pList->nExpr % 2
b8c0: 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61  ) == 0);.      a
b8d0: 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
b8e0: 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
b8f0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
b900: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
b910: 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
b920: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
b930: 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
b940: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70  nExpr;.      exp
b950: 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20 73 71  r_end_label = sq
b960: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
b970: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
b980: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
b990: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b9a0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b9b0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
b9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
b9d0: 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
b9e0: 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20  i=i+2){.        
b9f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
ba00: 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
ba10: 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  m[i].pExpr);.   
ba20: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
ba30: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
ba40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ba50: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31  dOp(v, OP_Dup, 1
ba60: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
ba70: 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64 65 43  jumpInst = codeC
ba80: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
ba90: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69  Expr->pLeft, aLi
baa0: 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c  stelem[i].pExpr,
bab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a    OP_Ne, 0, 1);.
bae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
baf0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
bb00: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
bb10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bb20: 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d        jumpInst =
bb30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bb40: 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31  p(v, OP_IfNot, 1
bb50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
bb60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
bb70: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
bb80: 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
bb90: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
bba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bbb0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
bbc0: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a  xpr_end_label);.
bbd0: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
bbe0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
bbf0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
bc00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
bc10: 6e 67 65 50 32 28 76 2c 20 6a 75 6d 70 49 6e 73  ngeP2(v, jumpIns
bc20: 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  t, addr);.      
bc30: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
bc40: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
bc50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bc60: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
bc70: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
bc80: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
bc90: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
bca0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
bcb0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
bcc0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
bcd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
bce0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bcf0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
bd00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
bd10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
bd20: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
bd30: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a  xpr_end_label);.
bd40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bd50: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
bd60: 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  AISE: {.      if
bd70: 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53  ( !pParse->trigS
bd80: 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  tack ){.        
bd90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bda0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
bdc0: 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
bdd0: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
bde0: 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
bdf0: 6d 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  m");..return;.  
be00: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
be10: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
be20: 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
be30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
be40: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45  xpr->iColumn==OE
be50: 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20  _Rollback ||.   
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
be70: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
be80: 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20  OE_Abort ||.    
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
bea0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
beb0: 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20  E_Fail );.      
bec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
bed0: 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  3(v, OP_Halt, SQ
bee0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
bef0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
bf00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bf10: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
bf20: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
bf30: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
bf40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
bf50: 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b 0a  quoteP3(v, -1);.
bf60: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
bf70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
bf80: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
bf90: 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20  = OE_Ignore );. 
bfa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bfb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
bfc0: 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29  ontextPop, 0, 0)
bfd0: 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
bfe0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bff0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73  P_Goto, 0, pPars
c000: 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67  e->trigStack->ig
c010: 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20  noreJump);.     
c020: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
c030: 28 76 2c 20 22 23 20 72 61 69 73 65 28 49 47 4e  (v, "# raise(IGN
c040: 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d  ORE)"));.      }
c050: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
c060: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
c070: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
c080: 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
c090: 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
c0a0: 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
c0b0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
c0c0: 69 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  ist onto the sta
c0d0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
c0e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
c0f0: 6c 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f  lements pushed o
c100: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a  nto the stack..*
c110: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
c120: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20  rCodeExprList(. 
c130: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c140: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c150: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
c160: 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 2f  List *pList    /
c170: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
c180: 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65   list to be code
c190: 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  d */.){.  struct
c1a0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
c1b0: 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pItem;.  int i, 
c1c0: 6e 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  n;.  Vdbe *v;.  
c1d0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
c1e0: 65 74 75 72 6e 20 30 3b 0a 20 20 76 20 3d 20 73  eturn 0;.  v = s
c1f0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
c200: 61 72 73 65 29 3b 0a 20 20 6e 20 3d 20 70 4c 69  arse);.  n = pLi
c210: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72  st->nExpr;.  for
c220: 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
c230: 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20   i=0; i<n; i++, 
c240: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
c250: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c260: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
c270: 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
c280: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n n;.}../*.** Ge
c290: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
c2a0: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
c2b0: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
c2c0: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
c2d0: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
c2e0: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
c2f0: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
c300: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
c310: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
c320: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
c330: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
c340: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
c350: 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
c360: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
c370: 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
c380: 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
c390: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
c3a0: 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
c3b0: 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  flag is true..**
c3c0: 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
c3d0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
c3e0: 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
c3f0: 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
c400: 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
c410: 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
c420: 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
c430: 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
c440: 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
c450: 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
c460: 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
c470: 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
c480: 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
c490: 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
c4a0: 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
c4b0: 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
c4c0: 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
c4d0: 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
c4e0: 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
c4f0: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
c500: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
c510: 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
c520: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
c530: 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
c540: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
c550: 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
c560: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
c570: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
c580: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
c590: 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  t op = 0;.  if( 
c5a0: 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30  v==0 || pExpr==0
c5b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20   ) return;.  op 
c5c0: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
c5d0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
c5e0: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
c5f0: 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
c600: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
c610: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
c620: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
c630: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c640: 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70  pLeft, d2, !jump
c650: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
c660: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
c670: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c680: 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
c690: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
c6a0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
c6b0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
c6c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c6d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c6e0: 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OR: {.      sqli
c6f0: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
c700: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
c710: 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
c720: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
c730: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
c740: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
c750: 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
c760: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
c770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c780: 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
c790: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c7a0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
c7b0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
c7c0: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
c7d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c7e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c7f0: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
c800: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
c810: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
c820: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
c830: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
c840: 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  EQ: {.      asse
c850: 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  rt( TK_LT==OP_Lt
c860: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c870: 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29  ( TK_LE==OP_Le )
c880: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c890: 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a  TK_GT==OP_Gt );.
c8a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c8b0: 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20  _GE==OP_Ge );.  
c8c0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45      assert( TK_E
c8d0: 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20  Q==OP_Eq );.    
c8e0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d    assert( TK_NE=
c8f0: 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ne );.      
c900: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c910: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
c920: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
c930: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c940: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
c950: 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  ht);.      codeC
c960: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
c970: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
c980: 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20  pr->pRight, op, 
c990: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
c9a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c9b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c9c0: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
c9d0: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
c9e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c9f0: 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
ca00: 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
ca10: 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
ca20: 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
ca30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ca40: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
ca50: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
ca60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ca70: 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73  Op(v, op, 1, des
ca80: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
ca90: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
caa0: 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
cab0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
cac0: 73 73 69 6f 6e 20 22 78 20 42 45 54 57 45 45 4e  ssion "x BETWEEN
cad0: 20 79 20 41 4e 44 20 7a 22 20 69 73 20 69 6d 70   y AND z" is imp
cae0: 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20  lemented as:.   
caf0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31     **.      ** 1
cb00: 20 49 46 20 28 78 20 3c 20 79 29 20 47 4f 54 4f   IF (x < y) GOTO
cb10: 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20 49 46   3.      ** 2 IF
cb20: 20 28 78 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c   (x <= z) GOTO <
cb30: 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33  dest>.      ** 3
cb40: 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ....      */.  
cb50: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
cb60: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
cb70: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
cb80: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
cb90: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
cba0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
cbb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cbc0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65  Code(pParse, pLe
cbd0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
cbe0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
cbf0: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
cc00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
cc10: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
cc20: 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ht);.      addr 
cc30: 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50  = codeCompare(pP
cc40: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
cc50: 67 68 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21  ght, OP_Lt, 0, !
cc60: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20  jumpIfNull);..  
cc70: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
cc80: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
cc90: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
cca0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ccb0: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
ccc0: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
ccd0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
cce0: 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65  Right, OP_Le, de
ccf0: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
cd00: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
cd10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
cd20: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
cd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cd40: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
cd50: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
cd60: 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
cd70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cd80: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
cd90: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
cda0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
cdb0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
cdc0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
cdd0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
cde0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cdf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
ce00: 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74  jumpIfNull, dest
ce10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ce20: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
ce30: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
ce40: 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
ce50: 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
ce60: 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
ce70: 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
ce80: 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
ce90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
cea0: 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
ceb0: 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
cec0: 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
ced0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
cee0: 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
cef0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
cf00: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
cf10: 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
cf20: 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
cf30: 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
cf40: 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 20 6f  IfNull is true o
cf50: 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  r fall through i
cf60: 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
cf70: 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  false..*/.void s
cf80: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
cf90: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
cfa0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
cfb0: 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
cfc0: 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
cfd0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
cfe0: 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
cff0: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
d000: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
d010: 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
d020: 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
d030: 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
d040: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
d050: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
d060: 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
d070: 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
d080: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
d090: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
d0a0: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
d0b0: 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
d0c0: 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
d0d0: 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
d0e0: 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
d0f0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
d100: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
d110: 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
d120: 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
d130: 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
d140: 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
d150: 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
d160: 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
d170: 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
d180: 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
d190: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
d1a0: 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
d1b0: 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
d1c0: 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
d1d0: 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
d1e0: 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
d1f0: 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
d200: 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
d210: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
d220: 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
d230: 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
d240: 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
d250: 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
d260: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
d270: 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
d280: 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
d290: 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
d2a0: 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
d2b0: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
d2c0: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
d2d0: 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
d2e0: 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
d2f0: 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
d300: 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
d310: 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
d320: 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
d330: 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
d340: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
d350: 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
d360: 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
d370: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
d380: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
d390: 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
d3a0: 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
d3b0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
d3c0: 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
d3d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
d3e0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
d3f0: 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
d400: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
d410: 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
d420: 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
d430: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
d440: 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
d450: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
d460: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
d470: 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
d480: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
d490: 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
d4a0: 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
d4b0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
d4c0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
d4d0: 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
d4e0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
d4f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
d500: 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
d510: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
d520: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
d530: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
d540: 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
d550: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
d560: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d570: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
d580: 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
d590: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
d5a0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
d5b0: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
d5c0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
d5d0: 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66  eft, d2, !jumpIf
d5e0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
d5f0: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
d600: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
d610: 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
d620: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
d630: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d640: 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
d650: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d660: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
d670: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
d680: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
d690: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
d6a0: 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
d6b0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
d6c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
d6d0: 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
d6e0: 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
d6f0: 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
d700: 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
d710: 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
d720: 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
d730: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d740: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
d750: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
d760: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
d770: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
d780: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
d790: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
d7a0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
d7b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
d7c0: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
d7d0: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
d7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d7f0: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
d800: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
d810: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
d820: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
d830: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
d840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d850: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
d860: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
d870: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
d880: 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
d890: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
d8a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 22 78 20  xpression is "x 
d8b0: 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22  BETWEEN y AND z"
d8c0: 2e 20 49 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e  . It is implemen
d8d0: 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a  ted as:.      **
d8e0: 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28  .      ** 1 IF (
d8f0: 78 20 3e 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20  x >= y) GOTO 3. 
d900: 20 20 20 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c       ** 2 GOTO <
d910: 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33  dest>.      ** 3
d920: 20 49 46 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f   IF (x > z) GOTO
d930: 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f   <dest>.      */
d940: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
d950: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
d960: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
d970: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
d980: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
d990: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
d9a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
d9b0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d9c0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
d9d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d9e0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
d9f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
da00: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
da10: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64  Right);.      ad
da20: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
da30: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
da40: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
da50: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
da60: 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20   pRight, OP_Ge, 
da70: 61 64 64 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e  addr+3, !jumpIfN
da80: 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  ull);..      sql
da90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
daa0: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
dab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dac0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
dad0: 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  o, 0, dest);.   
dae0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
daf0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
db00: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
db10: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
db20: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
db30: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
db40: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
db50: 69 67 68 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73  ight, OP_Gt, des
db60: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
db70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
db80: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
db90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
dba0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
dbb0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
dbc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
dbd0: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70  , OP_IfNot, jump
dbe0: 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20  IfNull, dest);. 
dbf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc00: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
dc10: 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
dc20: 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
dc30: 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
dc40: 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a  turn TRUE (non-z
dc50: 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20  ero).** if they 
dc60: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
dc70: 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69  d return FALSE i
dc80: 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
dc90: 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74   any way..*/.int
dca0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
dcb0: 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78  are(Expr *pA, Ex
dcc0: 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69  pr *pB){.  int i
dcd0: 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 29 7b  ;.  if( pA==0 ){
dce0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d  .    return pB==
dcf0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
dd00: 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  B==0 ){.    retu
dd10: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
dd20: 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29  pA->op!=pB->op )
dd30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
dd40: 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
dd50: 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
dd60: 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  pB->pLeft) ) ret
dd70: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
dd80: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
dd90: 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d  (pA->pRight, pB-
dda0: 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72  >pRight) ) retur
ddb0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70  n 0;.  if( pA->p
ddc0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
ddd0: 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72  pB->pList==0 ) r
dde0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
ddf0: 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70   pA->pList->nExp
de00: 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45  r!=pB->pList->nE
de10: 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  xpr ) return 0;.
de20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
de30: 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  A->pList->nExpr;
de40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
de50: 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
de60: 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e  pare(pA->pList->
de70: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e  a[i].pExpr, pB->
de80: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
de90: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
dea0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
deb0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
dec0: 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pB->pList ){. 
ded0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
dee0: 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65  .  if( pA->pSele
def0: 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63  ct || pB->pSelec
df00: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  t ) return 0;.  
df10: 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
df20: 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41  pB->iTable || pA
df30: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
df40: 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
df50: 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b  0;.  if( pA->tok
df60: 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20  en.z ){.    if( 
df70: 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29  pB->token.z==0 )
df80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
df90: 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  f( pB->token.n!=
dfa0: 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65  pA->token.n ) re
dfb0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
dfc0: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
dfd0: 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d  pA->token.z, pB-
dfe0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f  >token.z, pB->to
dff0: 6b 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74 75  ken.n)!=0 ) retu
e000: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
e010: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 1;.}../*.** A
e020: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
e030: 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
e040: 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 6e 64  aAgg[] array and
e050: 20 72 65 74 75 72 6e 20 69 74 73 20 69 6e 64 65   return its inde
e060: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
e070: 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 50   appendAggInfo(P
e080: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
e090: 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 6e 41   if( (pParse->nA
e0a0: 67 67 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  gg & 0x7)==0 ){.
e0b0: 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 70 50      int amt = pP
e0c0: 61 72 73 65 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a  arse->nAgg + 8;.
e0d0: 20 20 20 20 41 67 67 45 78 70 72 20 2a 61 41 67      AggExpr *aAg
e0e0: 67 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  g = sqliteReallo
e0f0: 63 28 70 50 61 72 73 65 2d 3e 61 41 67 67 2c 20  c(pParse->aAgg, 
e100: 61 6d 74 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  amt*sizeof(pPars
e110: 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20  e->aAgg[0]));.  
e120: 20 20 69 66 28 20 61 41 67 67 3d 3d 30 20 29 7b    if( aAgg==0 ){
e130: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
e140: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
e150: 73 65 2d 3e 61 41 67 67 20 3d 20 61 41 67 67 3b  se->aAgg = aAgg;
e160: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70  .  }.  memset(&p
e170: 50 61 72 73 65 2d 3e 61 41 67 67 5b 70 50 61 72  Parse->aAgg[pPar
e180: 73 65 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20 73 69  se->nAgg], 0, si
e190: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67  zeof(pParse->aAg
e1a0: 67 5b 30 5d 29 29 3b 0a 20 20 72 65 74 75 72 6e  g[0]));.  return
e1b0: 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b   pParse->nAgg++;
e1c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
e1d0: 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
e1e0: 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
e1f0: 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
e200: 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
e210: 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
e220: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
e230: 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
e240: 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
e250: 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
e260: 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
e270: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
e280: 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
e290: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
e2a0: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
e2b0: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
e2c0: 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
e2d0: 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
e2e0: 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
e2f0: 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  3ExprResolveIds(
e300: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 45 78 70  ) and sqlite3Exp
e310: 72 43 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20  rCheck()..**.** 
e320: 49 66 20 65 72 72 6f 72 73 20 61 72 65 20 73 65  If errors are se
e330: 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  en, leave an err
e340: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45  or message in zE
e350: 72 72 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e  rrMsg and return
e360: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
e370: 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  f errors..*/.int
e380: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
e390: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 50 61  yzeAggregates(Pa
e3a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
e3b0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
e3c0: 20 69 3b 0a 20 20 41 67 67 45 78 70 72 20 2a 61   i;.  AggExpr *a
e3d0: 41 67 67 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20  Agg;.  int nErr 
e3e0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  = 0;..  if( pExp
e3f0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
e400: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
e410: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
e420: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
e430: 20 20 20 20 61 41 67 67 20 3d 20 70 50 61 72 73      aAgg = pPars
e440: 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66  e->aAgg;.      f
e450: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
e460: 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
e470: 20 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69        if( aAgg[i
e480: 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ].isAgg ) contin
e490: 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
e4a0: 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69  aAgg[i].pExpr->i
e4b0: 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
e4c0: 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 26 26  able.         &&
e4d0: 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e   aAgg[i].pExpr->
e4e0: 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
e4f0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
e500: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e510: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e520: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
e530: 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20  e->nAgg ){.     
e540: 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67     i = appendAgg
e550: 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20  Info(pParse);.  
e560: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 20        if( i<0 ) 
e570: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
e580: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
e590: 5d 2e 69 73 41 67 67 20 3d 20 30 3b 0a 20 20 20  ].isAgg = 0;.   
e5a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67       pParse->aAg
e5b0: 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78  g[i].pExpr = pEx
e5c0: 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pr;.      }.    
e5d0: 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
e5e0: 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  i;.      break;.
e5f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e600: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
e610: 7b 0a 20 20 20 20 20 20 61 41 67 67 20 3d 20 70  {.      aAgg = p
e620: 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20  Parse->aAgg;.   
e630: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
e640: 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
e650: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  {.        if( !a
e660: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
e670: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
e680: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
e690: 43 6f 6d 70 61 72 65 28 61 41 67 67 5b 69 5d 2e  Compare(aAgg[i].
e6a0: 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b  pExpr, pExpr) ){
e6b0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
e6c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e6d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
e6e0: 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b  =pParse->nAgg ){
e6f0: 0a 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20  .        u8 enc 
e700: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
e710: 63 3b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 61  c;.        i = a
e720: 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61  ppendAggInfo(pPa
e730: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
e740: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31  ( i<0 ) return 1
e750: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
e760: 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ->aAgg[i].isAgg 
e770: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 1;.        pPa
e780: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
e790: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
e7a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
e7b0: 5b 69 5d 2e 70 46 75 6e 63 20 3d 20 73 71 6c 69  [i].pFunc = sqli
e7c0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
e7d0: 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
e7e0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
e7f0: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
e800: 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20  token.n,.       
e810: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
e820: 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73  st ? pExpr->pLis
e830: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
e840: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  c, 0);.      }. 
e850: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
e860: 20 3d 20 69 3b 0a 20 20 20 20 20 20 62 72 65 61   = i;.      brea
e870: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
e880: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  ault: {.      if
e890: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
e8a0: 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d  {.        nErr =
e8b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
e8c0: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
e8d0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
e8e0: 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ft);.      }.   
e8f0: 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26     if( nErr==0 &
e900: 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  & pExpr->pRight 
e910: 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20  ){.        nErr 
e920: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  = sqlite3ExprAna
e930: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
e940: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
e950: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ight);.      }. 
e960: 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30       if( nErr==0
e970: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   && pExpr->pList
e980: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
e990: 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  n = pExpr->pList
e9a0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
e9b0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
e9c0: 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30  for(i=0; nErr==0
e9d0: 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20   && i<n; i++){. 
e9e0: 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20           nErr = 
e9f0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
ea00: 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
ea10: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
ea20: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
ea30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ea40: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
ea50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
ea60: 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nErr;.}../*.**
ea70: 20 4c 6f 63 61 74 65 20 61 20 75 73 65 72 20 66   Locate a user f
ea80: 75 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20 61 20  unction given a 
ea90: 6e 61 6d 65 2c 20 61 20 6e 75 6d 62 65 72 20 6f  name, a number o
eaa0: 66 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20  f arguments and 
eab0: 61 20 66 6c 61 67 0a 2a 2a 20 69 6e 64 69 63 61  a flag.** indica
eac0: 74 69 6e 67 20 77 68 65 74 68 65 72 20 74 68 65  ting whether the
ead0: 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 66 65 72   function prefer
eae0: 73 20 55 54 46 2d 31 36 20 6f 76 65 72 20 55 54  s UTF-16 over UT
eaf0: 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a  F-8.  Return a.*
eb00: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * pointer to the
eb10: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
eb20: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  re that defines 
eb30: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  that function, o
eb40: 72 20 72 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c  r return.** NULL
eb50: 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
eb60: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
eb70: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 72  .**.** If the cr
eb80: 65 61 74 65 46 6c 61 67 20 61 72 67 75 6d 65 6e  eateFlag argumen
eb90: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
eba0: 61 20 6e 65 77 20 28 62 6c 61 6e 6b 29 20 46 75  a new (blank) Fu
ebb0: 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63 74 75  ncDef.** structu
ebc0: 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
ebd0: 64 20 6c 69 6b 65 64 20 69 6e 74 6f 20 74 68 65  d liked into the
ebe0: 20 22 64 62 22 20 73 74 72 75 63 74 75 72 65 20   "db" structure 
ebf0: 69 66 20 61 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68  if a.** no match
ec00: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 72 65  ing function pre
ec10: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e  viously existed.
ec20: 20 20 57 68 65 6e 20 63 72 65 61 74 65 46 6c 61    When createFla
ec30: 67 20 69 73 20 74 72 75 65 0a 2a 2a 20 61 6e 64  g is true.** and
ec40: 20 74 68 65 20 6e 41 72 67 20 70 61 72 61 6d 65   the nArg parame
ec50: 74 65 72 20 69 73 20 2d 31 2c 20 74 68 65 6e 20  ter is -1, then 
ec60: 6f 6e 6c 79 20 61 20 66 75 6e 63 74 69 6f 6e 20  only a function 
ec70: 74 68 61 74 20 61 63 63 65 70 74 73 0a 2a 2a 20  that accepts.** 
ec80: 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  any number of ar
ec90: 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20  guments will be 
eca0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
ecb0: 49 66 20 63 72 65 61 74 65 46 6c 61 67 20 69 73  If createFlag is
ecc0: 20 66 61 6c 73 65 20 61 6e 64 20 6e 41 72 67 20   false and nArg 
ecd0: 69 73 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  is -1, then the 
ece0: 66 69 72 73 74 20 76 61 6c 69 64 0a 2a 2a 20 66  first valid.** f
ecf0: 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 73  unction found is
ed00: 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 66 75   returned.  A fu
ed10: 6e 63 74 69 6f 6e 20 69 73 20 76 61 6c 69 64 20  nction is valid 
ed20: 69 66 20 65 69 74 68 65 72 20 78 46 75 6e 63 0a  if either xFunc.
ed30: 2a 2a 20 6f 72 20 78 53 74 65 70 20 69 73 20 6e  ** or xStep is n
ed40: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49  on-zero..**.** I
ed50: 66 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20  f createFlag is 
ed60: 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 20 66 75  false, then a fu
ed70: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
ed80: 72 65 71 75 69 72 65 64 20 6e 61 6d 65 20 61 6e  required name an
ed90: 64 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61  d.** number of a
eda0: 72 67 75 6d 65 6e 74 73 20 6d 61 79 20 62 65 20  rguments may be 
edb0: 72 65 74 75 72 6e 65 64 20 65 76 65 6e 20 69 66  returned even if
edc0: 20 74 68 65 20 65 54 65 78 74 52 65 70 20 66 6c   the eTextRep fl
edd0: 61 67 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6d  ag does not.** m
ede0: 61 74 63 68 20 74 68 61 74 20 72 65 71 75 65 73  atch that reques
edf0: 74 65 64 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66 20  ted..*/.FuncDef 
ee00: 2a 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63  *sqlite3FindFunc
ee10: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
ee20: 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e  *db,       /* An
ee30: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a   open database *
ee40: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ee50: 7a 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f  zName, /* Name o
ee60: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20  f the function. 
ee70: 20 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e   Not null-termin
ee80: 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ated */.  int nN
ee90: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ame,         /* 
eea0: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
eeb0: 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65  ters in the name
eec0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
eed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
eee0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
eef0: 20 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20 6e    -1 means any n
ef00: 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 6e  umber */.  u8 en
ef10: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
ef20: 20 50 72 65 66 65 72 72 65 64 20 74 65 78 74 20   Preferred text 
ef30: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
ef40: 74 20 63 72 65 61 74 65 46 6c 61 67 20 20 20 20  t createFlag    
ef50: 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 65   /* Create new e
ef60: 6e 74 72 79 20 69 66 20 74 72 75 65 20 61 6e 64  ntry if true and
ef70: 20 64 6f 65 73 20 6e 6f 74 20 6f 74 68 65 72 77   does not otherw
ef80: 69 73 65 20 65 78 69 73 74 20 2a 2f 0a 29 7b 0a  ise exist */.){.
ef90: 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 20 20 20    FuncDef *p;   
efa0: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
efb0: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
efc0: 46 75 6e 63 44 65 66 20 2a 70 46 69 72 73 74 3b  FuncDef *pFirst;
efd0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 75 6e      /* First fun
efe0: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 69 73 20  ction with this 
eff0: 6e 61 6d 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65  name */.  FuncDe
f000: 66 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 2f 2a  f *pBest = 0; /*
f010: 20 42 65 73 74 20 6d 61 74 63 68 20 66 6f 75 6e   Best match foun
f020: 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e  d so far */.  in
f030: 74 20 62 65 73 74 6d 61 74 63 68 20 3d 20 30 3b  t bestmatch = 0;
f040: 20 20 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 65    ...  assert( e
f050: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
f060: 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  || enc==SQLITE_U
f070: 54 46 31 36 4c 45 20 7c 7c 20 65 6e 63 3d 3d 53  TF16LE || enc==S
f080: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b  QLITE_UTF16BE );
f090: 0a 20 20 69 66 28 20 6e 41 72 67 3c 2d 31 20 29  .  if( nArg<-1 )
f0a0: 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 0a 20 20 70   nArg = -1;..  p
f0b0: 46 69 72 73 74 20 3d 20 28 46 75 6e 63 44 65 66  First = (FuncDef
f0c0: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
f0d0: 64 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e  d(&db->aFunc, zN
f0e0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 66  ame, nName);.  f
f0f0: 6f 72 28 70 3d 70 46 69 72 73 74 3b 20 70 3b 20  or(p=pFirst; p; 
f100: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
f110: 20 2f 2a 20 44 75 72 69 6e 67 20 74 68 65 20 73   /* During the s
f120: 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 62 65  earch for the be
f130: 73 74 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  st function defi
f140: 6e 69 74 69 6f 6e 2c 20 62 65 73 74 6d 61 74 63  nition, bestmatc
f150: 68 20 69 73 20 73 65 74 0a 20 20 20 20 2a 2a 20  h is set.    ** 
f160: 61 73 20 66 6f 6c 6c 6f 77 73 20 74 6f 20 69 6e  as follows to in
f170: 64 69 63 61 74 65 20 74 68 65 20 71 75 61 6c 69  dicate the quali
f180: 74 79 20 6f 66 20 74 68 65 20 6d 61 74 63 68 20  ty of the match 
f190: 77 69 74 68 20 74 68 65 20 64 65 66 69 6e 69 74  with the definit
f1a0: 69 6f 6e 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ion.    ** point
f1b0: 65 64 20 74 6f 20 62 79 20 70 42 65 73 74 3a 0a  ed to by pBest:.
f1c0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 30 3a      **.    ** 0:
f1d0: 20 70 42 65 73 74 20 69 73 20 4e 55 4c 4c 2e 20   pBest is NULL. 
f1e0: 4e 6f 20 6d 61 74 63 68 20 68 61 73 20 62 65 65  No match has bee
f1f0: 6e 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2a 20  n found..    ** 
f200: 31 3a 20 41 20 76 61 72 69 61 62 6c 65 20 61 72  1: A variable ar
f210: 67 75 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f 6e  guments function
f220: 20 74 68 61 74 20 70 72 65 66 65 72 73 20 55 54   that prefers UT
f230: 46 2d 38 20 77 68 65 6e 20 61 20 55 54 46 2d 31  F-8 when a UTF-1
f240: 36 0a 20 20 20 20 2a 2a 20 20 20 20 65 6e 63 6f  6.    **    enco
f250: 64 69 6e 67 20 69 73 20 72 65 71 75 65 73 74 65  ding is requeste
f260: 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73 61  d, or vice versa
f270: 2e 0a 20 20 20 20 2a 2a 20 32 3a 20 41 20 76 61  ..    ** 2: A va
f280: 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73  riable arguments
f290: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 75   function that u
f2a0: 73 65 73 20 55 54 46 2d 31 36 42 45 20 77 68 65  ses UTF-16BE whe
f2b0: 6e 20 55 54 46 2d 31 36 4c 45 20 69 73 0a 20 20  n UTF-16LE is.  
f2c0: 20 20 2a 2a 20 20 20 20 72 65 71 75 65 73 74 65    **    requeste
f2d0: 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73 61  d, or vice versa
f2e0: 2e 0a 20 20 20 20 2a 2a 20 33 3a 20 41 20 76 61  ..    ** 3: A va
f2f0: 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73  riable arguments
f300: 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20   function using 
f310: 74 68 65 20 73 61 6d 65 20 74 65 78 74 20 65 6e  the same text en
f320: 63 6f 64 69 6e 67 2e 0a 20 20 20 20 2a 2a 20 34  coding..    ** 4
f330: 3a 20 41 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  : A function wit
f340: 68 20 74 68 65 20 65 78 61 63 74 20 6e 75 6d 62  h the exact numb
f350: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
f360: 72 65 71 75 65 73 74 65 64 20 74 68 61 74 0a 20  requested that. 
f370: 20 20 20 2a 2a 20 20 20 20 70 72 65 66 65 72 73     **    prefers
f380: 20 55 54 46 2d 38 20 77 68 65 6e 20 61 20 55 54   UTF-8 when a UT
f390: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 20 69 73  F-16 encoding is
f3a0: 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76   requested, or v
f3b0: 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a  ice versa..    *
f3c0: 2a 20 35 3a 20 41 20 66 75 6e 63 74 69 6f 6e 20  * 5: A function 
f3d0: 77 69 74 68 20 74 68 65 20 65 78 61 63 74 20 6e  with the exact n
f3e0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
f3f0: 74 73 20 72 65 71 75 65 73 74 65 64 20 74 68 61  ts requested tha
f400: 74 0a 20 20 20 20 2a 2a 20 20 20 20 70 72 65 66  t.    **    pref
f410: 65 72 73 20 55 54 46 2d 31 36 4c 45 20 77 68 65  ers UTF-16LE whe
f420: 6e 20 55 54 46 2d 31 36 42 45 20 69 73 20 72 65  n UTF-16BE is re
f430: 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69 63 65  quested, or vice
f440: 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20 36   versa..    ** 6
f450: 3a 20 41 6e 20 65 78 61 63 74 20 6d 61 74 63 68  : An exact match
f460: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
f470: 41 20 6c 61 72 67 65 72 20 76 61 6c 75 65 20 6f  A larger value o
f480: 66 20 27 6d 61 74 63 68 71 75 61 6c 27 20 69 6e  f 'matchqual' in
f490: 64 69 63 61 74 65 73 20 61 20 6d 6f 72 65 20 64  dicates a more d
f4a0: 65 73 69 72 61 62 6c 65 20 6d 61 74 63 68 2e 0a  esirable match..
f4b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
f4c0: 2d 3e 6e 41 72 67 3d 3d 2d 31 20 7c 7c 20 70 2d  ->nArg==-1 || p-
f4d0: 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c 20 6e  >nArg==nArg || n
f4e0: 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  Arg==-1 ){.     
f4f0: 20 69 6e 74 20 6d 61 74 63 68 20 3d 20 31 3b 20   int match = 1; 
f500: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 6c           /* Qual
f510: 69 74 79 20 6f 66 20 74 68 69 73 20 6d 61 74 63  ity of this matc
f520: 68 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  h */.      if( p
f530: 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c 20  ->nArg==nArg || 
f540: 6e 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  nArg==-1 ){.    
f550: 20 20 20 20 6d 61 74 63 68 20 3d 20 34 3b 0a 20      match = 4;. 
f560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f570: 20 65 6e 63 3d 3d 70 2d 3e 69 50 72 65 66 45 6e   enc==p->iPrefEn
f580: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74  c ){.        mat
f590: 63 68 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d  ch += 2;.      }
f5a0: 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
f5b0: 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  (enc==SQLITE_UTF
f5c0: 31 36 4c 45 20 26 26 20 70 2d 3e 69 50 72 65 66  16LE && p->iPref
f5d0: 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  Enc==SQLITE_UTF1
f5e0: 36 42 45 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  6BE) ||.        
f5f0: 20 20 20 20 20 20 20 28 65 6e 63 3d 3d 53 51 4c         (enc==SQL
f600: 49 54 45 5f 55 54 46 31 36 42 45 20 26 26 20 70  ITE_UTF16BE && p
f610: 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 53 51 4c 49  ->iPrefEnc==SQLI
f620: 54 45 5f 55 54 46 31 36 4c 45 29 20 29 7b 0a 20  TE_UTF16LE) ){. 
f630: 20 20 20 20 20 20 20 6d 61 74 63 68 20 2b 3d 20         match += 
f640: 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  1;.      }..    
f650: 20 20 69 66 28 20 6d 61 74 63 68 3e 62 65 73 74    if( match>best
f660: 6d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  match ){.       
f670: 20 70 42 65 73 74 20 3d 20 70 3b 0a 20 20 20 20   pBest = p;.    
f680: 20 20 20 20 62 65 73 74 6d 61 74 63 68 20 3d 20      bestmatch = 
f690: 6d 61 74 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20  match;.      }. 
f6a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
f6b0: 66 20 74 68 65 20 63 72 65 61 74 65 46 6c 61 67  f the createFlag
f6c0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
f6d0: 75 65 2c 20 61 6e 64 20 74 68 65 20 73 65 61 63  ue, and the seac
f6e0: 68 20 64 69 64 20 6e 6f 74 20 72 65 76 65 61 6c  h did not reveal
f6f0: 20 61 6e 0a 20 20 2a 2a 20 65 78 61 63 74 20 6d   an.  ** exact m
f700: 61 74 63 68 20 66 6f 72 20 74 68 65 20 6e 61 6d  atch for the nam
f710: 65 2c 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  e, number of arg
f720: 75 6d 65 6e 74 73 20 61 6e 64 20 65 6e 63 6f 64  uments and encod
f730: 69 6e 67 2c 20 74 68 65 6e 20 61 64 64 20 61 0a  ing, then add a.
f740: 20 20 2a 2a 20 6e 65 77 20 65 6e 74 72 79 20 74    ** new entry t
f750: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
f760: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 2e 0a   and return it..
f770: 20 20 2a 2f 0a 20 20 69 66 28 20 63 72 65 61 74    */.  if( creat
f780: 65 46 6c 61 67 20 26 26 20 62 65 73 74 6d 61 74  eFlag && bestmat
f790: 63 68 3c 36 20 26 26 20 0a 20 20 20 20 20 20 28  ch<6 && .      (
f7a0: 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pBest = sqliteMa
f7b0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 42 65  lloc(sizeof(*pBe
f7c0: 73 74 29 2b 6e 4e 61 6d 65 2b 31 29 29 20 29 7b  st)+nName+1)) ){
f7d0: 0a 20 20 20 20 70 42 65 73 74 2d 3e 6e 41 72 67  .    pBest->nArg
f7e0: 20 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70 42 65   = nArg;.    pBe
f7f0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 46 69 72  st->pNext = pFir
f800: 73 74 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 7a  st;.    pBest->z
f810: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
f820: 42 65 73 74 5b 31 5d 3b 0a 20 20 20 20 70 42 65  Best[1];.    pBe
f830: 73 74 2d 3e 69 50 72 65 66 45 6e 63 20 3d 20 65  st->iPrefEnc = e
f840: 6e 63 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  nc;.    memcpy(p
f850: 42 65 73 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  Best->zName, zNa
f860: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
f870: 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61  pBest->zName[nNa
f880: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  me] = 0;.    sql
f890: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
f8a0: 64 62 2d 3e 61 46 75 6e 63 2c 20 70 42 65 73 74  db->aFunc, pBest
f8b0: 2d 3e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ->zName, nName, 
f8c0: 28 76 6f 69 64 2a 29 70 42 65 73 74 29 3b 0a 20  (void*)pBest);. 
f8d0: 20 7d 0a 0a 20 20 69 66 28 20 70 42 65 73 74 20   }..  if( pBest 
f8e0: 26 26 20 28 70 42 65 73 74 2d 3e 78 53 74 65 70  && (pBest->xStep
f8f0: 20 7c 7c 20 70 42 65 73 74 2d 3e 78 46 75 6e 63   || pBest->xFunc
f900: 20 7c 7c 20 63 72 65 61 74 65 46 6c 61 67 29 20   || createFlag) 
f910: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
f920: 65 73 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  est;.  }.  retur
f930: 6e 20 30 3b 0a 7d 0a                             n 0;.}.