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

Artifact f30a43302c4c9c513dc8013426f26f6f7925d2e5:


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 34 32 33 20 32 30 30 39 2f 30 33 2f 32 34 20  .423 2009/03/24 
0220: 31 35 3a 33 31 3a 32 38 20 64 72 68 20 45 78 70  15:31:28 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 0a 2f 2a  sqliteInt.h"../*
0250: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 27  .** Return the '
0260: 61 66 66 69 6e 69 74 79 27 20 6f 66 20 74 68 65  affinity' of the
0270: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0280: 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  r if any..**.** 
0290: 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
02a0: 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72 65 6e 63  lumn, a referenc
02b0: 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 76 69  e to a column vi
02c0: 61 20 61 6e 20 27 41 53 27 20 61 6c 69 61 73 2c  a an 'AS' alias,
02d0: 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d 73 65 6c  .** or a sub-sel
02e0: 65 63 74 20 77 69 74 68 20 61 20 63 6f 6c 75 6d  ect with a colum
02f0: 6e 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 20  n as the return 
0300: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
0310: 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 6f 66 20  .** affinity of 
0320: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73 20 72  that column is r
0330: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
0340: 73 65 2c 20 30 78 30 30 20 69 73 20 72 65 74 75  se, 0x00 is retu
0350: 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  rned,.** indicat
0360: 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69 74 79 20  ing no affinity 
0370: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
0380: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 2e 20 74  on..**.** i.e. t
0390: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
03a0: 65 78 70 72 65 73 73 73 69 6f 6e 73 20 69 6e 20  expresssions in 
03b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
03c0: 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a 2a 2a 20  atements all.** 
03d0: 68 61 76 65 20 61 6e 20 61 66 66 69 6e 69 74 79  have an affinity
03e0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
03f0: 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a 2a 20 53  ABLE t1(a);.** S
0400: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0410: 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53 45 4c 45  WHERE a;.** SELE
0420: 43 54 20 61 20 41 53 20 62 20 46 52 4f 4d 20 74  CT a AS b FROM t
0430: 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a 20 53 45  1 WHERE b;.** SE
0440: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
0450: 48 45 52 45 20 28 73 65 6c 65 63 74 20 61 20 66  HERE (select a f
0460: 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63 68 61 72  rom t1);.*/.char
0470: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
0480: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
0490: 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 70 45  ){.  int op = pE
04a0: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
04b0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
04c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
04d0: 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53  r->flags&EP_xIsS
04e0: 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74  elect );.    ret
04f0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0500: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78  ffinity(pExpr->x
0510: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
0520: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
0530: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
0540: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 69 66  E_OMIT_CAST.  if
0550: 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b  ( op==TK_CAST ){
0560: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0570: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0580: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
0590: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
05a0: 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c   (op==TK_AGG_COL
05b0: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f  UMN || op==TK_CO
05c0: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52  LUMN || op==TK_R
05d0: 45 47 49 53 54 45 52 29 20 0a 20 20 20 26 26 20  EGISTER) .   && 
05e0: 70 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20  pExpr->pTab!=0. 
05f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54   ){.    /* op==T
0600: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45  K_REGISTER && pE
0610: 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70  xpr->pTab!=0 hap
0620: 70 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20  pens when pExpr 
0630: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
0640: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
0650: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
0660: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
0670: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
0680: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69  egister */.    i
0690: 6e 74 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43  nt j = pExpr->iC
06a0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a  olumn;.    if( j
06b0: 3c 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <0 ) return SQLI
06c0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
06d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
06e0: 72 2d 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78  r->pTab && j<pEx
06f0: 70 72 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  pr->pTab->nCol )
0700: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  ;.    return pEx
0710: 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pr->pTab->aCol[j
0720: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a  ].affinity;.  }.
0730: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
0740: 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a  affinity;.}../*.
0750: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
0760: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
0770: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  r expression pEx
0780: 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c  pr to be the col
0790: 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
07a0: 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b  ce named by pTok
07b0: 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70  en.   Return a p
07c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65  ointer to the re
07d0: 76 69 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e  vised expression
07e0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  ..** The collati
07f0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d  ng sequence is m
0800: 61 72 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63  arked as "explic
0810: 69 74 22 20 75 73 69 6e 67 20 74 68 65 20 45 50  it" using the EP
0820: 5f 45 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66  _ExpCollate.** f
0830: 6c 61 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69  lag.  An explici
0840: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
0850: 65 6e 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69  ence will overri
0860: 64 65 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63  de implicit.** c
0870: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0880: 65 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  es..*/.Expr *sql
0890: 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28  ite3ExprSetColl(
08a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
08b0: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
08c0: 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 29 7b 0a 20  n *pCollName){. 
08d0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30   char *zColl = 0
08e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
08f0: 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66  Dequoted name of
0900: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0910: 6e 63 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  nce */.  CollSeq
0920: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74   *pColl;.  sqlit
0930: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0940: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
0950: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
0960: 6b 65 6e 28 64 62 2c 20 70 43 6f 6c 6c 4e 61 6d  ken(db, pCollNam
0970: 65 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20  e);.  if( pExpr 
0980: 26 26 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  && zColl ){.    
0990: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
09a0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
09b0: 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b  rse, zColl, -1);
09c0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
09d0: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  {.      pExpr->p
09e0: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  Coll = pColl;.  
09f0: 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73      pExpr->flags
0a00: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
0a10: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  e;.    }.  }.  s
0a20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
0a30: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72   zColl);.  retur
0a40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pExpr;.}../*.*
0a50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  * Return the def
0a60: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
0a70: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
0a80: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0a90: 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73  . If.** there is
0aa0: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
0ab0: 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74 75  ation type, retu
0ac0: 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  rn 0..*/.CollSeq
0ad0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
0ae0: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
0af0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
0b00: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
0b10: 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a  ll = 0;.  Expr *
0b20: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69  p = pExpr;.  whi
0b30: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  le( p ){.    int
0b40: 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d   op;.    pColl =
0b50: 20 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69   p->pColl;.    i
0b60: 66 28 20 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b  f( pColl ) break
0b70: 3b 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ;.    op = p->op
0b80: 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54  ;.    if( (op==T
0b90: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  K_AGG_COLUMN || 
0ba0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
0bb0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
0bc0: 29 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20  ) && p->pTab!=0 
0bd0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
0be0: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
0bf0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
0c00: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
0c10: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
0c20: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
0c30: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
0c40: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
0c50: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
0c60: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
0c70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
0c80: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  l;.      int j =
0c90: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
0ca0: 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20     if( j>=0 ){. 
0cb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a         sqlite3 *
0cc0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0cd0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  .        zColl =
0ce0: 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a   p->pTab->aCol[j
0cf0: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
0d00: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
0d10: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
0d20: 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
0d30: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  -1, 0);.        
0d40: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pExpr->pColl = p
0d50: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
0d60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0d70: 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  .    if( op!=TK_
0d80: 43 41 53 54 20 26 26 20 6f 70 21 3d 54 4b 5f 55  CAST && op!=TK_U
0d90: 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 62 72  PLUS ){.      br
0da0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
0db0: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d   = p->pLeft;.  }
0dc0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
0dd0: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
0de0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
0df0: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
0e00: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
0e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
0e20: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
0e30: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
0e40: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
0e50: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
0e60: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
0e70: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
0e80: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
0e90: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
0ea0: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
0eb0: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
0ec0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
0ed0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
0ee0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
0ef0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
0f00: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
0f10: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
0f20: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
0f30: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
0f40: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
0f50: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
0f60: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
0f70: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
0f80: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
0f90: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
0fa0: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
0fb0: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
0fc0: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
0fd0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0fe0: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
0ff0: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
1000: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1010: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
1020: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1030: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
1040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1060: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
1070: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1080: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1090: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
10a0: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
10b0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
10c0: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
10d0: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
10e0: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
10f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1100: 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NONE;.  }else{.
1110: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
1120: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
1130: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
1140: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
1150: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
1160: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1170: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1180: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1190: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
11a0: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
11b0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
11c0: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
11d0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
11e0: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
11f0: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1200: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1210: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1220: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1230: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1240: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1250: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1260: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1270: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1280: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1290: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
12a0: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
12b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
12c0: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
12d0: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
12e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
12f0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1300: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ->op==TK_NE );. 
1310: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1320: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
1330: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1340: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
1350: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
1360: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
1370: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
1380: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1390: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
13a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70  .  }else if( Exp
13b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
13c0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
13d0: 29 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  ) ){.    aff = s
13e0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
13f0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70  inity(pExpr->x.p
1400: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
1410: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29  a[0].pExpr, aff)
1420: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  ;.  }else if( !a
1430: 66 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ff ){.    aff = 
1440: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1450: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
1460: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  f;.}../*.** pExp
1470: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
1480: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67  n expression, eg
1490: 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e  . '=', '<', IN(.
14a0: 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f  ..) etc..** idx_
14b0: 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20  affinity is the 
14c0: 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69  affinity of an i
14d0: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52  ndexed column. R
14e0: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
14f0: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
1500: 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66  affinity idx_aff
1510: 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65  inity may be use
1520: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
1530: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
1540: 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e   in pExpr..*/.in
1550: 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  t sqlite3IndexAf
1560: 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70  finityOk(Expr *p
1570: 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61  Expr, char idx_a
1580: 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72  ffinity){.  char
1590: 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f   aff = compariso
15a0: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
15b0: 3b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20  ;.  switch( aff 
15c0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
15d0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20  TE_AFF_NONE:.   
15e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
15f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1600: 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74  _TEXT:.      ret
1610: 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79  urn idx_affinity
1620: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
1630: 54 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  T;.    default:.
1640: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1650: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1660: 69 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69  inity(idx_affini
1670: 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ty);.  }.}../*.*
1680: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20  * Return the P5 
1690: 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c  value that shoul
16a0: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20  d be used for a 
16b0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
16c0: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f  n.** opcode (OP_
16d0: 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20  Eq, OP_Ge etc.) 
16e0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
16f0: 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72  pExpr1 and pExpr
1700: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  2..*/.static u8 
1710: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28  binaryCompareP5(
1720: 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78  Expr *pExpr1, Ex
1730: 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20  pr *pExpr2, int 
1740: 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75  jumpIfNull){.  u
1750: 38 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71  8 aff = (char)sq
1760: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1770: 79 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66  y(pExpr2);.  aff
1780: 20 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f   = (u8)sqlite3Co
1790: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
17a0: 78 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38  xpr1, aff) | (u8
17b0: 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72  )jumpIfNull;.  r
17c0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
17d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
17e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
17f0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
1800: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1810: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
1820: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
1830: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
1840: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1850: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
1860: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
1870: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
1880: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
1890: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
18a0: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
18b0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
18c0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
18d0: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
18e0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
18f0: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
1900: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
1910: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1920: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
1930: 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41  ** type..**.** A
1940: 72 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28  rgument pRight (
1950: 62 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d  but not pLeft) m
1960: 61 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69  ay be a null poi
1970: 6e 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61  nter. In this ca
1980: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  se,.** it is not
1990: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
19a0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
19b0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
19c0: 6c 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70  lSeq(.  Parse *p
19d0: 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a  Parse, .  Expr *
19e0: 70 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a  pLeft, .  Expr *
19f0: 70 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c  pRight.){.  Coll
1a00: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73  Seq *pColl;.  as
1a10: 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
1a20: 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67   if( pLeft->flag
1a30: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
1a40: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1a50: 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b   pLeft->pColl );
1a60: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65  .    pColl = pLe
1a70: 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c  ft->pColl;.  }el
1a80: 73 65 20 69 66 28 20 70 52 69 67 68 74 20 26 26  se if( pRight &&
1a90: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
1aa0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
1ab0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  {.    assert( pR
1ac0: 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  ight->pColl );. 
1ad0: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68     pColl = pRigh
1ae0: 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73  t->pColl;.  }els
1af0: 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  e{.    pColl = s
1b00: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1b10: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
1b20: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
1b30: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
1b40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1b50: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
1b60: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
1b70: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
1b80: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b90: 65 20 74 68 65 20 6f 70 65 72 61 6e 64 73 20 66  e the operands f
1ba0: 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  or a comparison 
1bb0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 65 66 6f  operation.  Befo
1bc0: 72 65 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67  re.** generating
1bd0: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 65 61   the code for ea
1be0: 63 68 20 6f 70 65 72 61 6e 64 2c 20 73 65 74 20  ch operand, set 
1bf0: 74 68 65 20 45 50 5f 41 6e 79 41 66 66 0a 2a 2a  the EP_AnyAff.**
1c00: 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 65 78 70   flag on the exp
1c10: 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
1c20: 69 74 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  it will be able 
1c30: 74 6f 20 75 73 65 64 20 61 0a 2a 2a 20 63 61 63  to used a.** cac
1c40: 68 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  hed column value
1c50: 20 74 68 61 74 20 68 61 73 20 70 72 65 76 69 6f   that has previo
1c60: 75 73 6c 79 20 75 6e 64 65 72 67 6f 6e 65 20 61  usly undergone a
1c70: 6e 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 63 68  n.** affinity ch
1c80: 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ange..*/.static 
1c90: 76 6f 69 64 20 63 6f 64 65 43 6f 6d 70 61 72 65  void codeCompare
1ca0: 4f 70 65 72 61 6e 64 73 28 0a 20 20 50 61 72 73  Operands(.  Pars
1cb0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1cc0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1cd0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1ce0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1cf0: 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54  pLeft,      /* T
1d00: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
1d10: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 4c 65  */.  int *pRegLe
1d20: 66 74 2c 20 20 20 20 2f 2a 20 52 65 67 69 73 74  ft,    /* Regist
1d30: 65 72 20 77 68 65 72 65 20 6c 65 66 74 20 6f 70  er where left op
1d40: 65 72 61 6e 64 20 69 73 20 73 74 6f 72 65 64 20  erand is stored 
1d50: 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 72 65 65 4c  */.  int *pFreeL
1d60: 65 66 74 2c 20 20 20 2f 2a 20 46 72 65 65 20 74  eft,   /* Free t
1d70: 68 69 73 20 72 65 67 69 73 74 65 72 20 77 68 65  his register whe
1d80: 6e 20 64 6f 6e 65 20 2a 2f 0a 20 20 45 78 70 72  n done */.  Expr
1d90: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a   *pRight,     /*
1da0: 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   The right opera
1db0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
1dc0: 67 52 69 67 68 74 2c 20 20 20 2f 2a 20 52 65 67  gRight,   /* Reg
1dd0: 69 73 74 65 72 20 77 68 65 72 65 20 72 69 67 68  ister where righ
1de0: 74 20 6f 70 65 72 61 6e 64 20 69 73 20 73 74 6f  t operand is sto
1df0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46  red */.  int *pF
1e00: 72 65 65 52 69 67 68 74 20 20 20 2f 2a 20 57 72  reeRight   /* Wr
1e10: 69 74 65 20 74 65 6d 70 20 72 65 67 69 73 74 65  ite temp registe
1e20: 72 20 66 6f 72 20 72 69 67 68 74 20 6f 70 65 72  r for right oper
1e30: 61 6e 64 20 74 68 65 72 65 20 2a 2f 0a 29 7b 0a  and there */.){.
1e40: 20 20 77 68 69 6c 65 28 20 70 4c 65 66 74 2d 3e    while( pLeft->
1e50: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70  op==TK_UPLUS ) p
1e60: 4c 65 66 74 20 3d 20 70 4c 65 66 74 2d 3e 70 4c  Left = pLeft->pL
1e70: 65 66 74 3b 0a 20 20 70 4c 65 66 74 2d 3e 66 6c  eft;.  pLeft->fl
1e80: 61 67 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66 66  ags |= EP_AnyAff
1e90: 3b 0a 20 20 2a 70 52 65 67 4c 65 66 74 20 3d 20  ;.  *pRegLeft = 
1ea0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1eb0: 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66  emp(pParse, pLef
1ec0: 74 2c 20 70 46 72 65 65 4c 65 66 74 29 3b 0a 20  t, pFreeLeft);. 
1ed0: 20 77 68 69 6c 65 28 20 70 52 69 67 68 74 2d 3e   while( pRight->
1ee0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70  op==TK_UPLUS ) p
1ef0: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 2d 3e  Right = pRight->
1f00: 70 4c 65 66 74 3b 0a 20 20 70 52 69 67 68 74 2d  pLeft;.  pRight-
1f10: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 41 6e 79  >flags |= EP_Any
1f20: 41 66 66 3b 0a 20 20 2a 70 52 65 67 52 69 67 68  Aff;.  *pRegRigh
1f30: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
1f40: 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1f50: 70 52 69 67 68 74 2c 20 70 46 72 65 65 52 69 67  pRight, pFreeRig
1f60: 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ht);.}../*.** Ge
1f70: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1f80: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1f90: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
1fa0: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
1fb0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1fc0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
1fd0: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1fe0: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1ff0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
2000: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
2010: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
2020: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2030: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2040: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
2050: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2060: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2070: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2080: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
2090: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
20a0: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
20b0: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
20c0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
20d0: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
20e0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
20f0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
2100: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
2110: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
2120: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
2130: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
2140: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
2150: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2160: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2170: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2180: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2190: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
21a0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
21b0: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
21c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21d0: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
21e0: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
21f0: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
2220: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
2230: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2240: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
2250: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 69 66 28  , (u8)p5);.  if(
2260: 20 28 70 35 20 26 20 53 51 4c 49 54 45 5f 41 46   (p5 & SQLITE_AF
2270: 46 5f 4d 41 53 4b 29 21 3d 53 51 4c 49 54 45 5f  F_MASK)!=SQLITE_
2280: 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
2290: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
22a0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
22b0: 50 61 72 73 65 2c 20 69 6e 31 2c 20 31 29 3b 0a  Parse, in1, 1);.
22c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22d0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
22e0: 67 65 28 70 50 61 72 73 65 2c 20 69 6e 32 2c 20  ge(pParse, in2, 
22f0: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
2300: 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51   addr;.}..#if SQ
2310: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
2320: 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63  PTH>0./*.** Chec
2330: 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20  k that argument 
2340: 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73 20  nHeight is less 
2350: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
2360: 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20   the maximum.** 
2370: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
2380: 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20   allowed. If it 
2390: 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e  is not, leave an
23a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
23b0: 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  n.** pParse..*/.
23c0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
23d0: 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73 65  heckHeight(Parse
23e0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48   *pParse, int nH
23f0: 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63  eight){.  int rc
2400: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2410: 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70  int mxHeight = p
2420: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
2430: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
2440: 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66  XPR_DEPTH];.  if
2450: 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67  ( nHeight>mxHeig
2460: 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
2470: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2480: 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72 65  , .       "Expre
2490: 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f  ssion tree is to
24a0: 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d  o large (maximum
24b0: 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48   depth %d)", mxH
24c0: 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20  eight.    );.   
24d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
24e0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
24f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66   rc;.}../* The f
2500: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66  ollowing three f
2510: 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74  unctions, height
2520: 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68 74  OfExpr(), height
2530: 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20  OfExprList().** 
2540: 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65  and heightOfSele
2550: 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20 74  ct(), are used t
2560: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
2570: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a  maximum height.*
2580: 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73  * of any express
2590: 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e  ion tree referen
25a0: 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75 63  ced by the struc
25b0: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74  ture passed as t
25c0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75  he.** first argu
25d0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ment..**.** If t
25e0: 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  his maximum heig
25f0: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2600: 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  an the current v
2610: 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  alue pointed.** 
2620: 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20  to by pnHeight, 
2630: 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
2640: 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a  eter, then set *
2650: 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61 74  pnHeight to that
2660: 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  .** value..*/.st
2670: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
2680: 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  OfExpr(Expr *p, 
2690: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
26a0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
26b0: 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70  f( p->nHeight>*p
26c0: 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20  nHeight ){.     
26d0: 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e   *pnHeight = p->
26e0: 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20  nHeight;.    }. 
26f0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
2700: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2710: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  t(ExprList *p, i
2720: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
2730: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
2740: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
2750: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
2760: 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74  +){.      height
2770: 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70  OfExpr(p->a[i].p
2780: 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b  Expr, pnHeight);
2790: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
27a0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
27b0: 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a  fSelect(Select *
27c0: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
27d0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
27e0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
27f0: 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67  ->pWhere, pnHeig
2800: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2810: 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  fExpr(p->pHaving
2820: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2830: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2840: 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68  >pLimit, pnHeigh
2850: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
2860: 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c  Expr(p->pOffset,
2870: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2880: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2890: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65  (p->pEList, pnHe
28a0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
28b0: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
28c0: 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68  GroupBy, pnHeigh
28d0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
28e0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
28f0: 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  erBy, pnHeight);
2900: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
2910: 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70  ect(p->pPrior, p
2920: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a  nHeight);.  }.}.
2930: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
2940: 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69  xpr.nHeight vari
2950: 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75  able in the stru
2960: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
2970: 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  an .** argument.
2980: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77   An expression w
2990: 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c  ith no children,
29a0: 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a   Expr.pList or .
29b0: 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20  ** Expr.pSelect 
29c0: 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65 69  member has a hei
29d0: 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74  ght of 1. Any ot
29e0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  her expression.*
29f0: 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20 65  * has a height e
2a00: 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69  qual to the maxi
2a10: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
2a20: 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65  y other .** refe
2a30: 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73  renced Expr plus
2a40: 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   one..*/.static 
2a50: 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67  void exprSetHeig
2a60: 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ht(Expr *p){.  i
2a70: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
2a80: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2a90: 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68  ->pLeft, &nHeigh
2aa0: 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78  t);.  heightOfEx
2ab0: 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e  pr(p->pRight, &n
2ac0: 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45  Height);.  if( E
2ad0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2ae0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2af0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  ){.    heightOfS
2b00: 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65  elect(p->x.pSele
2b10: 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ct, &nHeight);. 
2b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 65 69 67   }else{.    heig
2b30: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
2b40: 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68  x.pList, &nHeigh
2b50: 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65  t);.  }.  p->nHe
2b60: 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b  ight = nHeight +
2b70: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   1;.}../*.** Set
2b80: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
2b90: 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67  t variable using
2ba0: 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69 67   the exprSetHeig
2bb0: 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49  ht() function. I
2bc0: 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20  f.** the height 
2bd0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2be0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  the maximum allo
2bf0: 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64  wed expression d
2c00: 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  epth,.** leave a
2c10: 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
2c20: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2c30: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28  e3ExprSetHeight(
2c40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
2c50: 78 70 72 20 2a 70 29 7b 0a 20 20 65 78 70 72 53  xpr *p){.  exprS
2c60: 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73  etHeight(p);.  s
2c70: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
2c80: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
2c90: 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a  >nHeight);.}../*
2ca0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
2cb0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
2cc0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
2cd0: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a  tree referenced.
2ce0: 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63 74  ** by the select
2cf0: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
2d00: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
2d10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d20: 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
2d30: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69  (Select *p){.  i
2d40: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
2d50: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2d60: 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  (p, &nHeight);. 
2d70: 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b   return nHeight;
2d80: 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69  .}.#else.  #defi
2d90: 6e 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  ne exprSetHeight
2da0: 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  (y).#endif /* SQ
2db0: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
2dc0: 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PTH>0 */../*.** 
2dd0: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
2de0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
2df0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
2e00: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d  nter to it.  Mem
2e10: 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  ory.** for this 
2e20: 6e 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64  node is obtained
2e30: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
2e40: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2e50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2e60: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2e70: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2e80: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2e90: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2ea0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2eb0: 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
2ec0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
2ed0: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71  /* Handle for sq
2ee0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
2ef0: 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c  o() (may be null
2f00: 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  ) */.  int op,  
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f20: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
2f30: 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ode */.  Expr *p
2f40: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2f50: 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64   /* Left operand
2f60: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
2f70: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
2f80: 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   Right operand *
2f90: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
2fa0: 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41  *pToken     /* A
2fb0: 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f  rgument token */
2fc0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
2fd0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
2fe0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
2ff0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
3000: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
3010: 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d  ){.    /* When m
3020: 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c  alloc fails, del
3030: 65 74 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ete pLeft and pR
3040: 69 67 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e  ight. Expression
3050: 73 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20  s passed to .   
3060: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
3070: 6e 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  n must always be
3080: 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20   allocated with 
3090: 73 71 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f  sqlite3Expr() fo
30a0: 72 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72  r this .    ** r
30b0: 65 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20  eason. .    */. 
30c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
30d0: 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b  lete(db, pLeft);
30e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
30f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68  Delete(db, pRigh
3100: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
3110: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70  ;.  }.  pNew->op
3120: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4e 65   = (u8)op;.  pNe
3130: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  w->pLeft = pLeft
3140: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
3150: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 70 4e 65   = pRight;.  pNe
3160: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
3170: 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 28  pNew->span.z = (
3180: 75 38 2a 29 22 22 3b 0a 20 20 69 66 28 20 70 54  u8*)"";.  if( pT
3190: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  oken ){.    int 
31a0: 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
31b0: 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b  Token->dyn==0 );
31c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20  .    pNew->span 
31d0: 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 0a 20 20 20  = *pToken;. .   
31e0: 20 2f 2a 20 54 68 65 20 70 54 6f 6b 65 6e 2d 3e   /* The pToken->
31f0: 7a 20 76 61 6c 75 65 20 69 73 20 72 65 61 64 2d  z value is read-
3200: 6f 6e 6c 79 2e 20 20 42 75 74 20 74 68 65 20 6e  only.  But the n
3210: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ew expression.  
3220: 20 20 2a 2a 20 6e 6f 64 65 20 63 72 65 61 74 65    ** node create
3230: 64 20 68 65 72 65 20 6d 69 67 68 74 20 62 65 20  d here might be 
3240: 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
3250: 33 44 65 71 75 6f 74 65 45 78 70 72 28 29 20 77  3DequoteExpr() w
3260: 68 69 63 68 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  hich.    ** will
3270: 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f 64 69   attempt to modi
3280: 66 79 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a  fy pNew->token.z
3290: 2e 20 20 48 65 6e 63 65 2c 20 69 66 20 74 68 65  .  Hence, if the
32a0: 20 74 6f 6b 65 6e 0a 20 20 20 20 2a 2a 20 69 73   token.    ** is
32b0: 20 71 75 6f 74 65 64 2c 20 6d 61 6b 65 20 61 20   quoted, make a 
32c0: 63 6f 70 79 20 6e 6f 77 20 73 6f 20 74 68 61 74  copy now so that
32d0: 20 44 65 71 75 6f 74 65 45 78 70 72 28 29 20 77   DequoteExpr() w
32e0: 69 6c 6c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a  ill change.    *
32f0: 2a 20 74 68 65 20 63 6f 70 79 20 72 61 74 68 65  * the copy rathe
3300: 72 20 74 68 61 6e 20 74 68 65 20 6f 72 69 67 69  r than the origi
3310: 6e 61 6c 20 74 65 78 74 2e 0a 20 20 20 20 2a 2f  nal text..    */
3320: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d  .    if( pToken-
3330: 3e 6e 3e 3d 32 20 0a 20 20 20 20 20 20 20 20 20  >n>=2 .         
3340: 26 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d  && ((c = pToken-
3350: 3e 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20  >z[0])=='\'' || 
3360: 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27  c=='"' || c=='['
3370: 20 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20   || c=='`') ){. 
3380: 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
3390: 6e 43 6f 70 79 28 64 62 2c 20 26 70 4e 65 77 2d  nCopy(db, &pNew-
33a0: 3e 74 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 29 3b  >token, pToken);
33b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33c0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
33d0: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70  *pToken;.      p
33e0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
33f0: 5f 44 65 71 75 6f 74 65 64 3b 0a 20 20 20 20 20  _Dequoted;.     
3400: 20 56 56 41 5f 4f 4e 4c 59 28 20 70 4e 65 77 2d   VVA_ONLY( pNew-
3410: 3e 76 76 61 46 6c 61 67 73 20 7c 3d 20 45 56 56  >vvaFlags |= EVV
3420: 41 5f 52 65 61 64 4f 6e 6c 79 54 6f 6b 65 6e 3b  A_ReadOnlyToken;
3430: 20 29 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   ).    }.  }else
3440: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
3450: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
3460: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
3470: 2d 3e 73 70 61 6e 2e 64 79 6e 3d 3d 30 20 26 26  ->span.dyn==0 &&
3480: 20 70 4c 65 66 74 2d 3e 73 70 61 6e 2e 64 79 6e   pLeft->span.dyn
3490: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
34a0: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 70  qlite3ExprSpan(p
34b0: 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61  New, &pLeft->spa
34c0: 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70 61 6e  n, &pRight->span
34d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34e0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 6c 61   if( pRight->fla
34f0: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
3500: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  te ){.        pN
3510: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
3520: 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ExpCollate;.    
3530: 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20      pNew->pColl 
3540: 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b  = pRight->pColl;
3550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3560: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c     if( pLeft->fl
3570: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
3580: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ate ){.      pNe
3590: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  w->flags |= EP_E
35a0: 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20  xpCollate;.     
35b0: 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70   pNew->pColl = p
35c0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Left->pColl;.   
35d0: 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 72 53 65   }.  }..  exprSe
35e0: 74 48 65 69 67 68 74 28 70 4e 65 77 29 3b 0a 20  tHeight(pNew);. 
35f0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
3600: 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b  ./*.** Works lik
3610: 65 20 73 71 6c 69 74 65 33 45 78 70 72 28 29 20  e sqlite3Expr() 
3620: 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 74  except that it t
3630: 61 6b 65 73 20 61 6e 20 65 78 74 72 61 20 50 61  akes an extra Pa
3640: 72 73 65 2a 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rse*.** argument
3650: 20 61 6e 64 20 6e 6f 74 69 66 69 65 73 20 74 68   and notifies th
3660: 65 20 61 73 73 6f 63 69 61 74 65 64 20 63 6f 6e  e associated con
3670: 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69  nection object i
3680: 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
3690: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
36a0: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
36b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
36c0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
36d0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
3700: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
3710: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
3720: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
3730: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
3740: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
3750: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
3760: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65   */.  const Toke
3770: 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a  n *pToken     /*
3780: 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20   Argument token 
3790: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 20  */.){.  Expr *p 
37a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50  = sqlite3Expr(pP
37b0: 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 4c  arse->db, op, pL
37c0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 70 54 6f  eft, pRight, pTo
37d0: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  ken);.  if( p ){
37e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
37f0: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
3800: 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b  se, p->nHeight);
3810: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
3820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  .}../*.** When d
3830: 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61  oing a nested pa
3840: 72 73 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63  rse, you can inc
3850: 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  lude terms in an
3860: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
3870: 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68  hat look like th
3880: 69 73 3a 20 20 20 23 31 20 23 32 20 2e 2e 2e 20  is:   #1 #2 ... 
3890: 20 54 68 65 73 65 20 74 65 72 6d 73 20 72 65 66   These terms ref
38a0: 65 72 20 74 6f 20 72 65 67 69 73 74 65 72 73 0a  er to registers.
38b0: 2a 2a 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  ** in the virtua
38c0: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 23 4e 20 69  l machine.  #N i
38d0: 73 20 74 68 65 20 4e 2d 74 68 20 72 65 67 69 73  s the N-th regis
38e0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
38f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3900: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
3910: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6f 6e 20  to deal with on 
3920: 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a  of those terms..
3930: 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61 74 65 6c  ** It immediatel
3940: 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  y generates code
3950: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76 61   to store the va
3960: 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  lue in a memory 
3970: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  location..** The
3980: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78 70 72   returns an expr
3990: 65 73 73 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  ession that will
39a0: 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74   code to extract
39b0: 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a   the value from.
39c0: 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c  ** that memory l
39d0: 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65 65 64 65  ocation as neede
39e0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
39f0: 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28  te3RegisterExpr(
3a00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
3a10: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
3a20: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
3a30: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72  e->pVdbe;.  Expr
3a40: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73   *p;.  if( pPars
3a50: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a  e->nested==0 ){.
3a60: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3a70: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61  Msg(pParse, "nea
3a80: 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78  r \"%T\": syntax
3a90: 20 65 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29   error", pToken)
3aa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
3ab0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
3ac0: 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c  , TK_NULL, 0, 0,
3ad0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76   0);.  }.  if( v
3ae0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3af0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 50 45 78    p = sqlite3PEx
3b00: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 52 45  pr(pParse, TK_RE
3b10: 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20 70 54  GISTER, 0, 0, pT
3b20: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d  oken);.  if( p==
3b30: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3b40: 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61  0;  /* Malloc fa
3b50: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d  iled */.  }.  p-
3b60: 3e 69 54 61 62 6c 65 20 3d 20 61 74 6f 69 28 28  >iTable = atoi((
3b70: 63 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a  char*)&pToken->z
3b80: 5b 31 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  [1]);.  return p
3b90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
3ba0: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
3bb0: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
3bc0: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
3bd0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
3be0: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
3bf0: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
3c00: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
3c10: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3c20: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
3c30: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
3c40: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
3c50: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
3c60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
3c70: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
3c80: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
3c90: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
3ca0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
3cb0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
3cc0: 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 70 4c 65  (db, TK_AND, pLe
3cd0: 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
3ce0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
3cf0: 20 74 68 65 20 45 78 70 72 2e 73 70 61 6e 20 66   the Expr.span f
3d00: 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65  ield of the give
3d10: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
3d20: 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74  span all.** text
3d30: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
3d40: 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 20 20   given tokens.  
3d50: 42 6f 74 68 20 74 6f 6b 65 6e 73 20 6d 75 73 74  Both tokens must
3d60: 20 62 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20   be pointing.** 
3d70: 61 74 20 74 68 65 20 73 61 6d 65 20 73 74 72 69  at the same stri
3d80: 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ng..*/.void sqli
3d90: 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72  te3ExprSpan(Expr
3da0: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
3db0: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
3dc0: 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28  ight){.  assert(
3dd0: 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
3de0: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
3df0: 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
3e00: 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 73 70  ){.    pExpr->sp
3e10: 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b  an.z = pLeft->z;
3e20: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
3e30: 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20 6d  owing assert() m
3e40: 61 79 20 66 61 69 6c 20 77 68 65 6e 20 74 68 69  ay fail when thi
3e50: 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 20 20 20  s is called .   
3e60: 20 2a 2a 20 76 69 61 20 73 71 6c 69 74 65 33 50   ** via sqlite3P
3e70: 45 78 70 72 28 29 2f 73 71 6c 69 74 65 33 45 78  Expr()/sqlite3Ex
3e80: 70 72 28 29 20 66 72 6f 6d 20 61 64 64 57 68 65  pr() from addWhe
3e90: 72 65 54 65 72 6d 28 29 2e 20 2a 2f 0a 20 20 20  reTerm(). */.   
3ea0: 20 2f 2a 20 61 73 73 65 72 74 28 70 52 69 67 68   /* assert(pRigh
3eb0: 74 2d 3e 7a 20 3e 3d 20 70 4c 65 66 74 2d 3e 7a  t->z >= pLeft->z
3ec0: 29 3b 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d  ); */.    pExpr-
3ed0: 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74  >span.n = pRight
3ee0: 2d 3e 6e 20 2b 20 28 75 6e 73 69 67 6e 65 64 29  ->n + (unsigned)
3ef0: 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65  (pRight->z - pLe
3f00: 66 74 2d 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ft->z);.  }.}../
3f10: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
3f20: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
3f30: 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74  node for a funct
3f40: 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c  ion with multipl
3f50: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a  e.** arguments..
3f60: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3f70: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72  ExprFunction(Par
3f80: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
3f90: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
3fa0: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
3fb0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c  xpr *pNew;.  sql
3fc0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
3fd0: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
3fe0: 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65   pToken );.  pNe
3ff0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
4000: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
4010: 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66  of(Expr) );.  if
4020: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
4030: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4040: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
4050: 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f  ); /* Avoid memo
4060: 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c  ry leak when mal
4070: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
4080: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4090: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
40a0: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
40b0: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
40c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
40d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
40e0: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
40f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
4100: 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a  oken->dyn==0 );.
4110: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 2a    pNew->span = *
4120: 70 54 6f 6b 65 6e 3b 0a 20 20 73 71 6c 69 74 65  pToken;.  sqlite
4130: 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
4140: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2c 20 70 54 6f  pNew->token, pTo
4150: 6b 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ken);.  sqlite3E
4160: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61  xprSetHeight(pPa
4170: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  rse, pNew);.  re
4180: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4190: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
41a0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
41b0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
41c0: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
41d0: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
41e0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
41f0: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
4200: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
4210: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
4220: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
4230: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
4240: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
4250: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
4260: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
4270: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
4280: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
4290: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
42a0: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
42b0: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
42c0: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
42d0: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
42e0: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
42f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
4300: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
4310: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
4320: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
4330: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
4340: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
4350: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
4360: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
4370: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
4380: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
4390: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
43a0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
43b0: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
43c0: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
43d0: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
43e0: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
43f0: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
4400: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
4410: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
4420: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
4430: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
4440: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ){.  Token *pTok
4450: 65 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  en;.  sqlite3 *d
4460: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4470: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
4480: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b  ) return;.  pTok
4490: 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b  en = &pExpr->tok
44a0: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  en;.  assert( pT
44b0: 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20  oken->n>=1 );.  
44c0: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
44d0: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
44e0: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d  ( pToken->z[0]!=
44f0: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
4500: 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  n->n==1 ){.    /
4510: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
4520: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
4530: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
4540: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
4550: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
4560: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
4570: 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ar;.  }else if( 
4580: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f  pToken->z[0]=='?
4590: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
45a0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
45b0: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
45c0: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
45d0: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
45e0: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
45f0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
4600: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
4610: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
4620: 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a   i = atoi((char*
4630: 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b  )&pToken->z[1]);
4640: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
4650: 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
4660: 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20  ase( i==1 );.   
4670: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
4680: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
4690: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
46a0: 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20  UMBER]-1 );.    
46b0: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
46c0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
46d0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
46e0: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 69 66 28  MBER] );.    if(
46f0: 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c   i<1 || i>db->aL
4700: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4710: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
4720: 52 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  R] ){.      sqli
4730: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4740: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
4750: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
4760: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
4770: 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ,.          db->
4780: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4790: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
47a0: 42 45 52 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  BER]);.    }.   
47b0: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
47c0: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Var ){.      pPa
47d0: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20  rse->nVar = i;. 
47e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
47f0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f    /* Wildcards o
4800: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
4810: 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65  " or "$aaa".  Re
4820: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
4830: 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  iable.    ** num
4840: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
4850: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
4860: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
4870: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
4880: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
4890: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
48a0: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
48b0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
48c0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a    */.    int i;.
48d0: 20 20 20 20 75 33 32 20 6e 3b 0a 20 20 20 20 6e      u32 n;.    n
48e0: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20   = pToken->n;.  
48f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
4900: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69  rse->nVarExpr; i
4910: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
4920: 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28  *pE;.      if( (
4930: 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56  pE = pParse->apV
4940: 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20  arExpr[i])!=0.  
4950: 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74          && pE->t
4960: 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20  oken.n==n.      
4970: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45      && memcmp(pE
4980: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65  ->token.z, pToke
4990: 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  n->z, n)==0 ){. 
49a0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
49b0: 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c  able = pE->iTabl
49c0: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
49d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
49e0: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
49f0: 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20  e->nVarExpr ){. 
4a00: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
4a10: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
4a20: 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Var;.      if( p
4a30: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e  Parse->nVarExpr>
4a40: 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  =pParse->nVarExp
4a50: 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20  rAlloc-1 ){.    
4a60: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
4a70: 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61  ExprAlloc += pPa
4a80: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
4a90: 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  oc + 10;.       
4aa0: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
4ab0: 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  pr =.           
4ac0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
4ad0: 63 4f 72 46 72 65 65 28 0a 20 20 20 20 20 20 20  cOrFree(.       
4ae0: 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
4af0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
4b00: 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20 20  >apVarExpr,.    
4b10: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
4b20: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a  ->nVarExprAlloc*
4b30: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
4b40: 70 56 61 72 45 78 70 72 5b 30 5d 29 0a 20 20 20  pVarExpr[0]).   
4b50: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
4b60: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 64    }.      if( !d
4b70: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4b80: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
4b90: 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72  t( pParse->apVar
4ba0: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
4bb0: 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72     pParse->apVar
4bc0: 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61  Expr[pParse->nVa
4bd0: 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72  rExpr++] = pExpr
4be0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4bf0: 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72    } .  if( !pPar
4c00: 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72  se->nErr && pPar
4c10: 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69  se->nVar>db->aLi
4c20: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
4c30: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4c40: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
4c50: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4c60: 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76   "too many SQL v
4c70: 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a  ariables");.  }.
4c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
4c90: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72  n expression str
4ca0: 75 63 74 75 72 65 20 77 69 74 68 6f 75 74 20 64  ucture without d
4cb0: 65 6c 65 74 69 6e 67 20 74 68 65 20 73 74 72 75  eleting the stru
4cc0: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2a  cture itself..**
4cd0: 20 53 75 62 73 74 72 75 63 74 75 72 65 20 69 73   Substructure is
4ce0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 76 6f 69   deleted..*/.voi
4cf0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65  d sqlite3ExprCle
4d00: 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
4d10: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
4d20: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73  p->token.dyn ) s
4d30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4d40: 20 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e   (char*)p->token
4d50: 2e 7a 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72  .z);.  if( !Expr
4d60: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
4d70: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
4d80: 50 5f 53 70 61 6e 4f 6e 6c 79 29 20 29 7b 0a 20  P_SpanOnly) ){. 
4d90: 20 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64     if( p->span.d
4da0: 79 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  yn ) sqlite3DbFr
4db0: 65 65 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d  ee(db, (char*)p-
4dc0: 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 69 66  >span.z);.    if
4dd0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
4de0: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
4df0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
4e00: 3e 70 4c 65 66 74 20 29 20 73 71 6c 69 74 65 33  >pLeft ) sqlite3
4e10: 45 78 70 72 43 6c 65 61 72 28 64 62 2c 20 70 2d  ExprClear(db, p-
4e20: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 69  >pLeft);.      i
4e30: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 20 73  f( p->pRight ) s
4e40: 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 28  qlite3ExprClear(
4e50: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  db, p->pRight);.
4e60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4e70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4e80: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29  te(db, p->pLeft)
4e90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
4ea0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
4eb0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  >pRight);.    }.
4ec0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
4ed0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
4ee0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
4ef0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
4f00: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
4f10: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
4f20: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
4f30: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
4f40: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  db, p->x.pList);
4f50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4f60: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
4f70: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
4f80: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f  sion tree..*/.vo
4f90: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
4fa0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
4fb0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
4fc0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
4fd0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c  .  sqlite3ExprCl
4fe0: 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
4ff0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5000: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  p);.}../*.** The
5010: 20 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c   Expr.token fiel
5020: 64 20 6d 69 67 68 74 20 62 65 20 61 20 73 74 72  d might be a str
5030: 69 6e 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ing literal that
5040: 20 69 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49   is quoted..** I
5050: 66 20 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65  f so, remove the
5060: 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73   quotation marks
5070: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5080: 33 44 65 71 75 6f 74 65 45 78 70 72 28 73 71 6c  3DequoteExpr(sql
5090: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
50a0: 70 29 7b 0a 20 20 69 66 28 20 21 45 78 70 72 48  p){.  if( !ExprH
50b0: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c  asAnyProperty(p,
50c0: 20 45 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b   EP_Dequoted) ){
50d0: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
50e0: 65 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f  erty(p, EP_Dequo
50f0: 74 65 64 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ted);.    assert
5100: 28 20 28 70 2d 3e 76 76 61 46 6c 61 67 73 20 26  ( (p->vvaFlags &
5110: 20 45 56 56 41 5f 52 65 61 64 4f 6e 6c 79 54 6f   EVVA_ReadOnlyTo
5120: 6b 65 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 73  ken)==0 );.    s
5130: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28 63  qlite3Dequote((c
5140: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  har*)p->token.z)
5150: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
5160: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5170: 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61   of bytes alloca
5180: 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72  ted for the expr
5190: 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65  ession structure
51a0: 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74   .** passed as t
51b0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
51c0: 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  t. This is alway
51d0: 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55  s one of EXPR_FU
51e0: 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f  LLSIZE,.** EXPR_
51f0: 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45  REDUCEDSIZE or E
5200: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
5210: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
5220: 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28   exprStructSize(
5230: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5240: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5250: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
5260: 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54   ) return EXPR_T
5270: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20  OKENONLYSIZE;.  
5280: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
5290: 72 74 79 28 70 2c 20 45 50 5f 53 70 61 6e 4f 6e  rty(p, EP_SpanOn
52a0: 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ly) ) return EXP
52b0: 52 5f 53 50 41 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  R_SPANONLYSIZE;.
52c0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
52d0: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
52e0: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
52f0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
5300: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
5310: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
5320: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
5330: 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
5340: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  d to create a co
5350: 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  py of expression
5360: 20 70 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 45   p with.** the E
5370: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
5380: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
5390: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20  econd argument. 
53a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
53b0: 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70  * returns the sp
53c0: 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
53d0: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
53e0: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
53f0: 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 69 73 20 69 73  only..** This is
5400: 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45   always one of E
5410: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
5420: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
5430: 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  r EXPR_TOKENONLY
5440: 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  SIZE..*/.static 
5450: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74 72  int dupedExprStr
5460: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 2c  uctSize(Expr *p,
5470: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
5480: 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20  nt nSize;.  if( 
5490: 30 3d 3d 28 66 6c 61 67 73 26 45 58 50 52 44 55  0==(flags&EXPRDU
54a0: 50 5f 52 45 44 55 43 45 29 20 29 7b 0a 20 20 20  P_REDUCE) ){.   
54b0: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55   nSize = EXPR_FU
54c0: 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 20  LLSIZE;.  }else 
54d0: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
54e0: 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20 70 2d 3e  p->pRight || p->
54f0: 70 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78 2e 70 4c  pColl || p->x.pL
5500: 69 73 74 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  ist ){.    nSize
5510: 20 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53   = EXPR_REDUCEDS
5520: 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  IZE;.  }else if(
5530: 20 66 6c 61 67 73 26 28 45 58 50 52 44 55 50 5f   flags&(EXPRDUP_
5540: 53 50 41 4e 7c 45 58 50 52 44 55 50 5f 44 49 53  SPAN|EXPRDUP_DIS
5550: 54 49 4e 43 54 53 50 41 4e 29 20 29 7b 0a 20 20  TINCTSPAN) ){.  
5560: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 53    nSize = EXPR_S
5570: 50 41 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 7d  PANONLYSIZE;.  }
5580: 65 6c 73 65 7b 0a 20 20 20 20 6e 53 69 7a 65 20  else{.    nSize 
5590: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
55a0: 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SIZE;.  }.  retu
55b0: 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nSize;.}../*.
55c0: 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  ** sqlite3ExprDu
55d0: 70 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  p() has been cal
55e0: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
55f0: 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
5600: 6f 6e 20 70 20 77 69 74 68 0a 2a 2a 20 74 68 65  on p with.** the
5610: 20 45 58 50 52 44 55 50 5f 58 58 58 20 70 61 73   EXPRDUP_XXX pas
5620: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
5630: 64 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  d argument. This
5640: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
5650: 73 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 69  s.** the space i
5660: 6e 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  n bytes required
5670: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
5680: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
5690: 74 72 75 63 74 75 72 65 0a 2a 2a 20 61 6e 64 20  tructure.** and 
56a0: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  the copies of th
56b0: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 61  e Expr.token.z a
56c0: 6e 64 20 45 78 70 72 2e 73 70 61 6e 2e 7a 20 28  nd Expr.span.z (
56d0: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 0a 2a  if applicable).*
56e0: 2a 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 73  * string buffers
56f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5700: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
5710: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
5720: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
5730: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
5740: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
5750: 73 29 20 2b 20 28 70 2d 3e 74 6f 6b 65 6e 2e 7a  s) + (p->token.z
5760: 20 3f 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 20 2b 20   ? p->token.n + 
5770: 31 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 28 66  1 : 0);.  if( (f
5780: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 44 49 53  lags&EXPRDUP_DIS
5790: 54 49 4e 43 54 53 50 41 4e 29 0a 20 20 20 7c 7c  TINCTSPAN).   ||
57a0: 20 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f   (flags&EXPRDUP_
57b0: 53 50 41 4e 20 26 26 20 28 70 2d 3e 74 6f 6b 65  SPAN && (p->toke
57c0: 6e 2e 7a 21 3d 70 2d 3e 73 70 61 6e 2e 7a 20 7c  n.z!=p->span.z |
57d0: 7c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 2d  | p->token.n!=p-
57e0: 3e 73 70 61 6e 2e 6e 29 29 20 0a 20 20 29 7b 0a  >span.n)) .  ){.
57f0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 70 2d 3e      nByte += p->
5800: 73 70 61 6e 2e 6e 3b 0a 20 20 7d 0a 20 20 72 65  span.n;.  }.  re
5810: 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74  turn ROUND8(nByt
5820: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
5830: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
5840: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
5850: 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70   to create a dup
5860: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a  licate of the .*
5870: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73  * expression pas
5880: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5890: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73   argument. The s
58a0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
58b0: 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74  s a.** mask cont
58c0: 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58  aining EXPRDUP_X
58d0: 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  XX flags..**.** 
58e0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
58f0: 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63  ed includes spac
5900: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  e to create a co
5910: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
5920: 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20  truct.** itself 
5930: 61 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72  and the buffer r
5940: 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78  eferred to by Ex
5950: 70 72 2e 74 6f 6b 65 6e 2c 20 69 66 20 61 6e 79  pr.token, if any
5960: 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 45 58 50  . If the .** EXP
5970: 52 44 55 50 5f 53 50 41 4e 20 66 6c 61 67 20 69  RDUP_SPAN flag i
5980: 73 20 73 65 74 2c 20 74 68 65 6e 20 73 70 61 63  s set, then spac
5990: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f  e to create a co
59a0: 70 79 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  py of the buffer
59b0: 0a 2a 2a 20 72 65 66 65 72 65 64 20 74 6f 20 62  .** refered to b
59c0: 79 20 45 78 70 72 2e 73 70 61 6e 20 69 73 20 61  y Expr.span is a
59d0: 6c 73 6f 20 69 6e 63 6c 75 64 65 64 2e 0a 2a 2a  lso included..**
59e0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
59f0: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
5a00: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
5a10: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
5a20: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
5a30: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
5a40: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
5a50: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
5a60: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
5a70: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
5a80: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
5a90: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
5aa0: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
5ab0: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
5ac0: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
5ad0: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
5ae0: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
5af0: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
5b00: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
5b10: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
5b20: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
5b30: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
5b40: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
5b50: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
5b60: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
5b70: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
5b80: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
5b90: 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73     int f = flags
5ba0: 26 28 7e 28 45 58 50 52 44 55 50 5f 53 50 41 4e  &(~(EXPRDUP_SPAN
5bb0: 7c 45 58 50 52 44 55 50 5f 44 49 53 54 49 4e 43  |EXPRDUP_DISTINC
5bc0: 54 53 50 41 4e 29 29 3b 0a 20 20 20 20 20 20 6e  TSPAN));.      n
5bd0: 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70  Byte += dupedExp
5be0: 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20  rSize(p->pLeft, 
5bf0: 66 29 20 2b 20 64 75 70 65 64 45 78 70 72 53 69  f) + dupedExprSi
5c00: 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 29  ze(p->pRight, f)
5c10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5c20: 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f  turn nByte;.}../
5c30: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5c40: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
5c50: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
5c60: 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
5c70: 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69  f pzBuffer .** i
5c80: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
5c90: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61 73 73  *pzBuffer is ass
5ca0: 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  umed to point to
5cb0: 20 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20   a buffer large 
5cc0: 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74  enough .** to st
5cd0: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20  ore the copy of 
5ce0: 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68  expression p, th
5cf0: 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 74  e copies of p->t
5d00: 6f 6b 65 6e 20 61 6e 64 20 70 2d 3e 73 70 61 6e  oken and p->span
5d10: 20 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61   .** (if applica
5d20: 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f  ble), and the co
5d30: 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70  pies of the p->p
5d40: 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67  Left and p->pRig
5d50: 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  ht expressions,.
5d60: 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72  ** if any. Befor
5d70: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
5d80: 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f  Buffer is set to
5d90: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
5da0: 70 61 73 73 65 64 20 74 68 65 0a 2a 2a 20 70 6f  passed the.** po
5db0: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66  rtion of the buf
5dc0: 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  fer copied into 
5dd0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
5de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
5df0: 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65   *exprDup(sqlite
5e00: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
5e10: 69 6e 74 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a  int flags, u8 **
5e20: 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70  pzBuffer){.  Exp
5e30: 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20  r *pNew = 0;    
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e50: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
5e60: 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20 70 20  turn */.  if( p 
5e70: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
5e80: 20 69 73 52 65 71 75 69 72 65 44 69 73 74 69 6e   isRequireDistin
5e90: 63 74 53 70 61 6e 20 3d 20 28 66 6c 61 67 73 26  ctSpan = (flags&
5ea0: 45 58 50 52 44 55 50 5f 44 49 53 54 49 4e 43 54  EXPRDUP_DISTINCT
5eb0: 53 50 41 4e 29 3b 0a 20 20 20 20 63 6f 6e 73 74  SPAN);.    const
5ec0: 20 69 6e 74 20 69 73 52 65 71 75 69 72 65 53 70   int isRequireSp
5ed0: 61 6e 20 3d 20 28 66 6c 61 67 73 26 28 45 58 50  an = (flags&(EXP
5ee0: 52 44 55 50 5f 53 50 41 4e 7c 45 58 50 52 44 55  RDUP_SPAN|EXPRDU
5ef0: 50 5f 44 49 53 54 49 4e 43 54 53 50 41 4e 29 29  P_DISTINCTSPAN))
5f00: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
5f10: 69 73 52 65 64 75 63 65 64 20 3d 20 28 66 6c 61  isReduced = (fla
5f20: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
5f30: 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a 41 6c 6c  E);.    u8 *zAll
5f40: 6f 63 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  oc;..    assert(
5f50: 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20   pzBuffer==0 || 
5f60: 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a 20 20  isReduced );..  
5f70: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
5f80: 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  where to write t
5f90: 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75  he new Expr stru
5fa0: 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69 66  cture. */.    if
5fb0: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
5fc0: 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a      zAlloc = *pz
5fd0: 42 75 66 66 65 72 3b 0a 20 20 20 20 7d 65 6c 73  Buffer;.    }els
5fe0: 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  e{.      zAlloc 
5ff0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6000: 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78  cRaw(db, dupedEx
6010: 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  prSize(p, flags)
6020: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
6030: 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c  w = (Expr *)zAll
6040: 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  oc;..    if( pNe
6050: 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65  w ){.      /* Se
6060: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
6070: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
6080: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
6090: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
60a0: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
60b0: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
60c0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
60d0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
60e0: 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f  r.      ** EXPR_
60f0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
6100: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
6110: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
6120: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
6130: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70     ** by the cop
6140: 79 20 6f 66 20 74 68 65 20 70 2d 3e 74 6f 6b 65  y of the p->toke
6150: 6e 2e 7a 20 73 74 72 69 6e 67 20 28 69 66 20 61  n.z string (if a
6160: 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ny)..      */.  
6170: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e      const int nN
6180: 65 77 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78  ewSize = dupedEx
6190: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
61a0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 63 6f  flags);.      co
61b0: 6e 73 74 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d  nst int nToken =
61c0: 20 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 3f 20 70   (p->token.z ? p
61d0: 2d 3e 74 6f 6b 65 6e 2e 6e 20 2b 20 31 20 3a 20  ->token.n + 1 : 
61e0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  0);.      if( is
61f0: 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20 20 20  Reduced ){.     
6200: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
6210: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6220: 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a  _Reduced)==0 );.
6230: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
6240: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69  Alloc, p, nNewSi
6250: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
6260: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  {.        int nS
6270: 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75 63 74  ize = exprStruct
6280: 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20  Size(p);.       
6290: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
62a0: 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  p, nSize);.     
62b0: 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f     memset(&zAllo
62c0: 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50  c[nSize], 0, EXP
62d0: 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65  R_FULLSIZE-nSize
62e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
62f0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f    /* Set the EP_
6300: 52 65 64 75 63 65 64 20 61 6e 64 20 45 50 5f 54  Reduced and EP_T
6310: 6f 6b 65 6e 4f 6e 6c 79 20 66 6c 61 67 73 20 61  okenOnly flags a
6320: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f  ppropriately. */
6330: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
6340: 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63  gs &= ~(EP_Reduc
6350: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  ed|EP_TokenOnly|
6360: 45 50 5f 53 70 61 6e 4f 6e 6c 79 29 3b 0a 20 20  EP_SpanOnly);.  
6370: 20 20 20 20 73 77 69 74 63 68 28 20 6e 4e 65 77      switch( nNew
6380: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
6390: 63 61 73 65 20 45 58 50 52 5f 52 45 44 55 43 45  case EXPR_REDUCE
63a0: 44 53 49 5a 45 3a 20 20 20 70 4e 65 77 2d 3e 66  DSIZE:   pNew->f
63b0: 6c 61 67 73 20 7c 3d 20 45 50 5f 52 65 64 75 63  lags |= EP_Reduc
63c0: 65 64 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ed; break;.     
63d0: 20 20 20 63 61 73 65 20 45 58 50 52 5f 54 4f 4b     case EXPR_TOK
63e0: 45 4e 4f 4e 4c 59 53 49 5a 45 3a 20 70 4e 65 77  ENONLYSIZE: pNew
63f0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 54 6f  ->flags |= EP_To
6400: 6b 65 6e 4f 6e 6c 79 3b 20 62 72 65 61 6b 3b 0a  kenOnly; break;.
6410: 20 20 20 20 20 20 20 20 63 61 73 65 20 45 58 50          case EXP
6420: 52 5f 53 50 41 4e 4f 4e 4c 59 53 49 5a 45 3a 20  R_SPANONLYSIZE: 
6430: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
6440: 45 50 5f 53 70 61 6e 4f 6e 6c 79 3b 20 62 72 65  EP_SpanOnly; bre
6450: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
6460: 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70     /* Copy the p
6470: 2d 3e 74 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20  ->token string, 
6480: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20  if any. */.     
6490: 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20   if( nToken ){. 
64a0: 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
64b0: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 26  char *zToken = &
64c0: 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d  zAlloc[nNewSize]
64d0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
64e0: 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 74 6f 6b 65  (zToken, p->toke
64f0: 6e 2e 7a 2c 20 6e 54 6f 6b 65 6e 2d 31 29 3b 0a  n.z, nToken-1);.
6500: 20 20 20 20 20 20 20 20 7a 54 6f 6b 65 6e 5b 6e          zToken[n
6510: 54 6f 6b 65 6e 2d 31 5d 20 3d 20 27 5c 30 27 3b  Token-1] = '\0';
6520: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 74  .        pNew->t
6530: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
6540: 20 20 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65        pNew->toke
6550: 6e 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20  n.z = zToken;.  
6560: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
6570: 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70   0==((p->flags|p
6580: 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50  New->flags) & EP
6590: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
65a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
65b0: 6e 20 74 68 65 20 70 4e 65 77 2d 3e 73 70 61 6e  n the pNew->span
65c0: 20 74 6f 6b 65 6e 2c 20 69 66 20 72 65 71 75 69   token, if requi
65d0: 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  red. */.        
65e0: 69 66 28 20 69 73 52 65 71 75 69 72 65 53 70 61  if( isRequireSpa
65f0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
6600: 66 28 20 69 73 52 65 71 75 69 72 65 44 69 73 74  f( isRequireDist
6610: 69 6e 63 74 53 70 61 6e 20 0a 20 20 20 20 20 20  inctSpan .      
6620: 20 20 20 20 20 7c 7c 20 70 2d 3e 74 6f 6b 65 6e       || p->token
6630: 2e 7a 21 3d 70 2d 3e 73 70 61 6e 2e 7a 20 7c 7c  .z!=p->span.z ||
6640: 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 2d 3e   p->token.n!=p->
6650: 73 70 61 6e 2e 6e 0a 20 20 20 20 20 20 20 20 20  span.n.         
6660: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6670: 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 26  pNew->span.z = &
6680: 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 2b  zAlloc[nNewSize+
6690: 6e 54 6f 6b 65 6e 5d 3b 0a 20 20 20 20 20 20 20  nToken];.       
66a0: 20 20 20 20 20 6d 65 6d 63 70 79 28 28 63 68 61       memcpy((cha
66b0: 72 20 2a 29 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a  r *)pNew->span.z
66c0: 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  , p->span.z, p->
66d0: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20  span.n);.       
66e0: 20 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e       pNew->span.
66f0: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
6700: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6710: 20 20 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e        pNew->span
6720: 2e 7a 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .z = pNew->token
6730: 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  .z;.            
6740: 70 4e 65 77 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70  pNew->span.n = p
6750: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  New->token.n;.  
6760: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6780: 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20     pNew->span.z 
6790: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
67a0: 4e 65 77 2d 3e 73 70 61 6e 2e 6e 20 3d 20 30 3b  New->span.n = 0;
67b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
67c0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d   }..      if( 0=
67d0: 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77  =((p->flags|pNew
67e0: 2d 3e 66 6c 61 67 73 29 20 26 20 28 45 50 5f 54  ->flags) & (EP_T
67f0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 70 61 6e  okenOnly|EP_Span
6800: 4f 6e 6c 79 29 29 20 29 7b 0a 20 20 20 20 20 20  Only)) ){.      
6810: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
6820: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
6830: 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73   or pNew->x.pLis
6840: 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  t member. */.   
6850: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
6860: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
6870: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
6880: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
6890: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
68a0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
68b0: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 73 52 65  >x.pSelect, isRe
68c0: 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20  duced);.        
68d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
68e0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
68f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6900: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
6910: 73 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a  st, isReduced);.
6920: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6930: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  }..      /* Fill
6940: 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20   in pNew->pLeft 
6950: 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  and pNew->pRight
6960: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  . */.      if( E
6970: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
6980: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
6990: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  ed|EP_TokenOnly|
69a0: 45 50 5f 53 70 61 6e 4f 6e 6c 79 29 20 29 7b 0a  EP_SpanOnly) ){.
69b0: 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b          zAlloc +
69c0: 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  = dupedExprNodeS
69d0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20  ize(p, flags);. 
69e0: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
69f0: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
6a00: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a   EP_Reduced) ){.
6a10: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6a20: 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70 28  pLeft = exprDup(
6a30: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58  db, p->pLeft, EX
6a40: 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a  PRDUP_REDUCE, &z
6a50: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  Alloc);.        
6a60: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
6a70: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
6a80: 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f  pRight, EXPRDUP_
6a90: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
6aa0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6ab0: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
6ac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
6ad0: 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63  zBuffer = zAlloc
6ae0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6af0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 45 78 70    }else if( !Exp
6b00: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
6b10: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
6b20: 45 50 5f 53 70 61 6e 4f 6e 6c 79 29 20 29 7b 0a  EP_SpanOnly) ){.
6b30: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
6b40: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
6b50: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66  rDup(db, p->pLef
6b60: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
6b70: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  New->pRight = sq
6b80: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
6b90: 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a   p->pRight, 0);.
6ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6bb0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
6bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
6bd0: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
6be0: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
6bf0: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
6c00: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
6c10: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
6c20: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
6c30: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
6c40: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
6c50: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
6c60: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
6c70: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
6c80: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
6c90: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
6ca0: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
6cb0: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
6cc0: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
6cd0: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
6ce0: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
6cf0: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
6d00: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
6d10: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
6d20: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
6d30: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
6d40: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
6d50: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
6d60: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
6d70: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
6d80: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
6d90: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
6da0: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
6db0: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
6dc0: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
6dd0: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
6de0: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
6df0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
6e00: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
6e10: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
6e20: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 45 58 50 52  . If.** the EXPR
6e30: 44 55 50 5f 53 50 41 4e 20 66 6c 61 67 20 69 73  DUP_SPAN flag is
6e40: 20 73 65 74 20 69 6e 20 74 68 65 20 61 72 67 75   set in the argu
6e50: 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2c 20  ment parameter, 
6e60: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 45 78 70  then the .** Exp
6e70: 72 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f 66 20  r.span field of 
6e80: 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73  the input expres
6e90: 73 69 6f 6e 20 69 73 20 63 6f 70 69 65 64 2e 20  sion is copied. 
6ea0: 49 66 20 45 58 50 52 44 55 50 5f 53 50 41 4e 20  If EXPRDUP_SPAN 
6eb0: 69 73 0a 2a 2a 20 63 6c 65 61 72 2c 20 74 68 65  is.** clear, the
6ec0: 6e 20 74 68 65 20 45 78 70 72 2e 73 70 61 6e 20  n the Expr.span 
6ed0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 72 65 74  field of the ret
6ee0: 75 72 6e 65 64 20 65 78 70 72 65 73 73 69 6f 6e  urned expression
6ef0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73   structure.** is
6f00: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   zeroed..**.** I
6f10: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
6f20: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
6f30: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
6f40: 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73  ture returned is
6f50: 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20   a.** truncated 
6f60: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75  version of the u
6f70: 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74  sual Expr struct
6f80: 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
6f90: 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61   stored as.** pa
6fa0: 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  rt of the in-mem
6fb0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
6fc0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
6fd0: 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78  se schema..*/.Ex
6fe0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
6ff0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
7000: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
7010: 67 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  gs){.  return ex
7020: 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61  prDup(db, p, fla
7030: 67 73 2c 20 30 29 3b 0a 7d 0a 76 6f 69 64 20 73  gs, 0);.}.void s
7040: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
7050: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
7060: 65 6e 20 2a 70 54 6f 2c 20 63 6f 6e 73 74 20 54  en *pTo, const T
7070: 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  oken *pFrom){.  
7080: 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73  if( pTo->dyn ) s
7090: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
70a0: 20 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b   (char*)pTo->z);
70b0: 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20  .  if( pFrom->z 
70c0: 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20  ){.    pTo->n = 
70d0: 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54  pFrom->n;.    pT
70e0: 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69  o->z = (u8*)sqli
70f0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
7100: 20 28 63 68 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a   (char*)pFrom->z
7110: 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20  , pFrom->n);.   
7120: 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20   pTo->dyn = 1;. 
7130: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d   }else{.    pTo-
7140: 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78  >z = 0;.  }.}.Ex
7150: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
7160: 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74  xprListDup(sqlit
7170: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
7180: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7190: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65  .  ExprList *pNe
71a0: 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  w;.  struct Expr
71b0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
71c0: 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69  , *pOldItem;.  i
71d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt i;.  if( p==0
71e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
71f0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
7200: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
7210: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
7220: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
7230: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
7240: 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  iECursor = 0;.  
7250: 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e  pNew->nExpr = pN
7260: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
7270: 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61  nExpr;.  pNew->a
7280: 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74   = pItem = sqlit
7290: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
72a0: 2c 20 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65  ,  p->nExpr*size
72b0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
72c0: 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b   if( pItem==0 ){
72d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
72e0: 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ee(db, pNew);.  
72f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
7300: 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d  .  pOldItem = p-
7310: 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  >a;.  for(i=0; i
7320: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  <p->nExpr; i++, 
7330: 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65  pItem++, pOldIte
7340: 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
7350: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78  pNewExpr;.    Ex
7360: 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70  pr *pOldExpr = p
7370: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  OldItem->pExpr;.
7380: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
7390: 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71   = pNewExpr = sq
73a0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
73b0: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
73c0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
73d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
73e0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
73f0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7400: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
7410: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
7420: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
7430: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
7440: 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d 20 70   pItem->iCol = p
7450: 4f 6c 64 49 74 65 6d 2d 3e 69 43 6f 6c 3b 0a 20  OldItem->iCol;. 
7460: 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
7470: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c   = pOldItem->iAl
7480: 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ias;.  }.  retur
7490: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
74a0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
74b0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
74c0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
74d0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
74e0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
74f0: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
7500: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
7510: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
7520: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
7530: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
7540: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
7550: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
7560: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
7570: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
7580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
7590: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
75a0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
75b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
75c0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
75d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
75e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
75f0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
7600: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
7610: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
7620: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7630: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
7640: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
7650: 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  yte;.  if( p==0 
7660: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
7670: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
7680: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
7690: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
76a0: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
76b0: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
76c0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
76d0: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
76e0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
76f0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
7700: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
7710: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
7720: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
7730: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
7740: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
7750: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
7760: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
7770: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
7780: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
7790: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
77a0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
77b0: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
77c0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
77d0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
77e0: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
77f0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
7800: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
7810: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
7820: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
7830: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
7840: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7850: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7860: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
7870: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d  Item->jointype =
7880: 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pOldItem->joint
7890: 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ype;.    pNewIte
78a0: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
78b0: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
78c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73      pNewItem->is
78d0: 50 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64  Populated = pOld
78e0: 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
78f0: 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  d;.    pNewItem-
7900: 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65  >zIndex = sqlite
7910: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
7920: 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b  ldItem->zIndex);
7930: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e  .    pNewItem->n
7940: 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64  otIndexed = pOld
7950: 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
7960: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7970: 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65  pIndex = pOldIte
7980: 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70  m->pIndex;.    p
7990: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
79a0: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
79b0: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
79c0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
79d0: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  b->nRef++;.    }
79e0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
79f0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
7a00: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f  SelectDup(db, pO
7a10: 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  ldItem->pSelect,
7a20: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
7a30: 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c  wItem->pOn = sql
7a40: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7a50: 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66  pOldItem->pOn, f
7a60: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
7a70: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
7a80: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64  lite3IdListDup(d
7a90: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73  b, pOldItem->pUs
7aa0: 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ing);.    pNewIt
7ab0: 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f  em->colUsed = pO
7ac0: 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  ldItem->colUsed;
7ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
7ae0: 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71  ew;.}.IdList *sq
7af0: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73  lite3IdListDup(s
7b00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
7b10: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
7b20: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
7b30: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
7b40: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
7b50: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7b60: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
7b70: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
7b80: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
7b90: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
7ba0: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
7bb0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
7bc0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
7bd0: 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49  locRaw(db, p->nI
7be0: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
7bf0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
7c00: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
7c10: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7c20: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
7c30: 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
7c40: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
7c50: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
7c60: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
7c70: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
7c80: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
7c90: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
7ca0: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
7cb0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
7cc0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7cd0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7ce0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
7cf0: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
7d00: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
7d10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
7d20: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
7d30: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
7d40: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
7d50: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
7d60: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
7d70: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
7d80: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
7d90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7da0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
7db0: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  p) );.  if( pNew
7dc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7dd0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65    /* Always make
7de0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
7df0: 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65  pan for top-leve
7e00: 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  l expressions in
7e10: 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
7e20: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20  sion list.  The 
7e30: 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20  logic in SELECT 
7e40: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
7e50: 64 65 74 65 72 6d 69 6e 65 73 0a 20 20 2a 2a 20  determines.  ** 
7e60: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
7e70: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
7e80: 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68 69  lt set needs thi
7e90: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  s information */
7ea0: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
7eb0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
7ec0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
7ed0: 73 74 2c 20 66 6c 61 67 73 7c 45 58 50 52 44 55  st, flags|EXPRDU
7ee0: 50 5f 53 50 41 4e 29 3b 0a 20 20 70 4e 65 77 2d  P_SPAN);.  pNew-
7ef0: 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
7f00: 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  rcListDup(db, p-
7f10: 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20  >pSrc, flags);. 
7f20: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
7f30: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7f40: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
7f50: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  ags);.  pNew->pG
7f60: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
7f70: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
7f80: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
7f90: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  gs);.  pNew->pHa
7fa0: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
7fb0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
7fc0: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
7fd0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
7fe0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7ff0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
8000: 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  rBy, flags);.  p
8010: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
8020: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
8030: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
8040: 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  up(db, p->pPrior
8050: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8060: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
8070: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
8080: 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b  >pLimit, flags);
8090: 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
80a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
80b0: 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  p(db, p->pOffset
80c0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
80d0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
80e0: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
80f0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  0;.  pNew->selFl
8100: 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
8110: 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65  s & ~SF_UsesEphe
8120: 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70  meral;.  pNew->p
8130: 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20  Rightmost = 0;. 
8140: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
8150: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[0] = -1;.  p
8160: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
8170: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[1] = -1;.  pNe
8180: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
8190: 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  2] = -1;.  retur
81a0: 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a  n pNew;.}.#else.
81b0: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
81c0: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
81d0: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c   *db, Select *p,
81e0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
81f0: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
8200: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
8210: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
8220: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
8230: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
8240: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
8250: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
8260: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
8270: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
8280: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
8290: 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  t..*/.ExprList *
82a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
82b0: 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a  ppend(.  Parse *
82c0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
82d0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
82e0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
82f0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
8300: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
8310: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
8320: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
8330: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
8340: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
8350: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
8360: 6e 64 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  nded */.  Token 
8370: 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *pName          
8380: 20 20 2f 2a 20 41 53 20 6b 65 79 77 6f 72 64 20    /* AS keyword 
8390: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
83a0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  on */.){.  sqlit
83b0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
83c0: 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  >db;.  if( pList
83d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
83e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
83f0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
8400: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
8410: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
8420: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
8430: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
8440: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
8450: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a  Alloc==0 );.  }.
8460: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c    if( pList->nAl
8470: 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  loc<=pList->nExp
8480: 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  r ){.    struct 
8490: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
84a0: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c  ;.    int n = pL
84b0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
84c0: 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  4;.    a = sqlit
84d0: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
84e0: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
84f0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
8500: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
8510: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
8520: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
8530: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20  List->a = a;.   
8540: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
8550: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8560: 53 69 7a 65 28 64 62 2c 20 61 29 2f 73 69 7a 65  Size(db, a)/size
8570: 6f 66 28 61 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  of(a[0]);.  }.  
8580: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
8590: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78  !=0 );.  if( pEx
85a0: 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20  pr || pName ){. 
85b0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
85c0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
85d0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
85e0: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20  ->nExpr++];.    
85f0: 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c  memset(pItem, 0,
8600: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29   sizeof(*pItem))
8610: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
8620: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
8630: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
8640: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
8650: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
8660: 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61      pItem->iAlia
8670: 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  s = 0;.  }.  ret
8680: 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d  urn pList;..no_m
8690: 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76  em:     .  /* Av
86a0: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
86b0: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73  ry if malloc has
86c0: 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71   failed. */.  sq
86d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
86e0: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
86f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8700: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
8710: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
8720: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
8730: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
8740: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
8750: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
8760: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
8770: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
8780: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
8790: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
87a0: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
87b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
87c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
87d0: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
87e0: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
87f0: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
8800: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
8810: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
8820: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
8830: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
8840: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
8850: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
8860: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
8870: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
8880: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
8890: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
88a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
88b0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
88c0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
88d0: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
88e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
88f0: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
8900: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
8910: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8920: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
8930: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
8940: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
8950: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
8960: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
8970: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
8980: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
8990: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
89a0: 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70   || (pList->nExp
89b0: 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e  r==0 && pList->n
89c0: 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61  Alloc==0) );.  a
89d0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
89e0: 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  xpr<=pList->nAll
89f0: 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  oc );.  for(pIte
8a00: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
8a10: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
8a20: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
8a30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8a40: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
8a50: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
8a60: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8a70: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
8a80: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
8a90: 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b  e(db, pList->a);
8aa0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
8ab0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
8ac0: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  /*.** These rout
8ad0: 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20  ines are Walker 
8ae0: 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c 6b  callbacks.  Walk
8af0: 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70 6f 69  er.u.pi is a poi
8b00: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e  nter.** to an in
8b10: 74 65 67 65 72 2e 20 20 54 68 65 73 65 20 72 6f  teger.  These ro
8b20: 75 74 69 6e 65 73 20 61 72 65 20 63 68 65 63 6b  utines are check
8b30: 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ing an expressio
8b40: 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 69  n to see.** if i
8b50: 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2e  t is a constant.
8b60: 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75 2e    Set *Walker.u.
8b70: 70 69 20 74 6f 20 30 20 69 66 20 74 68 65 20 65  pi to 0 if the e
8b80: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
8b90: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a  not constant..**
8ba0: 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61  .** These callba
8bb0: 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ck routines are 
8bc0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
8bd0: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  t the following:
8be0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
8bf0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
8c00: 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  ().**     sqlite
8c10: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
8c20: 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20 20 20  otJoin().**     
8c30: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
8c40: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
8c50: 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ).**.*/.static i
8c60: 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
8c70: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
8c80: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
8c90: 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57  pr){..  /* If pW
8ca0: 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20 33 20  alker->u.i is 3 
8cb0: 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66  then any term of
8cc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8cd0: 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a  that comes from.
8ce0: 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55    ** the ON or U
8cf0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
8d00: 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  a join disqualif
8d10: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
8d20: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
8d30: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
8d40: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
8d50: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33   pWalker->u.i==3
8d60: 20 26 26 20 45 78 70 72 48 61 73 41 6e 79 50 72   && ExprHasAnyPr
8d70: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
8d80: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
8d90: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d    pWalker->u.i =
8da0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
8db0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
8dc0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
8dd0: 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e  op ){.    /* Con
8de0: 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  sider functions 
8df0: 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69  to be constant i
8e00: 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75  f all their argu
8e10: 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61  ments are consta
8e20: 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70 57  nt.    ** and pW
8e30: 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f  alker->u.i==2 */
8e40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
8e50: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
8e60: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32   pWalker->u.i==2
8e70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
8e80: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
8e90: 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
8ea0: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
8eb0: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
8ec0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
8ed0: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
8ee0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e  AGG_COLUMN:.#ifn
8ef0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8f00: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
8f10: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
8f20: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
8f30: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8f40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
8f50: 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 74  ELECT );.      t
8f60: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
8f70: 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
8f80: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 74 65  .#endif.      te
8f90: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
8fa0: 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20  p==TK_ID );.    
8fb0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
8fc0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
8fd0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8fe0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
8ff0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
9000: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9010: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
9020: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
9030: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69      pWalker->u.i
9040: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
9050: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
9060: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
9070: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
9080: 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  inue;.  }.}.stat
9090: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64  ic int selectNod
90a0: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
90b0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
90c0: 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ect *NotUsed){. 
90d0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
90e0: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57  R(NotUsed);.  pW
90f0: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
9100: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
9110: 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rt;.}.static int
9120: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70   exprIsConst(Exp
9130: 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c  r *p, int initFl
9140: 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ag){.  Walker w;
9150: 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46  .  w.u.i = initF
9160: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
9170: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
9180: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
9190: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
91a0: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
91b0: 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74  onstant;.  sqlit
91c0: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
91d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e  );.  return w.u.
91e0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  i;.}../*.** Walk
91f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
9200: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
9210: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9220: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
9230: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
9240: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
9250: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
9260: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
9270: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
9280: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
9290: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
92a0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
92b0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
92c0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
92d0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
92e0: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
92f0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
9300: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
9310: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
9320: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
9330: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
9340: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 1);.}../*.** W
9350: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9360: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9370: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9380: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9390: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
93a0: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
93b0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
93c0: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
93d0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
93e0: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
93f0: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
9400: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
9410: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
9420: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
9430: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
9440: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
9450: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
9460: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
9470: 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 3);.}../*
9480: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
9490: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
94a0: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
94b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
94c0: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
94d0: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
94e0: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
94f0: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
9500: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
9510: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
9520: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
9530: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
9540: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
9550: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
9560: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
9570: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
9580: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
9590: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
95a0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
95b0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
95c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
95d0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
95e0: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
95f0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
9600: 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d  IsConst(p, 2);.}
9610: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
9620: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
9630: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
9640: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
9650: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
9660: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
9670: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
9680: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
9690: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
96a0: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
96b0: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
96c0: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
96d0: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
96e0: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
96f0: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
9700: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
9710: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
9720: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
9730: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
9740: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
9750: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
9760: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
9770: 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  rc = 0;.  if( p-
9780: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
9790: 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61  alue ){.    *pVa
97a0: 6c 75 65 20 3d 20 70 2d 3e 69 54 61 62 6c 65 3b  lue = p->iTable;
97b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
97c0: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e   }.  switch( p->
97d0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
97e0: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
97f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 47     rc = sqlite3G
9800: 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a 29 70  etInt32((char*)p
9810: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75  ->token.z, pValu
9820: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
9830: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9840: 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
9850: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78    rc = sqlite3Ex
9860: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
9870: 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20  Left, pValue);. 
9880: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9890: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
98a0: 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INUS: {.      in
98b0: 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73  t v;.      if( s
98c0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
98d0: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76  ger(p->pLeft, &v
98e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) ){.        *pV
98f0: 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
9900: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
9910: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
9920: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
9930: 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  t: break;.  }.  
9940: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 2d  if( rc ){.    p-
9950: 3e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52  >op = TK_INTEGER
9960: 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  ;.    p->flags |
9970: 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
9980: 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 2a     p->iTable = *
9990: 70 56 61 6c 75 65 3b 0a 20 20 7d 0a 20 20 72 65  pValue;.  }.  re
99a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
99b0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
99c0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
99d0: 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
99e0: 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
99f0: 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
9a00: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
9a10: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
9a20: 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
9a30: 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
9a40: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
9a50: 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
9a60: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
9a70: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
9a80: 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
9a90: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
9aa0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
9ab0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
9ac0: 65 20 69 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e if the IN oper
9ad0: 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ator optimizatio
9ae0: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64  n is enabled and
9af0: 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43 54 20 73  .** the SELECT s
9b00: 74 61 74 65 6d 65 6e 74 20 70 20 65 78 69 73 74  tatement p exist
9b10: 73 20 61 6e 64 20 69 73 20 6f 66 20 74 68 65 0a  s and is of the.
9b20: 2a 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a  ** simple form:.
9b30: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
9b40: 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c   <column> FROM <
9b50: 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
9b60: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
9b70: 2c 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73  , it may be poss
9b80: 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 20 65  ible to use an e
9b90: 78 69 73 74 69 6e 67 20 74 61 62 6c 65 0a 2a 2a  xisting table.**
9ba0: 20 6f 72 20 69 6e 64 65 78 20 69 6e 73 74 65 61   or index instea
9bb0: 64 20 6f 66 20 67 65 6e 65 72 61 74 69 6e 67 20  d of generating 
9bc0: 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
9bd0: 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
9be0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
9bf0: 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69  ERY.static int i
9c00: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
9c10: 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  pt(Select *p){. 
9c20: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
9c30: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
9c40: 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
9c50: 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
9c60: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
9c80: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
9c90: 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a  f IN is SELECT *
9ca0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
9cb0: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  r ) return 0;   
9cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
9cd0: 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  t a compound SEL
9ce0: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
9cf0: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
9d00: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
9d10: 67 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 72  gate) ){.      r
9d20: 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44  eturn 0; /* No D
9d30: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
9d40: 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
9d50: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
9d60: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  }.  if( p->pGrou
9d70: 70 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  pBy ) return 0; 
9d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
9d90: 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
9da0: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
9db0: 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
9dc0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9dd0: 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
9de0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
9df0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65   p->pOffset ) re
9e00: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
9e10: 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
9e20: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9e30: 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45   /* Has no WHERE
9e40: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72   clause */.  pSr
9e50: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
9e60: 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
9e70: 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53  ;.  if( pSrc->nS
9e80: 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
9e90: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
9ea0: 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f  ngle term in FRO
9eb0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  M clause */.  if
9ec0: 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ( pSrc->a[0].pSe
9ed0: 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
9ee0: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
9ef0: 75 73 65 20 69 73 20 6e 6f 74 20 61 20 73 75 62  use is not a sub
9f00: 71 75 65 72 79 20 2a 2f 0a 20 20 70 54 61 62 20  query */.  pTab 
9f10: 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
9f20: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  b;.  if( pTab==0
9f30: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
9f40: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
9f50: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
9f60: 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
9f70: 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69  ause is not a vi
9f80: 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  ew */.  if( IsVi
9f90: 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
9fa0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f  turn 0;        /
9fb0: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f  * FROM clause no
9fc0: 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
9fd0: 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
9fe0: 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
9ff0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
a000: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
a010: 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d      /* One colum
a020: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
a030: 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c  set */.  if( pEL
a040: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
a050: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
a060: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65   return 0; /* Re
a070: 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sult is a column
a080: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
a090: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a0a0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
a0b0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
a0c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
a0d0: 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
a0e0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  tation of the IN
a0f0: 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e   (...) operator.
a100: 0a 2a 2a 20 49 74 27 73 20 6a 6f 62 20 69 73 20  .** It's job is 
a110: 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  to find or creat
a120: 65 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63  e a b-tree struc
a130: 74 75 72 65 20 74 68 61 74 20 6d 61 79 20 62 65  ture that may be
a140: 20 75 73 65 64 0a 2a 2a 20 65 69 74 68 65 72 20   used.** either 
a150: 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62  to test for memb
a160: 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 28 2e  ership of the (.
a170: 2e 2e 29 20 73 65 74 20 6f 72 20 74 6f 20 69 74  ..) set or to it
a180: 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a  erate through.**
a190: 20 69 74 73 20 6d 65 6d 62 65 72 73 2c 20 73 6b   its members, sk
a1a0: 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
a1b0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72  s..**.** The cur
a1c0: 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  sor opened on th
a1d0: 65 20 73 74 72 75 63 74 75 72 65 20 28 64 61 74  e structure (dat
a1e0: 61 62 61 73 65 20 74 61 62 6c 65 2c 20 64 61 74  abase table, dat
a1f0: 61 62 61 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20  abase index .** 
a200: 6f 72 20 65 70 68 65 72 6d 61 6c 20 74 61 62 6c  or ephermal tabl
a210: 65 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  e) is stored in 
a220: 70 58 2d 3e 69 54 61 62 6c 65 20 62 65 66 6f 72  pX->iTable befor
a230: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
a240: 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20  returns..** The 
a250: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
a260: 6e 64 69 63 61 74 65 73 20 74 68 65 20 73 74 72  ndicates the str
a270: 75 63 74 75 72 65 20 74 79 70 65 2c 20 61 73 20  ucture type, as 
a280: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
a290: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
a2a0: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
a2b0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
a2c0: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
a2d0: 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
a2e0: 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
a2f0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
a300: 74 61 62 61 73 65 20 69 6e 64 65 78 2e 0a 2a 2a  tabase index..**
a310: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20     IN_INDEX_EPH 
a320: 2d 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 77  -   The cursor w
a330: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73  as opened on a s
a340: 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64  pecially created
a350: 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
a360: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
a370: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
a380: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  able..**.** An e
a390: 78 69 73 74 69 6e 67 20 73 74 72 75 63 74 75 72  xisting structur
a3a0: 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  e may only be us
a3b0: 65 64 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ed if the SELECT
a3c0: 20 69 73 20 6f 66 20 74 68 65 20 73 69 6d 70 6c   is of the simpl
a3d0: 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  e.** form:.**.**
a3e0: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
a3f0: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
a400: 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 72 4e 6f 74  >.**.** If prNot
a410: 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  Found parameter 
a420: 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20 73  is 0, then the s
a430: 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 62 65  tructure will be
a440: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
a450: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
a460: 73 65 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69  set members, ski
a470: 70 70 69 6e 67 20 61 6e 79 20 64 75 70 6c 69 63  pping any duplic
a480: 61 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ates. In this ca
a490: 73 65 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65 6d  se an.** epherem
a4a0: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  al table must be
a4b0: 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65   used unless the
a4c0: 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d   selected <colum
a4d0: 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  n> is guaranteed
a4e0: 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65  .** to be unique
a4f0: 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73   - either becaus
a500: 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47  e it is an INTEG
a510: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ER PRIMARY KEY o
a520: 72 20 69 74 0a 2a 2a 20 69 73 20 75 6e 69 71 75  r it.** is uniqu
a530: 65 20 62 79 20 76 69 72 74 75 65 20 6f 66 20 61  e by virtue of a
a540: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69   constraint or i
a550: 6d 70 6c 69 63 69 74 20 69 6e 64 65 78 2e 0a 2a  mplicit index..*
a560: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f  *.** If the prNo
a570: 74 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72  tFound parameter
a580: 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
a590: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 77 69  the structure wi
a5a0: 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ll be used .** f
a5b0: 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62  or fast set memb
a5c0: 65 72 73 68 69 70 20 74 65 73 74 73 2e 20 49 6e  ership tests. In
a5d0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 20 65 70   this case an ep
a5e0: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
a5f0: 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75  st .** be used u
a600: 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69  nless <column> i
a610: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
a620: 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69  MARY KEY or an i
a630: 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20  ndex can .** be 
a640: 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75  found with <colu
a650: 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  mn> as its left-
a660: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a  most column..**.
a670: 2a 2a 20 57 68 65 6e 20 74 68 65 20 73 74 72 75  ** When the stru
a680: 63 74 75 72 65 20 69 73 20 62 65 69 6e 67 20 75  cture is being u
a690: 73 65 64 20 66 6f 72 20 73 65 74 20 6d 65 6d 62  sed for set memb
a6a0: 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68  ership tests, th
a6b0: 65 20 75 73 65 72 0a 2a 2a 20 6e 65 65 64 73 20  e user.** needs 
a6c0: 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20  to know whether 
a6d0: 6f 72 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63  or not the struc
a6e0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ture contains an
a6f0: 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61   SQL NULL .** va
a700: 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  lue in order to 
a710: 63 6f 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61  correctly evalua
a720: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  te expressions l
a730: 69 6b 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29  ike "X IN (Y, Z)
a740: 22 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  "..** If there i
a750: 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
a760: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6d 61  the structure ma
a770: 79 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  y contain a NULL
a780: 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e   value at.** run
a790: 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67  time, then a reg
a7a0: 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
a7b0: 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73  ed and the regis
a7c0: 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74  ter number writt
a7d0: 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46  en.** to *prNotF
a7e0: 6f 75 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69  ound. If there i
a7f0: 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
a800: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63   the structure c
a810: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c  ontains a.** NUL
a820: 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70  L value, then *p
a830: 72 4e 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65 66  rNotFound is lef
a840: 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
a850: 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72  ** If a register
a860: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
a870: 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73  d its location s
a880: 74 6f 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74 46  tored in *prNotF
a890: 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69 74  ound, then.** it
a8a0: 73 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  s initial value 
a8b0: 69 73 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20  is NULL. If the 
a8c0: 73 74 72 75 63 74 75 72 65 20 64 6f 65 73 20 6e  structure does n
a8d0: 6f 74 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74 61  ot remain consta
a8e0: 6e 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 75  nt.** for the du
a8f0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75  ration of the qu
a900: 65 72 79 20 28 69 2e 65 2e 20 74 68 65 20 73 65  ery (i.e. the se
a910: 74 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  t is a correlate
a920: 64 20 73 75 62 2d 73 65 6c 65 63 74 29 2c 20 0a  d sub-select), .
a930: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
a940: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 72 65  the allocated re
a950: 67 69 73 74 65 72 20 69 73 20 72 65 73 65 74 20  gister is reset 
a960: 74 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d  to NULL each tim
a970: 65 20 74 68 65 20 0a 2a 2a 20 73 74 72 75 63 74  e the .** struct
a980: 75 72 65 20 69 73 20 72 65 70 6f 70 75 6c 61 74  ure is repopulat
a990: 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  ed. This allows 
a9a0: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 75 73  the caller to us
a9b0: 65 20 76 64 62 65 20 63 6f 64 65 20 0a 2a 2a 20  e vdbe code .** 
a9c0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
a9d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
a9e0: 2a 2a 20 20 20 69 66 28 20 72 65 67 69 73 74 65  **   if( registe
a9f0: 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20  r==NULL ){.**   
aa00: 20 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65    has_null = <te
aa10: 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63  st if data struc
aa20: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75  ture contains nu
aa30: 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69 73  ll>.**     regis
aa40: 74 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a  ter = 1.**   }.*
aa50: 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  *.** in order to
aa60: 20 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74   avoid running t
aa70: 68 65 20 3c 74 65 73 74 20 69 66 20 64 61 74 61  he <test if data
aa80: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
aa90: 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73  ins null>.** tes
aaa0: 74 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  t more often tha
aab0: 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  n is necessary..
aac0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
aad0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
aae0: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49  int sqlite3FindI
aaf0: 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  nIndex(Parse *pP
ab00: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20  arse, Expr *pX, 
ab10: 69 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29  int *prNotFound)
ab20: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20  {.  Select *p;. 
ab30: 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 0a   int eType = 0;.
ab40: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
ab50: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69  rse->nTab++;.  i
ab60: 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20  nt mustBeUnique 
ab70: 3d 20 21 70 72 4e 6f 74 46 6f 75 6e 64 3b 0a 0a  = !prNotFound;..
ab80: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 77 69 6e    /* The follwin
ab90: 67 20 69 66 28 2e 2e 2e 29 20 65 78 70 72 65 73  g if(...) expres
aba0: 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  sion is true if 
abb0: 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
abc0: 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
abd0: 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
abe0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f  *     SELECT <co
abf0: 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c  lumn> FROM <tabl
ac00: 65 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e>.  **.  ** If 
ac10: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
ac20: 2c 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73  , it may be poss
ac30: 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 20 65  ible to use an e
ac40: 78 69 73 74 69 6e 67 20 74 61 62 6c 65 0a 20 20  xisting table.  
ac50: 2a 2a 20 6f 72 20 69 6e 64 65 78 20 69 6e 73 74  ** or index inst
ac60: 65 61 64 20 6f 66 20 67 65 6e 65 72 61 74 69 6e  ead of generatin
ac70: 67 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  g an epheremal t
ac80: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  able..  */.  p =
ac90: 20 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   (ExprHasPropert
aca0: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
acb0: 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c  ct) ? pX->x.pSel
acc0: 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ect : 0);.  if( 
acd0: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
ace0: 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71  Opt(p) ){.    sq
acf0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ad00: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 49 6e 64 65  se->db;.    Inde
ad10: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 45 78 70  x *pIdx;.    Exp
ad20: 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  r *pExpr = p->pE
ad30: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
ad40: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
ad50: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
ad60: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
ad70: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
ad80: 61 72 73 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  arse);..    /* T
ad90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ada0: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
adb0: 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20   two places. In 
adc0: 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76  both cases the v
add0: 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61  dbe.    ** has a
ade0: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
adf0: 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65  cated. So assume
ae00: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
ae10: 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  ) is always.    
ae20: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65  ** successful he
ae30: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
ae40: 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66  ssert(v);.    if
ae50: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
ae60: 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70    int iMem = ++p
ae70: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
ae80: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20     int iAddr;.  
ae90: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
aea0: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
aeb0: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
aec0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
aed0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
aee0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
aef0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
af00: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
af10: 29 3b 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20  );..      iAddr 
af20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
af30: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d  Op1(v, OP_If, iM
af40: 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
af50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
af60: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
af70: 4d 65 6d 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  Mem);..      sql
af80: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
af90: 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
afa0: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
afb0: 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
afc0: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
afd0: 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
afe0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
aff0: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
b000: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  se{.      /* The
b010: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b020: 6e 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  nce used by the 
b030: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61  comparison. If a
b040: 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 20 0a 20  n index is to . 
b050: 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20       ** be used 
b060: 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65  in place of a te
b070: 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73  mp-table, it mus
b080: 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63 63  t be ordered acc
b090: 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ording.      ** 
b0a0: 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  to this collatio
b0b0: 6e 20 73 65 71 75 65 6e 63 65 2e 0a 20 20 20 20  n sequence..    
b0c0: 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53    */.      CollS
b0d0: 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74  eq *pReq = sqlit
b0e0: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
b0f0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
b100: 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29  X->pLeft, pExpr)
b110: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
b120: 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e  k that the affin
b130: 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ity that will be
b140: 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d   used to perform
b150: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
b160: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65  omparison is the
b170: 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66   same as the aff
b180: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c  inity of the col
b190: 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a  umn. If.      **
b1a0: 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69   it is not, it i
b1b0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
b1c0: 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e  o use any index.
b1d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b1e0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d  Table *pTab = p-
b1f0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
b200: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  ;.      char aff
b210: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
b220: 69 6e 69 74 79 28 70 58 29 3b 0a 20 20 20 20 20  inity(pX);.     
b230: 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b   int affinity_ok
b240: 20 3d 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = (pTab->aCol[i
b250: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 61  Col].affinity==a
b260: 66 66 7c 7c 61 66 66 3d 3d 53 51 4c 49 54 45 5f  ff||aff==SQLITE_
b270: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20  AFF_NONE);..    
b280: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
b290: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26  >pIndex; pIdx &&
b2a0: 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66   eType==0 && aff
b2b0: 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70  inity_ok; pIdx=p
b2c0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
b2d0: 20 20 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e       if( (pIdx->
b2e0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f  aiColumn[0]==iCo
b2f0: 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  l).         && (
b300: 70 52 65 71 3d 3d 73 71 6c 69 74 65 33 46 69 6e  pReq==sqlite3Fin
b310: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
b320: 28 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  (db), pIdx->azCo
b330: 6c 6c 5b 30 5d 2c 20 2d 31 2c 20 30 29 29 0a 20  ll[0], -1, 0)). 
b340: 20 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73          && (!mus
b350: 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49  tBeUnique || (pI
b360: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26  dx->nColumn==1 &
b370: 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  & pIdx->onError!
b380: 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20  =OE_None)).     
b390: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
b3a0: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
b3b0: 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
b3c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
b3d0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
b3e0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  r;.          cha
b3f0: 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20  r *pKey;.  .    
b400: 20 20 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68        pKey = (ch
b410: 61 72 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65  ar *)sqlite3Inde
b420: 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
b430: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
b440: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
b450: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
b460: 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 3b   pIdx->pSchema);
b470: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b480: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
b490: 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 20 20  v, iDb);..      
b4a0: 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69      iAddr = sqli
b4b0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
b4c0: 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20   OP_If, iMem);. 
b4d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b4e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b4f0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65  _Integer, 1, iMe
b500: 6d 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  m);.  .         
b510: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b520: 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p4(v, OP_OpenRea
b530: 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74  d, iTab, pIdx->t
b540: 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  num, iDb,.      
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34           pKey,P4
b570: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
b580: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
b590: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
b5a0: 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
b5b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70  ;.          eTyp
b5c0: 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  e = IN_INDEX_IND
b5d0: 45 58 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73  EX;..          s
b5e0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
b5f0: 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
b600: 20 20 20 20 20 20 20 20 69 66 28 20 70 72 4e 6f          if( prNo
b610: 74 46 6f 75 6e 64 20 26 26 20 21 70 54 61 62 2d  tFound && !pTab-
b620: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e  >aCol[iCol].notN
b630: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ull ){.         
b640: 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d     *prNotFound =
b650: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
b660: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b680: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
b690: 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eType==0 ){.    
b6a0: 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
b6b0: 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20   = 0;.    eType 
b6c0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a  = IN_INDEX_EPH;.
b6d0: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
b6e0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e  nd ){.      *prN
b6f0: 6f 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61  otFound = rMayHa
b700: 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  veNull = ++pPars
b710: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c  e->nMem;.    }el
b720: 73 65 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74  se if( pX->pLeft
b730: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ->iColumn<0 && !
b740: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
b750: 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
b760: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 65 54  ect) ){.      eT
b770: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
b780: 4f 57 49 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OWID;.    }.    
b790: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
b7a0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c  lect(pParse, pX,
b7b0: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65   rMayHaveNull, e
b7c0: 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
b7d0: 4f 57 49 44 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OWID);.  }else{.
b7e0: 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d      pX->iTable =
b7f0: 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74   iTab;.  }.  ret
b800: 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e  urn eType;.}.#en
b810: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
b820: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61  ate code for sca
b830: 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75  lar subqueries u
b840: 73 65 64 20 61 73 20 61 6e 20 65 78 70 72 65 73  sed as an expres
b850: 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f  sion.** and IN o
b860: 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70  perators.  Examp
b870: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  les:.**.**     (
b880: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
b890: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62            -- sub
b8a0: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49  query.**     EXI
b8b0: 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52  STS (SELECT a FR
b8c0: 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54  OM b)   -- EXIST
b8d0: 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  S subquery.**   
b8e0: 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20    x IN (4,5,11) 
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
b900: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
b910: 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68   list on right-h
b920: 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20  and side.**     
b930: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46  x IN (SELECT a F
b940: 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e  ROM b)     -- IN
b950: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73   operator with s
b960: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72  ubquery on the r
b970: 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ight.**.** The p
b980: 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64  Expr parameter d
b990: 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70  escribes the exp
b9a0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
b9b0: 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20  tains the IN.** 
b9c0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71  operator or subq
b9d0: 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  uery..**.** If p
b9e0: 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64  arameter isRowid
b9f0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
ba00: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  en expression pE
ba10: 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  xpr is guarantee
ba20: 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68  d.** to be of th
ba30: 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20  e form "<rowid> 
ba40: 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77  IN (?, ?, ?)", w
ba50: 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20  here <rowid> is 
ba60: 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74  a reference.** t
ba70: 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b  o some integer k
ba80: 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  ey column of a t
ba90: 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20  able B-Tree. In 
baa0: 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61  this case, use a
bab0: 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72  n.** intkey B-Tr
bac0: 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ee to store the 
bad0: 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76  set of IN(...) v
bae0: 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66  alues instead of
baf0: 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73   the usual.** (s
bb00: 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20  lower) variable 
bb10: 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72  length keys B-Tr
bb20: 65 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ee..*/.#ifndef S
bb30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
bb40: 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ERY.void sqlite3
bb50: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20  CodeSubselect(. 
bb60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
bb70: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
bb80: 0a 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e  .  int rMayHaveN
bb90: 75 6c 6c 2c 0a 20 20 69 6e 74 20 69 73 52 6f 77  ull,.  int isRow
bba0: 69 64 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73 74  id.){.  int test
bbb0: 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Addr = 0;       
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74  /* One-time test
bbe0: 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 56 64   address */.  Vd
bbf0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
bc00: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
bc10: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
bc20: 75 72 6e 3b 0a 0a 0a 20 20 2f 2a 20 54 68 69 73  urn;...  /* This
bc30: 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75   code must be ru
bc40: 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74  n in its entiret
bc50: 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20  y every time it 
bc60: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  is encountered. 
bc70: 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68   ** if any of th
bc80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
bc90: 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
bca0: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
bcb0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
bcc0: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
bcd0: 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
bce0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
bcf0: 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
bd00: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
bd10: 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
bd20: 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
bd30: 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
bd40: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
bd50: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
bd60: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
bd70: 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
bd80: 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
bd90: 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
bda0: 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
bdb0: 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
bdc0: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
bdd0: 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
bde0: 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  f( !ExprHasAnyPr
bdf0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
be00: 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20 21  _VarSelect) && !
be10: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
be20: 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d  k ){.    int mem
be30: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
be40: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
be50: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
be60: 66 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 74 65 73  f, mem);.    tes
be70: 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
be80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
be90: 49 6e 74 65 67 65 72 2c 20 31 2c 20 6d 65 6d 29  Integer, 1, mem)
bea0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 65  ;.    assert( te
beb0: 73 74 41 64 64 72 3e 30 20 7c 7c 20 70 50 61 72  stAddr>0 || pPar
bec0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
bed0: 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  iled );.  }..  s
bee0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
bef0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
bf00: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  IN: {.      char
bf10: 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20   affinity;.     
bf20: 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f   KeyInfo keyInfo
bf30: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
bf40: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72  ;        /* Addr
bf50: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
bf60: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
bf70: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
bf80: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
bf90: 2d 3e 70 4c 65 66 74 3b 0a 0a 20 20 20 20 20 20  ->pLeft;..      
bfa0: 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  if( rMayHaveNull
bfb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
bfc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bfd0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61   OP_Null, 0, rMa
bfe0: 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  yHaveNull);.    
bff0: 20 20 7d 0a 0a 20 20 20 20 20 20 61 66 66 69 6e    }..      affin
c000: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
c010: 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
c020: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
c030: 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
c040: 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
c050: 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
c060: 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
c070: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
c080: 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
c090: 73 61 6d 65 20 77 61 79 2e 20 41 20 76 69 72 74  same way. A virt
c0a0: 75 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20  ual table is .  
c0b0: 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69      ** filled wi
c0c0: 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20  th single-field 
c0d0: 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65  index keys repre
c0e0: 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75  senting the resu
c0f0: 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  lts.      ** fro
c100: 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20  m the SELECT or 
c110: 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a  the <exprlist>..
c120: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
c130: 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70  * If the 'x' exp
c140: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
c150: 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68  umn value, or th
c160: 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20  e SELECT....    
c170: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72    ** statement r
c180: 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20  eturns a column 
c190: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
c1a0: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74  affinity of that
c1b0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
c1c0: 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
c1d0: 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73  d the index keys
c1e0: 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e  . If both 'x' an
c1f0: 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53  d the.      ** S
c200: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
c210: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
c220: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
c230: 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20  inity is used.  
c240: 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72      ** if either
c250: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45   column has NUME
c260: 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61  RIC or INTEGER a
c270: 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74  ffinity. If neit
c280: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27  her.      ** 'x'
c290: 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e   nor the SELECT.
c2a0: 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
c2b0: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
c2c0: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a  umeric affinity.
c2d0: 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64        ** is used
c2e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c2f0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
c300: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
c310: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
c320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c330: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
c340: 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ral, pExpr->iTab
c350: 6c 65 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a 20  le, !isRowid);. 
c360: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79       memset(&key
c370: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
c380: 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  keyInfo));.     
c390: 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20   keyInfo.nField 
c3a0: 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 1;..      if( 
c3b0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
c3c0: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
c3d0: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
c3e0: 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
c3f0: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
c400: 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..).        **. 
c410: 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
c420: 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
c430: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
c440: 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
c450: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
c460: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
c470: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65  llocated and ope
c480: 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
c490: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65     */.        Se
c4a0: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
c4b0: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
c4c0: 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20  *pEList;..      
c4d0: 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77    assert( !isRow
c4e0: 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  id );.        sq
c4f0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
c500: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
c510: 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
c520: 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  e);.        dest
c530: 2e 61 66 66 69 6e 69 74 79 20 3d 20 28 75 38 29  .affinity = (u8)
c540: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
c550: 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72    assert( (pExpr
c560: 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46  ->iTable&0x0000F
c570: 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61  FFF)==pExpr->iTa
c580: 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ble );.        i
c590: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
c5a0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c5b0: 78 2e 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  x.pSelect, &dest
c5c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
c5d0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
c5e0: 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20  .        pEList 
c5f0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
c600: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
c610: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
c620: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
c630: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
c640: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
c650: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
c660: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
c670: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
c680: 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eft,.           
c690: 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e     pEList->a[0].
c6a0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
c6b0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
c6c0: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
c6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
c6e0: 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
c6f0: 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
c700: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c710: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
c720: 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
c730: 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
c740: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
c750: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
c760: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
c770: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
c780: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
c790: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
c7a0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
c7b0: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
c7c0: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
c7d0: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
c7e0: 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
c7f0: 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
c800: 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
c810: 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
c820: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
c830: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
c840: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
c850: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
c860: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
c870: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
c880: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20          int r1, 
c890: 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20  r2, r3;..       
c8a0: 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
c8b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
c8c0: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
c8d0: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
c8e0: 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66  }.        keyInf
c8f0: 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  o.aColl[0] = sql
c900: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
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 0a 20 20 20 20 20 20 20 20  Left);..        
c930: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
c940: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
c950: 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
c960: 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  /.        r1 = s
c970: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
c980: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
c990: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
c9a0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
c9b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c9c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c9d0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a  P_Null, 0, r2);.
c9e0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
c9f0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
ca00: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
ca10: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
ca20: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
ca30: 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
ca40: 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  pr;..          /
ca50: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
ca60: 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  ion is not const
ca70: 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ant then we will
ca80: 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
ca90: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
caa0: 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20  e test that was 
cab0: 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20  generated above 
cac0: 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a  that makes sure.
cad0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
cae0: 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63  s code only exec
caf0: 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61  utes once.  Beca
cb00: 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f  use for a non-co
cb10: 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20  nstant.         
cb20: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
cb30: 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20  e need to rerun 
cb40: 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74  this code each t
cb50: 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ime..          *
cb60: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
cb70: 74 65 73 74 41 64 64 72 20 26 26 20 21 73 71 6c  testAddr && !sql
cb80: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
cb90: 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
cba0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cbb0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
cbc0: 2c 20 74 65 73 74 41 64 64 72 2d 31 2c 20 32 29  , testAddr-1, 2)
cbd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
cbe0: 73 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  stAddr = 0;.    
cbf0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
cc00: 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
cc10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
cc20: 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
cc30: 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
cc40: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  */.          pPa
cc50: 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
cc60: 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ache++;.        
cc70: 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78    r3 = sqlite3Ex
cc80: 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
cc90: 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20  rse, pE2, r1);. 
cca0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ccb0: 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
ccc0: 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20  ColCache>0 );.  
ccd0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
cce0: 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d  disableColCache-
ccf0: 2d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  -;..          if
cd00: 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
cd10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cd20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
cd30: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 20  _MustBeInt, r3, 
cd40: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
cd50: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
cd60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cd70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
cd80: 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  P_Insert, pExpr-
cd90: 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29  >iTable, r2, r3)
cda0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
cdb0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
cdc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
cdd0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
cde0: 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
cdf0: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
ce00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ce10: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
ce20: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
ce30: 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r3, 1);.        
ce40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ce50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
ce60: 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
ce70: 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  able, r2);.     
ce80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
ce90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cea0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
ceb0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
cec0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ced0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
cee0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
cef0: 20 20 20 20 20 69 66 28 20 21 69 73 52 6f 77 69       if( !isRowi
cf00: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  d ){.        sql
cf10: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
cf20: 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
cf30: 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)&keyInfo, P4_K
cf40: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d  EYINFO);.      }
cf50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cf60: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
cf70: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
cf80: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
cf90: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73       /* This has
cfa0: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
cfb0: 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74  SELECT.  Generat
cfc0: 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
cfd0: 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65  e.      ** value
cfe0: 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20   of this select 
cff0: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  in a memory cell
d000: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20   and record the 
d010: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  number.      ** 
d020: 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
d030: 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20  ll in iColumn.. 
d040: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
d050: 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  atic const Token
d060: 20 6f 6e 65 20 3d 20 7b 20 28 75 38 2a 29 22 31   one = { (u8*)"1
d070: 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20  ", 0, 1 };.     
d080: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
d090: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
d0a0: 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 61 73 73  dest;..      ass
d0b0: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
d0c0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
d0d0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
d0e0: 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d     pSel = pExpr-
d0f0: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
d100: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d110: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30  estInit(&dest, 0
d120: 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  , ++pParse->nMem
d130: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
d140: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
d150: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73  T ){.        des
d160: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65  t.eDest = SRT_Me
d170: 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
d180: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d190: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74  OP_Null, 0, dest
d1a0: 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  .iParm);.       
d1b0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
d1c0: 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
d1d0: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
d1e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d1f0: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
d200: 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
d210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d220: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
d230: 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29  , 0, dest.iParm)
d240: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
d250: 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
d260: 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
d270: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d280: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
d290: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
d2a0: 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  el->pLimit);.   
d2b0: 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
d2c0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
d2d0: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
d2e0: 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a  R, 0, 0, &one);.
d2f0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
d300: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
d310: 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a  pSel, &dest) ){.
d320: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
d330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45        }.      pE
d340: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 64  xpr->iColumn = d
d350: 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20  est.iParm;.     
d360: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d370: 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64  }..  if( testAdd
d380: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
d390: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d3a0: 74 65 73 74 41 64 64 72 2d 31 29 3b 0a 20 20 7d  testAddr-1);.  }
d3b0: 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ..  return;.}.#e
d3c0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d3d0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
d3e0: 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  ./*.** Duplicate
d3f0: 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75 65   an 8-byte value
d400: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
d410: 2a 64 75 70 38 62 79 74 65 73 28 56 64 62 65 20  *dup8bytes(Vdbe 
d420: 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
d430: 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74  in){.  char *out
d440: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
d450: 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62  ocRaw(sqlite3Vdb
d460: 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69 66  eDb(v), 8);.  if
d470: 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d  ( out ){.    mem
d480: 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b  cpy(out, in, 8);
d490: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75  .  }.  return ou
d4a0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
d4b0: 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
d4c0: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
d4d0: 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70  t the floating p
d4e0: 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65  oint.** value de
d4f0: 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e  scribed by z[0..
d500: 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
d510: 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er iMem..**.** T
d520: 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
d530: 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
d540: 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
d550: 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
d560: 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
d570: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
d580: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
d590: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
d5a0: 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
d5b0: 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
d5c0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
d5d0: 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c  ic void codeReal
d5e0: 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
d5f0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
d600: 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20  int negateFlag, 
d610: 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 61 73 73  int iMem){.  ass
d620: 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c  ert( z || v==0 |
d630: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  | sqlite3VdbeDb(
d640: 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  v)->mallocFailed
d650: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 7a   );.  assert( !z
d660: 20 7c 7c 20 21 73 71 6c 69 74 65 33 49 73 64 69   || !sqlite3Isdi
d670: 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 55  git(z[n]) );.  U
d680: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d690: 6e 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20  n);.  if( z ){. 
d6a0: 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b     double value;
d6b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20  .    char *zV;. 
d6c0: 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a     sqlite3AtoF(z
d6d0: 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69  , &value);.    i
d6e0: 66 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  f( sqlite3IsNaN(
d6f0: 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20  value) ){.      
d700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d710: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
d720: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73   iMem);.    }els
d730: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  e{.      if( neg
d740: 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20  ateFlag ) value 
d750: 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  = -value;.      
d760: 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76  zV = dup8bytes(v
d770: 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29  , (char*)&value)
d780: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d790: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
d7a0: 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  Real, 0, iMem, 0
d7b0: 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a  , zV, P4_REAL);.
d7c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
d7d0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
d7e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
d7f0: 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e   will put the in
d800: 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62  teger describe b
d810: 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e  y.** text z[0..n
d820: 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65  -1] into registe
d830: 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r iMem..**.** Th
d840: 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c  e z[] string wil
d850: 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62  l probably not b
d860: 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  e zero-terminate
d870: 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20  d.  But the .** 
d880: 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69  z[n] character i
d890: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
d8a0: 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  be something tha
d8b0: 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a  t does not look.
d8c0: 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74  ** like the cont
d8d0: 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  inuation of the 
d8e0: 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
d8f0: 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67  c void codeInteg
d900: 65 72 28 56 64 62 65 20 2a 76 2c 20 45 78 70 72  er(Vdbe *v, Expr
d910: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67   *pExpr, int neg
d920: 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
d930: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d940: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
d950: 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
d960: 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  ue ){.    int i 
d970: 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
d980: 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67  .    if( negFlag
d990: 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73   ) i = -i;.    s
d9a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d9b0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
d9c0: 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73  i, iMem);.  }els
d9d0: 65 20 69 66 28 20 28 7a 20 3d 20 28 63 68 61 72  e if( (z = (char
d9e0: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
d9f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
da00: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  i;.    int n = p
da10: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20  Expr->token.n;. 
da20: 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
da30: 74 65 33 49 73 64 69 67 69 74 28 7a 5b 6e 5d 29  te3Isdigit(z[n])
da40: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
da50: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 2c 20 26  te3GetInt32(z, &
da60: 69 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i) ){.      if( 
da70: 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
da80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
da90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
daa0: 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
dab0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
dac0: 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34   sqlite3FitsIn64
dad0: 42 69 74 73 28 7a 2c 20 6e 65 67 46 6c 61 67 29  Bits(z, negFlag)
dae0: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 61   ){.      i64 va
daf0: 6c 75 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20  lue;.      char 
db00: 2a 7a 56 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  *zV;.      sqlit
db10: 65 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 61 6c  e3Atoi64(z, &val
db20: 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ue);.      if( n
db30: 65 67 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  egFlag ) value =
db40: 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a   -value;.      z
db50: 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c  V = dup8bytes(v,
db60: 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b   (char*)&value);
db70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
db80: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49  beAddOp4(v, OP_I
db90: 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  nt64, 0, iMem, 0
dba0: 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b  , zV, P4_INT64);
dbb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dbc0: 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c    codeReal(v, z,
dbd0: 20 6e 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65   n, negFlag, iMe
dbe0: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  m);.    }.  }.}.
dbf0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
dc00: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
dc10: 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c  extract the iCol
dc20: 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72  umn-th column fr
dc30: 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62  om.** table pTab
dc40: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63   and store the c
dc50: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61  olumn value in a
dc60: 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20 65   register.  An e
dc70: 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65  ffort.** is made
dc80: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
dc90: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
dca0: 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75 74  gister iReg, but
dcb0: 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20   this is.** not 
dcc0: 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68 65  guaranteed.  The
dcd0: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
dce0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73   column value is
dcf0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
dd00: 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
dd10: 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
dd20: 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
dd30: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
dd40: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
dd50: 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
dd60: 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
dd70: 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
dd80: 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2a  ts the rowid..**
dd90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
dda0: 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74   might attempt t
ddb0: 6f 20 72 65 75 73 65 20 74 68 65 20 76 61 6c 75  o reuse the valu
ddc0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
ddd0: 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 6c 72 65  that.** has alre
dde0: 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  ady been loaded 
ddf0: 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
de00: 20 20 54 68 65 20 76 61 6c 75 65 20 77 69 6c 6c    The value will
de10: 20 61 6c 77 61 79 73 0a 2a 2a 20 62 65 20 75 73   always.** be us
de20: 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  ed if it has not
de30: 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 79 20 61   undergone any a
de40: 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 73 2e  ffinity changes.
de50: 20 20 42 75 74 20 69 66 0a 2a 2a 20 61 6e 20 61    But if.** an a
de60: 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68  ffinity change h
de70: 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  as occurred, the
de80: 6e 20 74 68 65 20 63 61 63 68 65 64 20 76 61 6c  n the cached val
de90: 75 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 0a  ue will only be.
dea0: 2a 2a 20 75 73 65 64 20 69 66 20 61 6c 6c 6f 77  ** used if allow
deb0: 41 66 66 43 68 6e 67 20 69 73 20 74 72 75 65 2e  AffChng is true.
dec0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
ded0: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
dee0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
def0: 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
df00: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
df10: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
df20: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
df30: 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
df40: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
df50: 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f   are reading fro
df60: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  m */.  int iColu
df70: 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  mn,     /* Index
df80: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
df90: 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  lumn */.  int iT
dfa0: 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  able,      /* Th
dfb0: 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
dfc0: 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  g to the table *
dfd0: 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20  /.  int iReg,   
dfe0: 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65       /* Store re
dff0: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
e000: 69 6e 74 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67  int allowAffChng
e010: 20 2f 2a 20 54 72 75 65 20 69 66 20 70 72 69 6f   /* True if prio
e020: 72 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  r affinity chang
e030: 65 73 20 61 72 65 20 4f 4b 20 2a 2f 0a 29 7b 0a  es are OK */.){.
e040: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
e050: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
e060: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
e070: 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
e080: 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
e090: 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50  >aColCache; i<pP
e0a0: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
e0b0: 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
e0c0: 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  if( p->iTable==i
e0d0: 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
e0e0: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
e0f0: 20 20 20 20 20 20 20 20 26 26 20 28 21 70 2d 3e          && (!p->
e100: 61 66 66 43 68 61 6e 67 65 20 7c 7c 20 61 6c 6c  affChange || all
e110: 6f 77 41 66 66 43 68 6e 67 29 20 29 7b 0a 23 69  owAffChng) ){.#i
e120: 66 20 30 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f 0.      sqlite
e130: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
e140: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20 56  P_Noop);.      V
e150: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e160: 4f 50 54 3a 20 74 61 62 25 64 2e 63 6f 6c 25 64  OPT: tab%d.col%d
e170: 20 2d 3e 20 72 25 64 22 2c 20 69 54 61 62 6c 65   -> r%d", iTable
e180: 2c 20 69 43 6f 6c 75 6d 6e 2c 20 70 2d 3e 69 52  , iColumn, p->iR
e190: 65 67 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  eg));.#endif.   
e1a0: 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65     return p->iRe
e1b0: 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20  g;.    }.  }  . 
e1c0: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
e1d0: 0a 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30  .  if( iColumn<0
e1e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
e1f0: 20 28 70 54 61 62 20 26 26 20 49 73 56 69 72 74   (pTab && IsVirt
e200: 75 61 6c 28 70 54 61 62 29 29 20 3f 20 4f 50 5f  ual(pTab)) ? OP_
e210: 56 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77 69  VRowid : OP_Rowi
e220: 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  d;.    sqlite3Vd
e230: 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
e240: 69 54 61 62 6c 65 2c 20 69 52 65 67 29 3b 0a 20  iTable, iReg);. 
e250: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 3d   }else if( pTab=
e260: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
e270: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
e280: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65  P_Column, iTable
e290: 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
e2a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
e2b0: 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61  nt op = IsVirtua
e2c0: 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f  l(pTab) ? OP_VCo
e2d0: 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e  lumn : OP_Column
e2e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e2f0: 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
e300: 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
e310: 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  iReg);.    sqlit
e320: 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
e330: 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e  v, pTab, iColumn
e340: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
e350: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
e360: 50 4f 49 4e 54 0a 20 20 20 20 69 66 28 20 70 54  POINT.    if( pT
e370: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  ab->aCol[iColumn
e380: 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
e390: 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20  TE_AFF_REAL ){. 
e3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e3b0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61  AddOp1(v, OP_Rea
e3c0: 6c 41 66 66 69 6e 69 74 79 2c 20 69 52 65 67 29  lAffinity, iReg)
e3d0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
e3e0: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
e3f0: 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
e400: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 20 3d 20 70  ==0 ){.    i = p
e410: 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65  Parse->iColCache
e420: 3b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  ;.    p = &pPars
e430: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b  e->aColCache[i];
e440: 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  .    p->iTable =
e450: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e   iTable;.    p->
e460: 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 75 6d  iColumn = iColum
e470: 6e 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  n;.    p->iReg =
e480: 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 61 66   iReg;.    p->af
e490: 66 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  fChange = 0;.   
e4a0: 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 3e   i++;.    if( i>
e4b0: 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  =ArraySize(pPars
e4c0: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 29 20 29 20  e->aColCache) ) 
e4d0: 69 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  i = 0;.    if( i
e4e0: 3e 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  >pParse->nColCac
e4f0: 68 65 20 29 20 70 50 61 72 73 65 2d 3e 6e 43 6f  he ) pParse->nCo
e500: 6c 43 61 63 68 65 20 3d 20 69 3b 0a 20 20 20 20  lCache = i;.    
e510: 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68  pParse->iColCach
e520: 65 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  e = i;.  }.  ret
e530: 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
e540: 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c  ** Clear all col
e550: 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65  umn cache entrie
e560: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
e570: 68 20 74 68 65 20 76 64 62 65 0a 2a 2a 20 63 75  h the vdbe.** cu
e580: 72 73 6f 72 20 77 69 74 68 20 63 75 72 73 6f 72  rsor with cursor
e590: 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 2e 0a   number iTable..
e5a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
e5b0: 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61  xprClearColumnCa
e5c0: 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
e5d0: 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  e, int iTable){.
e5e0: 20 20 69 66 28 20 69 54 61 62 6c 65 3c 30 20 29    if( iTable<0 )
e5f0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 43  {.    pParse->nC
e600: 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  olCache = 0;.   
e610: 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63   pParse->iColCac
e620: 68 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  he = 0;.  }else{
e630: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
e640: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
e650: 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
e660: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50  +){.      if( pP
e670: 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
e680: 69 5d 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  i].iTable==iTabl
e690: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  e ){.        tes
e6a0: 74 63 61 73 65 28 20 69 3d 3d 70 50 61 72 73 65  tcase( i==pParse
e6b0: 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 31 20 29 3b  ->nColCache-1 );
e6c0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
e6d0: 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20  >aColCache[i] = 
e6e0: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
e6f0: 65 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  e[--pParse->nCol
e700: 43 61 63 68 65 5d 3b 0a 20 20 20 20 20 20 20 20  Cache];.        
e710: 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68  pParse->iColCach
e720: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  e = pParse->nCol
e730: 43 61 63 68 65 3b 0a 20 20 20 20 20 20 7d 0a 20  Cache;.      }. 
e740: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e750: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
e760: 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69  t that an affini
e770: 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
e780: 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74  curred on iCount
e790: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74  .** registers st
e7a0: 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61  arting with iSta
e7b0: 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
e7c0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
e7d0: 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65  nityChange(Parse
e7e0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53   *pParse, int iS
e7f0: 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74  tart, int iCount
e800: 29 7b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20  ){.  int iEnd = 
e810: 69 53 74 61 72 74 20 2b 20 69 43 6f 75 6e 74 20  iStart + iCount 
e820: 2d 20 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  - 1;.  int i;.  
e830: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
e840: 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
e850: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
e860: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
e870: 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 69  e[i].iReg;.    i
e880: 66 28 20 72 3e 3d 69 53 74 61 72 74 20 26 26 20  f( r>=iStart && 
e890: 72 3c 3d 69 45 6e 64 20 29 7b 0a 20 20 20 20 20  r<=iEnd ){.     
e8a0: 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
e8b0: 68 65 5b 69 5d 2e 61 66 66 43 68 61 6e 67 65 20  he[i].affChange 
e8c0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 1;.    }.  }.}
e8d0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
e8e0: 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f   code to move co
e8f0: 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73  ntent from regis
e900: 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72  ters iFrom...iFr
e910: 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65  om+nReg-1.** ove
e920: 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52  r to iTo..iTo+nR
e930: 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63  eg-1. Keep the c
e940: 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74  olumn cache up-t
e950: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  o-date..*/.void 
e960: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
e970: 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
e980: 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
e990: 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29  t iTo, int nReg)
e9a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
e9b0: 20 69 46 72 6f 6d 3d 3d 69 54 6f 20 29 20 72 65   iFrom==iTo ) re
e9c0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
e9d0: 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
e9e0: 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
e9f0: 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
ea00: 65 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  eg);.  for(i=0; 
ea10: 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
ea20: 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  che; i++){.    i
ea30: 6e 74 20 78 20 3d 20 70 50 61 72 73 65 2d 3e 61  nt x = pParse->a
ea40: 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
ea50: 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 69 46 72  ;.    if( x>=iFr
ea60: 6f 6d 20 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52  om && x<iFrom+nR
ea70: 65 67 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  eg ){.      pPar
ea80: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
ea90: 2e 69 52 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72  .iReg += iTo-iFr
eaa0: 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  om;.    }.  }.}.
eab0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
eac0: 63 6f 64 65 20 74 6f 20 63 6f 70 79 20 63 6f 6e  code to copy con
ead0: 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
eae0: 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
eaf0: 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
eb00: 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
eb10: 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  g-1..*/.void sql
eb20: 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
eb30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
eb40: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
eb50: 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
eb60: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 69 46   int i;.  if( iF
eb70: 72 6f 6d 3d 3d 69 54 6f 20 29 20 72 65 74 75 72  rom==iTo ) retur
eb80: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
eb90: 6e 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nReg; i++){.    
eba0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ebb0: 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
ebc0: 20 4f 50 5f 43 6f 70 79 2c 20 69 46 72 6f 6d 2b   OP_Copy, iFrom+
ebd0: 69 2c 20 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d  i, iTo+i);.  }.}
ebe0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
ebf0: 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73  rue if any regis
ec00: 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ter in the range
ec10: 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63   iFrom..iTo (inc
ec20: 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73  lusive).** is us
ec30: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
ec40: 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
ec50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73  */.static int us
ec60: 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
ec70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
ec80: 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
ec90: 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  o){.  int i;.  f
eca0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
ecb0: 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
ecc0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
ecd0: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
ece0: 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 69 66  [i].iReg;.    if
ecf0: 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c  ( r>=iFrom && r<
ed00: 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b  =iTo ) return 1;
ed10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
ed20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20  .}../*.** There 
ed30: 69 73 20 61 20 76 61 6c 75 65 20 69 6e 20 72 65  is a value in re
ed40: 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a  gister iReg..**.
ed50: 2a 2a 20 57 65 20 61 72 65 20 67 6f 69 6e 67 20  ** We are going 
ed60: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 76 61  to modify the va
ed70: 6c 75 65 2c 20 73 6f 20 77 65 20 6e 65 65 64 20  lue, so we need 
ed80: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 0a  to make sure it.
ed90: 2a 2a 20 69 73 20 6e 6f 74 20 61 20 63 61 63 68  ** is not a cach
eda0: 65 64 20 72 65 67 69 73 74 65 72 2e 20 20 49 66  ed register.  If
edb0: 20 69 52 65 67 20 69 73 20 61 20 63 61 63 68 65   iReg is a cache
edc0: 64 20 72 65 67 69 73 74 65 72 2c 0a 2a 2a 20 74  d register,.** t
edd0: 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 63 6f  hen clear the co
ede0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 61 63 68  rresponding cach
edf0: 65 20 6c 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e line..*/.void 
ee00: 73 71 6c 69 74 65 33 45 78 70 72 57 72 69 74 61  sqlite3ExprWrita
ee10: 62 6c 65 52 65 67 69 73 74 65 72 28 50 61 72 73  bleRegister(Pars
ee20: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
ee30: 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
ee40: 20 69 66 28 20 75 73 65 64 41 73 43 6f 6c 75 6d   if( usedAsColum
ee50: 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
ee60: 52 65 67 2c 20 69 52 65 67 29 20 29 7b 0a 20 20  Reg, iReg) ){.  
ee70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
ee80: 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
ee90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
eea0: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
eeb0: 65 5b 69 5d 2e 69 52 65 67 3d 3d 69 52 65 67 20  e[i].iReg==iReg 
eec0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
eed0: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20  e->aColCache[i] 
eee0: 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
eef0: 63 68 65 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 43  che[--pParse->nC
ef00: 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 20 20 20 20  olCache];.      
ef10: 20 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61    pParse->iColCa
ef20: 63 68 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 43  che = pParse->nC
ef30: 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20 20 20 7d  olCache;.      }
ef40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
ef50: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20  .** If the last 
ef60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 64 65  instruction code
ef70: 64 20 69 73 20 61 6e 20 65 70 68 65 6d 65 72 61  d is an ephemera
ef80: 6c 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 6f 66  l copy of any of
ef90: 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
efa0: 73 20 69 6e 20 74 68 65 20 6e 52 65 67 20 72 65  s in the nReg re
efb0: 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e  gisters beginnin
efc0: 67 20 77 69 74 68 20 69 52 65 67 2c 20 74 68 65  g with iReg, the
efd0: 6e 0a 2a 2a 20 63 6f 6e 76 65 72 74 20 74 68 65  n.** convert the
efe0: 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f   last instructio
eff0: 6e 20 66 72 6f 6d 20 4f 50 5f 53 43 6f 70 79 20  n from OP_SCopy 
f000: 74 6f 20 4f 50 5f 43 6f 70 79 2e 0a 2a 2f 0a 76  to OP_Copy..*/.v
f010: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 48  oid sqlite3ExprH
f020: 61 72 64 43 6f 70 79 28 50 61 72 73 65 20 2a 70  ardCopy(Parse *p
f030: 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
f040: 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
f050: 74 20 61 64 64 72 3b 0a 20 20 56 64 62 65 4f 70  t addr;.  VdbeOp
f060: 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 20 2a 76   *pOp;.  Vdbe *v
f070: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
f080: 3e 70 56 64 62 65 3b 0a 20 20 61 64 64 72 20 3d  >pVdbe;.  addr =
f090: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
f0a0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 70 4f  entAddr(v);.  pO
f0b0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
f0c0: 65 74 4f 70 28 76 2c 20 61 64 64 72 2d 31 29 3b  etOp(v, addr-1);
f0d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 20 7c  .  assert( pOp |
f0e0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
f0f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
f100: 69 66 28 20 70 4f 70 20 26 26 20 70 4f 70 2d 3e  if( pOp && pOp->
f110: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 43 6f 70 79  opcode==OP_SCopy
f120: 20 26 26 20 70 4f 70 2d 3e 70 31 3e 3d 69 52 65   && pOp->p1>=iRe
f130: 67 20 26 26 20 70 4f 70 2d 3e 70 31 3c 69 52 65  g && pOp->p1<iRe
f140: 67 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 70 4f  g+nReg ){.    pO
f150: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43  p->opcode = OP_C
f160: 6f 70 79 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  opy;.  }.}../*.*
f170: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f180: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  to store the val
f190: 75 65 20 6f 66 20 74 68 65 20 69 41 6c 69 61 73  ue of the iAlias
f1a0: 2d 74 68 20 61 6c 69 61 73 20 69 6e 20 72 65 67  -th alias in reg
f1b0: 69 73 74 65 72 0a 2a 2a 20 74 61 72 67 65 74 2e  ister.** target.
f1c0: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
f1d0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
f1e0: 20 70 45 78 70 72 20 69 73 20 65 76 61 6c 75 61   pExpr is evalua
f1f0: 74 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a  ted to compute.*
f200: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
f210: 68 65 20 61 6c 69 61 73 2e 20 20 54 68 65 20 76  he alias.  The v
f220: 61 6c 75 65 20 69 73 20 73 74 6f 72 65 64 20 69  alue is stored i
f230: 6e 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20 72  n an auxiliary r
f240: 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 74  egister.** and t
f250: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 61  he number of tha
f260: 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  t register is re
f270: 74 75 72 6e 65 64 2e 20 20 4f 6e 20 73 75 62 73  turned.  On subs
f280: 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 0a 2a 2a  equent calls,.**
f290: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
f2a0: 6d 62 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  mber is returned
f2b0: 20 77 69 74 68 6f 75 74 20 67 65 6e 65 72 61 74   without generat
f2c0: 69 6e 67 20 61 6e 79 20 63 6f 64 65 2e 0a 2a 2a  ing any code..**
f2d0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 6e  .** Note that in
f2e0: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
f2f0: 74 6f 20 77 6f 72 6b 2c 20 63 6f 64 65 20 6d 75  to work, code mu
f300: 73 74 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  st be generated 
f310: 69 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 6f  in the.** same o
f320: 72 64 65 72 20 74 68 61 74 20 69 74 20 69 73 20  rder that it is 
f330: 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  executed..**.** 
f340: 41 6c 69 61 73 65 73 20 61 72 65 20 6e 75 6d 62  Aliases are numb
f350: 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 77 69  ered starting wi
f360: 74 68 20 31 2e 20 20 53 6f 20 69 41 6c 69 61 73  th 1.  So iAlias
f370: 20 69 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65   is in the range
f380: 0a 2a 2a 20 6f 66 20 31 20 74 6f 20 70 50 61 72  .** of 1 to pPar
f390: 73 65 2d 3e 6e 41 6c 69 61 73 20 69 6e 63 6c 75  se->nAlias inclu
f3a0: 73 69 76 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 70 50  sive.  .**.** pP
f3b0: 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c  arse->aAlias[iAl
f3c0: 69 61 73 2d 31 5d 20 72 65 63 6f 72 64 73 20 74  ias-1] records t
f3d0: 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
f3e0: 65 72 20 77 68 65 72 65 20 74 68 65 20 76 61 6c  er where the val
f3f0: 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69 41 6c  ue.** of the iAl
f400: 69 61 73 2d 74 68 20 61 6c 69 61 73 20 69 73 20  ias-th alias is 
f410: 73 74 6f 72 65 64 2e 20 20 49 66 20 7a 65 72 6f  stored.  If zero
f420: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
f430: 74 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 68  t the.** alias h
f440: 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
f450: 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  computed..*/.sta
f460: 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 69 61  tic int codeAlia
f470: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
f480: 20 69 6e 74 20 69 41 6c 69 61 73 2c 20 45 78 70   int iAlias, Exp
f490: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
f4a0: 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  rget){.  sqlite3
f4b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
f4c0: 62 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 0a 20  b;.  int iReg;. 
f4d0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 41 6c   if( pParse->nAl
f4e0: 69 61 73 41 6c 6c 6f 63 3c 70 50 61 72 73 65 2d  iasAlloc<pParse-
f4f0: 3e 6e 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 70  >nAlias ){.    p
f500: 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 20 3d 20  Parse->aAlias = 
f510: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
f520: 4f 72 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  OrFree(db, pPars
f530: 65 2d 3e 61 41 6c 69 61 73 2c 0a 20 20 20 20 20  e->aAlias,.     
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
f560: 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61  of(pParse->aAlia
f570: 73 5b 30 5d 29 2a 70 50 61 72 73 65 2d 3e 6e 41  s[0])*pParse->nA
f580: 6c 69 61 73 20 29 3b 0a 20 20 20 20 74 65 73 74  lias );.    test
f590: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
f5a0: 46 61 69 6c 65 64 20 26 26 20 70 50 61 72 73 65  Failed && pParse
f5b0: 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 3e 30 20  ->nAliasAlloc>0 
f5c0: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
f5d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
f5e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 6d 65 6d 73  turn 0;.    mems
f5f0: 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41 6c 69  et(&pParse->aAli
f600: 61 73 5b 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61  as[pParse->nAlia
f610: 73 41 6c 6c 6f 63 5d 2c 20 30 2c 0a 20 20 20 20  sAlloc], 0,.    
f620: 20 20 20 20 20 20 20 28 70 50 61 72 73 65 2d 3e         (pParse->
f630: 6e 41 6c 69 61 73 2d 70 50 61 72 73 65 2d 3e 6e  nAlias-pParse->n
f640: 41 6c 69 61 73 41 6c 6c 6f 63 29 2a 73 69 7a 65  AliasAlloc)*size
f650: 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61  of(pParse->aAlia
f660: 73 5b 30 5d 29 29 3b 0a 20 20 20 20 70 50 61 72  s[0]));.    pPar
f670: 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 20  se->nAliasAlloc 
f680: 3d 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  = pParse->nAlias
f690: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
f6a0: 69 41 6c 69 61 73 3e 30 20 26 26 20 69 41 6c 69  iAlias>0 && iAli
f6b0: 61 73 3c 3d 70 50 61 72 73 65 2d 3e 6e 41 6c 69  as<=pParse->nAli
f6c0: 61 73 20 29 3b 0a 20 20 69 52 65 67 20 3d 20 70  as );.  iReg = p
f6d0: 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41  Parse->aAlias[iA
f6e0: 6c 69 61 73 2d 31 5d 3b 0a 20 20 69 66 28 20 69  lias-1];.  if( i
f6f0: 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Reg==0 ){.    if
f700: 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
f710: 65 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20  eColCache ){.   
f720: 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
f730: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
f740: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
f750: 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73  arget);.    }els
f760: 65 7b 0a 20 20 20 20 20 20 69 52 65 67 20 3d 20  e{.      iReg = 
f770: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
f780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f790: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
f7a0: 78 70 72 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  xpr, iReg);.    
f7b0: 20 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73    pParse->aAlias
f7c0: 5b 69 41 6c 69 61 73 2d 31 5d 20 3d 20 69 52 65  [iAlias-1] = iRe
f7d0: 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  g;.    }.  }.  r
f7e0: 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
f7f0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
f800: 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  de into the curr
f810: 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c  ent Vdbe to eval
f820: 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a  uate the given.*
f830: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41  * expression.  A
f840: 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20  ttempt to store 
f850: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72  the results in r
f860: 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22  egister "target"
f870: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
f880: 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72  register where r
f890: 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
f8a0: 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68  d..**.** With th
f8b0: 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72  is routine, ther
f8c0: 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65  e is no guarante
f8d0: 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77  e that results w
f8e0: 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64  ill.** be stored
f8f0: 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65   in target.  The
f900: 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65   result might be
f910: 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20   stored in some 
f920: 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65  other.** registe
f930: 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65  r if it is conve
f940: 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20  nient to do so. 
f950: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
f960: 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68  ction.** must ch
f970: 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63  eck the return c
f980: 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ode and move the
f990: 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20   results to the 
f9a0: 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73  desired.** regis
f9b0: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
f9c0: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
f9d0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
f9e0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
f9f0: 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
fa00: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
fa10: 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d  Vdbe;  /* The VM
fa20: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
fa30: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ion */.  int op;
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa50: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
fa60: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
fa70: 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61    int inReg = ta
fa80: 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  rget;       /* R
fa90: 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e  esults stored in
faa0: 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20   register inReg 
fab0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
fac0: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  1 = 0;         /
fad0: 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
fae0: 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
faf0: 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
fb00: 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
fb10: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
fb20: 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
fb30: 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
fb40: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
fb50: 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20  1, r2, r3, r4;  
fb60: 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
fb70: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
fb80: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
fb90: 62 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  b;..  db = pPars
fba0: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
fbb0: 20 76 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   v!=0 || db->mal
fbc0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61  locFailed );.  a
fbd0: 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
fbe0: 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
fbf0: 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
fc00: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
fc10: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
fc20: 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
fc30: 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
fc40: 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
fc50: 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
fc60: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
fc70: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
fc80: 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
fc90: 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
fca0: 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
fcb0: 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
fcc0: 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
fcd0: 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
fce0: 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
fcf0: 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
fd00: 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
fd10: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
fd20: 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
fd30: 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
fd40: 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20  Col->iMem;.     
fd50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
fd60: 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
fd70: 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
fd80: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
fd90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fda0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
fdb0: 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
fdc0: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fde0: 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
fdf0: 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
fe00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
fe10: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
fe20: 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
fe30: 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
fe40: 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
fe50: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fe60: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
fe70: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
fe80: 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  le<0 ){.        
fe90: 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
fea0: 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67  pens when coding
feb0: 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e   check constrain
fec0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
fed0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b  sert( pParse->ck
fee0: 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Base>0 );.      
fef0: 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
ff00: 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73  >iColumn + pPars
ff10: 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20  e->ckBase;.     
ff20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ff30: 74 65 73 74 63 61 73 65 28 20 28 70 45 78 70 72  testcase( (pExpr
ff40: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e 79  ->flags & EP_Any
ff50: 41 66 66 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  Aff)!=0 );.     
ff60: 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
ff70: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
ff80: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  umn(pParse, pExp
ff90: 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20  r->pTab,.       
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
ffc0: 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d  >iColumn, pExpr-
ffd0: 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c  >iTable, target,
ffe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26    pExpr->flags &
10010 20 45 50 5f 41 6e 79 41 66 66 29 3b 0a 20 20 20   EP_AnyAff);.   
10020 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
10030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10040 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
10050 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
10060 28 76 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61  (v, pExpr, 0, ta
10070 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
10080 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10090 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
100a0 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
100b0 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
100c0 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
100d0 6f 6b 65 6e 2e 6e 2c 20 30 2c 20 74 61 72 67 65  oken.n, 0, targe
100e0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
100f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10100 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
10110 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
10120 65 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 29  eExpr(db, pExpr)
10130 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10140 64 62 65 41 64 64 4f 70 34 28 76 2c 4f 50 5f 53  dbeAddOp4(v,OP_S
10150 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65  tring8, 0, targe
10160 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
10180 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
10190 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
101a0 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  n.n);.      brea
101b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
101c0 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
101d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
101e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
101f0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
10200 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10210 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10220 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
10230 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
10240 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
10250 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
10260 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
10270 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
10280 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74  assert( pExpr->t
10290 6f 6b 65 6e 2e 6e 3e 3d 33 20 29 3b 0a 20 20 20  oken.n>=3 );.   
102a0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
102b0 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 78  ->token.z[0]=='x
102c0 27 20 7c 7c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ' || pExpr->toke
102d0 6e 2e 7a 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  n.z[0]=='X' );. 
102e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
102f0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 31 5d 3d 3d  pr->token.z[1]==
10300 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 61 73  '\'' );.      as
10310 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
10320 65 6e 2e 7a 5b 70 45 78 70 72 2d 3e 74 6f 6b 65  en.z[pExpr->toke
10330 6e 2e 6e 2d 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  n.n-1]=='\'' );.
10340 20 20 20 20 20 20 6e 20 3d 20 70 45 78 70 72 2d        n = pExpr-
10350 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20  >token.n - 3;.  
10360 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70      z = (char*)p
10370 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20  Expr->token.z + 
10380 32 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  2;.      zBlob =
10390 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
103a0 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
103b0 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
103c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
103d0 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
103e0 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
103f0 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
10400 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10410 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
10420 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
10430 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  E: {.      int i
10440 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 56 64 62  Prior;.      Vdb
10450 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
10460 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
10470 2e 6e 3c 3d 31 0a 20 20 20 20 20 20 20 20 20 26  .n<=1.         &
10480 26 20 28 69 50 72 69 6f 72 20 3d 20 73 71 6c 69  & (iPrior = sqli
10490 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
104a0 64 72 28 76 29 2d 31 29 3e 3d 30 0a 20 20 20 20  dr(v)-1)>=0.    
104b0 20 20 20 20 20 26 26 20 28 70 4f 70 20 3d 20 73       && (pOp = s
104c0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
104d0 76 2c 20 69 50 72 69 6f 72 29 29 2d 3e 6f 70 63  v, iPrior))->opc
104e0 6f 64 65 3d 3d 4f 50 5f 56 61 72 69 61 62 6c 65  ode==OP_Variable
104f0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
10500 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 3d 3d 70 45  ->p1+pOp->p3==pE
10510 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20  xpr->iTable.    
10520 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b       && pOp->p2+
10530 70 4f 70 2d 3e 70 33 3d 3d 74 61 72 67 65 74 0a  pOp->p3==target.
10540 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d           && pOp-
10550 3e 70 34 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 29  >p4.z==0.      )
10560 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
10570 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
10580 74 72 75 63 74 69 6f 6e 20 77 61 73 20 61 20 63  truction was a c
10590 6f 70 79 20 6f 66 20 74 68 65 20 70 72 65 76 69  opy of the previ
105a0 6f 75 73 20 75 6e 6e 61 6d 65 64 0a 20 20 20 20  ous unnamed.    
105b0 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
105c0 20 69 6e 74 6f 20 74 68 65 20 70 72 65 76 69 6f   into the previo
105d0 75 73 20 72 65 67 69 73 74 65 72 2c 20 74 68 65  us register, the
105e0 6e 20 73 69 6d 70 6c 79 20 69 6e 63 72 65 6d 65  n simply increme
105f0 6e 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  nt the.        *
10600 2a 20 72 65 70 65 61 74 20 63 6f 75 6e 74 20 6f  * repeat count o
10610 6e 20 74 68 65 20 70 72 69 6f 72 20 69 6e 73 74  n the prior inst
10620 72 75 63 74 69 6f 6e 20 72 61 74 68 65 72 20 74  ruction rather t
10630 68 61 6e 20 6d 61 6b 69 6e 67 20 61 20 6e 65 77  han making a new
10640 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 74  .        ** inst
10650 72 75 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruction..       
10660 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   */.        pOp-
10670 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  >p3++;.      }el
10680 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
10690 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
106a0 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
106b0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
106c0 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  get, 1);.       
106d0 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
106e0 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  n.n>1 ){.       
106f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10700 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
10710 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
10720 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
10730 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n.n);.        }.
10740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
10750 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
10760 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
10770 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
10780 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
10790 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
107a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
107b0 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  S: {.      inReg
107c0 20 3d 20 63 6f 64 65 41 6c 69 61 73 28 70 50 61   = codeAlias(pPa
107d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  rse, pExpr->iTab
107e0 6c 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  le, pExpr->pLeft
107f0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
10800 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
10810 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10820 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
10830 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
10840 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
10850 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
10860 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
10870 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  en) */.      int
10880 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20   aff, to_op;.   
10890 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
108a0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
108b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
108c0 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
108d0 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
108e0 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
108f0 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
10900 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66        to_op = af
10910 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f - SQLITE_AFF_T
10920 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b  EXT + OP_ToText;
10930 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
10940 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20  o_op==OP_ToText 
10950 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
10960 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b  E_AFF_TEXT    );
10970 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
10980 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20  o_op==OP_ToBlob 
10990 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
109a0 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b  E_AFF_NONE    );
109b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
109c0 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72  o_op==OP_ToNumer
109d0 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54  ic || aff!=SQLIT
109e0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
109f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
10a00 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20  o_op==OP_ToInt  
10a10 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
10a20 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
10a30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
10a40 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20  o_op==OP_ToReal 
10a50 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
10a60 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b  E_AFF_REAL    );
10a70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10a80 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78   to_op==OP_ToTex
10a90 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
10aa0 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
10ab0 6f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 74  oBlob );.      t
10ac0 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
10ad0 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a  OP_ToNumeric );.
10ae0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10af0 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20  to_op==OP_ToInt 
10b00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10b10 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52  e( to_op==OP_ToR
10b20 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eal );.      if(
10b30 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29   inReg!=target )
10b40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10b50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10b60 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
10b70 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
10b80 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
10b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
10ba0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10bb0 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67  (v, to_op, inReg
10bc0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10bd0 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  e( usedAsColumnC
10be0 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ache(pParse, inR
10bf0 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20  eg, inReg) );.  
10c00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10c10 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
10c20 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  ge(pParse, inReg
10c30 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
10c40 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
10c50 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
10c60 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
10c70 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
10c80 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
10c90 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
10ca0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
10cb0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
10cc0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
10cd0 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
10ce0 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
10cf0 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
10d00 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
10d10 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
10d20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10d30 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
10d40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10d50 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
10d60 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10d70 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
10d80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
10d90 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  =TK_LT );.      
10da0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
10db0 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
10dc0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54  tcase( op==TK_GT
10dd0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
10de0 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b  se( op==TK_GE );
10df0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10e00 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20   op==TK_EQ );.  
10e10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
10e20 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20  ==TK_NE );.     
10e30 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72   codeCompareOper
10e40 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 45 78  ands(pParse, pEx
10e50 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20  pr->pLeft, &r1, 
10e60 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20  &regFree1,.     
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
10e90 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 32 2c  pr->pRight, &r2,
10ea0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
10eb0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
10ec0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
10ed0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
10ee0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
10ef0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
10f00 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
10f10 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
10f20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
10f30 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
10f40 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
10f50 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
10f60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
10f70 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
10f80 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
10f90 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
10fa0 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
10fb0 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
10fc0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
10fd0 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
10fe0 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
10ff0 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
11000 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
11010 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
11020 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
11030 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
11040 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
11050 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
11060 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20  D==OP_And );.   
11070 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
11080 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20  ==OP_Or );.     
11090 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
110a0 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20  ==OP_Add );.    
110b0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
110c0 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
110d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
110e0 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
110f0 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61  inder );.      a
11100 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44  ssert( TK_BITAND
11110 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20  ==OP_BitAnd );. 
11120 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
11130 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20  BITOR==OP_BitOr 
11140 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11150 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
11160 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73  vide );.      as
11170 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
11180 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
11190 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
111a0 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
111b0 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  ftRight );.     
111c0 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
111d0 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
111e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
111f0 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20   op==TK_AND );. 
11200 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
11210 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20  p==TK_OR );.    
11220 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
11230 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20  TK_PLUS );.     
11240 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
11250 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20  K_MINUS );.     
11260 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
11270 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 74  K_REM );.      t
11280 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
11290 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
112a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
112b0 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20  _BITOR );.      
112c0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
112d0 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20  _SLASH );.      
112e0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
112f0 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _LSHIFT );.     
11300 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
11310 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_RSHIFT );.    
11320 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
11330 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20  TK_CONCAT );.   
11340 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
11350 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
11360 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
11370 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
11380 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
11390 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
113a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
113b0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
113c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
113d0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
113e0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
113f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11400 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
11410 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
11420 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
11430 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11440 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
11450 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
11460 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
11470 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
11480 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
11490 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
114a0 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
114b0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
114c0 6c 28 76 2c 20 28 63 68 61 72 2a 29 70 4c 65 66  l(v, (char*)pLef
114d0 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66  t->token.z, pLef
114e0 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 31 2c 20 74  t->token.n, 1, t
114f0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  arget);.      }e
11500 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
11510 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
11520 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74  .        codeInt
11530 65 67 65 72 28 76 2c 20 70 4c 65 66 74 2c 20 31  eger(v, pLeft, 1
11540 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
11550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11560 72 65 67 46 72 65 65 31 20 3d 20 72 31 20 3d 20  regFree1 = r1 = 
11570 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
11580 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
11590 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
115a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
115b0 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20  er, 0, r1);.    
115c0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
115d0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
115e0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
115f0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
11600 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11610 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
11620 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c  ubtract, r2, r1,
11630 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
11640 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
11650 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
11660 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
11670 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
11680 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11690 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
116a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
116b0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
116c0 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
116d0 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61  itNot );.      a
116e0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f  ssert( TK_NOT==O
116f0 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74  P_Not );.      t
11700 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
11710 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  BITNOT );.      
11720 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
11730 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  _NOT );.      r1
11740 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
11750 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
11760 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
11770 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
11780 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
11790 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e  1==0 );.      in
117a0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
117b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
117c0 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
117d0 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
117e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
117f0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
11800 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
11810 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
11820 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73   addr;.      ass
11830 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
11840 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
11850 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
11860 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
11870 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  l );.      testc
11880 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
11890 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
118a0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
118b0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71  NULL );.      sq
118c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
118d0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
118e0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
118f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
11900 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
11910 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
11920 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
11930 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
11940 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
11950 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
11960 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c  dbeAddOp1(v, op,
11970 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
11980 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11990 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67   OP_AddImm, targ
119a0 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73  et, -1);.      s
119b0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
119c0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
119d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
119e0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
119f0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
11a00 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
11a10 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
11a20 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
11a30 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
11a40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11a50 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
11a60 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20  e of aggregate: 
11a70 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %T",.           
11a80 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a   &pExpr->span);.
11a90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11aa0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e       inReg = pIn
11ab0 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
11ac0 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20  >iAgg].iMem;.   
11ad0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11ae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11af0 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a   TK_CONST_FUNC:.
11b00 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
11b10 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
11b20 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
11b30 28 0a 20 20 20 20 20 20 20 20 45 78 70 72 48 61  (.        ExprHa
11b40 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
11b50 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
11b60 7c 45 50 5f 53 70 61 6e 4f 6e 6c 79 29 20 3f 20  |EP_SpanOnly) ? 
11b70 30 20 3a 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  0 : pExpr->x.pLi
11b80 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  st.      );.    
11b90 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c    int nExpr = pL
11ba0 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
11bb0 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75  pr : 0;.      Fu
11bc0 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20  ncDef *pDef;.   
11bd0 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20     int nId;.    
11be0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
11bf0 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e  d;.      int con
11c00 73 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  stMask = 0;.    
11c10 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75    int i;.      u
11c20 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
11c30 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
11c40 70 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20  pColl = 0;..    
11c50 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
11c60 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
11c70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
11c80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
11c90 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f  e( op==TK_CONST_
11ca0 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20 74 65  FUNC );.      te
11cb0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46  stcase( op==TK_F
11cc0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
11cd0 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45   zId = (char*)pE
11ce0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  xpr->token.z;.  
11cf0 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d      nId = pExpr-
11d00 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  >token.n;.      
11d10 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
11d20 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
11d30 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20  Id, nId, nExpr, 
11d40 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  enc, 0);.      a
11d50 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29  ssert( pDef!=0 )
11d60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
11d70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 78  t ){.        nEx
11d80 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
11d90 72 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  r;.        r1 = 
11da0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
11db0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70  nge(pParse, nExp
11dc0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
11dd0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
11de0 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
11df0 74 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  t, r1, 1);.     
11e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11e10 6e 45 78 70 72 20 3d 20 72 31 20 3d 20 30 3b 0a  nExpr = r1 = 0;.
11e20 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
11e30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11e40 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
11e50 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
11e60 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
11e70 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
11e80 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
11e90 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
11ea0 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
11eb0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
11ec0 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
11ed0 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
11ee0 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
11ef0 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
11f00 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
11f10 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
11f20 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
11f30 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
11f40 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
11f50 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
11f60 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
11f70 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
11f80 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
11f90 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
11fa0 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
11fb0 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
11fc0 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
11fd0 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
11fe0 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
11ff0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
12000 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
12010 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
12020 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
12030 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
12040 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
12050 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
12060 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
12070 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
12080 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
12090 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
120a0 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
120b0 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
120c0 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
120d0 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
120e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  */.      if( nEx
120f0 70 72 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  pr>=2 && (pExpr-
12100 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
12110 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
12120 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
12130 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
12140 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
12150 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31  Expr, pList->a[1
12160 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
12170 7d 65 6c 73 65 20 69 66 28 20 6e 45 78 70 72 3e  }else if( nExpr>
12180 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
12190 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
121a0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
121b0 64 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c  db, pDef, nExpr,
121c0 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
121d0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
121e0 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  dif.      for(i=
121f0 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c  0; i<nExpr && i<
12200 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  32; i++){.      
12210 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
12220 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73  rIsConstant(pLis
12230 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
12240 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
12250 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b  tMask |= (1<<i);
12260 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12270 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 6c     if( (pDef->fl
12280 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
12290 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
122a0 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
122b0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
122c0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
122d0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
122e0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
122f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12300 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
12310 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
12320 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
12330 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
12340 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
12350 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
12360 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12370 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
12380 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
12390 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
123a0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
123b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
123c0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
123d0 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d  Function, constM
123e0 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c  ask, r1, target,
123f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12400 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
12410 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  pDef, P4_FUNCDEF
12420 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12430 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
12440 28 75 38 29 6e 45 78 70 72 29 3b 0a 20 20 20 20  (u8)nExpr);.    
12450 20 20 69 66 28 20 6e 45 78 70 72 20 29 7b 0a 20    if( nExpr ){. 
12460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
12470 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
12480 50 61 72 73 65 2c 20 72 31 2c 20 6e 45 78 70 72  Parse, r1, nExpr
12490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
124a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
124b0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
124c0 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 45 78 70  pParse, r1, nExp
124d0 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
124e0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
124f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
12500 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
12510 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
12520 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
12530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12540 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
12550 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
12560 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
12570 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
12580 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20  >iColumn==0 ){. 
12590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
125a0 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
125b0 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
125c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
125d0 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69  inReg = pExpr->i
125e0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 62 72  Column;.      br
125f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
12600 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
12610 20 20 20 69 6e 74 20 72 4e 6f 74 46 6f 75 6e 64     int rNotFound
12620 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
12630 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
12640 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 32 2c 20  ;.      int j2, 
12650 6a 33 2c 20 6a 34 2c 20 6a 35 3b 0a 20 20 20 20  j3, j4, j5;.    
12660 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
12670 0a 20 20 20 20 20 20 69 6e 74 20 65 54 79 70 65  .      int eType
12680 3b 0a 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  ;..      VdbeNoo
12690 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
126a0 67 69 6e 20 49 4e 20 65 78 70 72 20 72 25 64 22  gin IN expr r%d"
126b0 2c 20 74 61 72 67 65 74 29 29 3b 0a 20 20 20 20  , target));.    
126c0 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
126d0 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
126e0 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 4d 61  rse, pExpr, &rMa
126f0 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  yHaveNull);.    
12700 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75    if( rMayHaveNu
12710 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 4e  ll ){.        rN
12720 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72  otFound = ++pPar
12730 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
12740 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75  }..      /* Figu
12750 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
12760 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
12770 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
12780 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
12790 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72    ** of the expr
127a0 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79  ession. affinity
127b0 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61  Str stores a sta
127c0 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61  tic string suita
127d0 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ble for.      **
127e0 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65   P4 of OP_MakeRe
127f0 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cord..      */. 
12800 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
12810 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
12820 74 79 28 70 45 78 70 72 29 3b 0a 0a 0a 20 20 20  ty(pExpr);...   
12830 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c     /* Code the <
12840 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
12850 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68  r> IN (...)". Th
12860 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
12870 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70 72  e.      ** pExpr
12880 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ->iTable contain
12890 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61  s the values tha
128a0 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28 2e  t make up the (.
128b0 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20 2a  ..) set..      *
128c0 2f 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  /.      pParse->
128d0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b  disableColCache+
128e0 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
128f0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
12900 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
12910 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 70 50  arget);.      pP
12920 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
12930 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 6a  Cache--;.      j
12940 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
12950 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
12960 6c 6c 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ll, target);.   
12970 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
12980 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
12990 20 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c          j3 = sql
129a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
129b0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
129c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
129d0 20 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j4 = sqlite3Vdb
129e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
129f0 74 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e  tExists, pExpr->
12a00 69 54 61 62 6c 65 2c 20 30 2c 20 74 61 72 67 65  iTable, 0, targe
12a10 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
12a20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12a30 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
12a40 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
12a50 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j5 = sqlite3Vdb
12a60 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
12a70 74 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  to);.        sql
12a80 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
12a90 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 20  (v, j3);.       
12aa0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
12ab0 48 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20  Here(v, j4);.   
12ac0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12ad0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
12ae0 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29  eger, 0, target)
12af0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12b00 20 20 20 20 20 20 20 72 32 20 3d 20 72 65 67 46         r2 = regF
12b10 72 65 65 32 20 3d 20 73 71 6c 69 74 65 33 47 65  ree2 = sqlite3Ge
12b20 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
12b30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 72  ;..        /* Cr
12b40 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 61 6e  eate a record an
12b50 64 20 74 65 73 74 20 66 6f 72 20 73 65 74 20 6d  d test for set m
12b60 65 6d 62 65 72 73 68 69 70 2e 20 49 66 20 74 68  embership. If th
12b70 65 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 0a 20  e set contains. 
12b80 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61         ** the va
12b90 6c 75 65 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74  lue, then jump t
12ba0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
12bb0 20 74 65 73 74 20 63 6f 64 65 2e 20 54 68 65 20   test code. The 
12bc0 74 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 2a  target.        *
12bd0 2a 20 72 65 67 69 73 74 65 72 20 73 74 69 6c 6c  * register still
12be0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 72   contains the tr
12bf0 75 65 20 28 31 29 20 76 61 6c 75 65 20 77 72 69  ue (1) value wri
12c00 74 74 65 6e 20 74 6f 20 69 74 20 65 61 72 6c 69  tten to it earli
12c10 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  er..        */. 
12c20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12c30 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
12c40 61 6b 65 52 65 63 6f 72 64 2c 20 74 61 72 67 65  akeRecord, targe
12c50 74 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e  t, 1, r2, &affin
12c60 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
12c70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12c80 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
12c90 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
12ca0 20 20 20 20 20 20 6a 35 20 3d 20 73 71 6c 69 74        j5 = sqlit
12cb0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12cc0 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
12cd0 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 32 29 3b  >iTable, 0, r2);
12ce0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
12cf0 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68  the set membersh
12d00 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74  ip test fails, t
12d10 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
12d20 66 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  f the .        *
12d30 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65  * "x IN (...)" e
12d40 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
12d50 65 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55  e either 0 or NU
12d60 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20  LL. If the set. 
12d70 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
12d80 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  ns no NULL value
12d90 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
12da0 6c 74 20 69 73 20 30 2e 20 49 66 20 74 68 65 20  lt is 0. If the 
12db0 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  set .        ** 
12dc0 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
12dd0 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
12de0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
12df0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
12e00 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
12e10 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20  s also NULL..   
12e20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
12e30 69 66 28 20 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30  if( rNotFound==0
12e40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
12e50 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
12e60 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e  s if it is known
12e70 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
12e80 20 28 6e 6f 77 29 20 74 68 61 74 20 0a 20 20 20   (now) that .   
12e90 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65         ** the se
12ea0 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55  t contains no NU
12eb0 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20  LL values. This 
12ec0 68 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72  happens as the r
12ed0 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20  esult.          
12ee0 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c  ** of a "NOT NUL
12ef0 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e  L" constraint in
12f00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
12f10 68 65 6d 61 2e 20 4e 6f 20 6e 65 65 64 0a 20 20  hema. No need.  
12f20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
12f30 73 74 20 74 68 65 20 64 61 74 61 20 73 74 72 75  st the data stru
12f40 63 74 75 72 65 20 61 74 20 72 75 6e 74 69 6d 65  cture at runtime
12f50 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
12f60 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
12f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12f80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12f90 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74  teger, 0, target
12fa0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
12fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
12fc0 68 69 73 20 62 6c 6f 63 6b 20 70 6f 70 75 6c 61  his block popula
12fd0 74 65 73 20 74 68 65 20 72 4e 6f 74 46 6f 75 6e  tes the rNotFoun
12fe0 64 20 72 65 67 69 73 74 65 72 20 77 69 74 68 20  d register with 
12ff0 65 69 74 68 65 72 20 4e 55 4c 4c 0a 20 20 20 20  either NULL.    
13000 20 20 20 20 20 20 2a 2a 20 6f 72 20 30 20 28 61        ** or 0 (a
13010 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29  n integer value)
13020 2e 20 49 66 20 74 68 65 20 64 61 74 61 20 73 74  . If the data st
13030 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
13040 20 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 2a   one.          *
13050 2a 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 73 2c  * or more NULLs,
13060 20 74 68 65 6e 20 73 65 74 20 72 4e 6f 74 46 6f   then set rNotFo
13070 75 6e 64 20 74 6f 20 4e 55 4c 4c 2e 20 4f 74 68  und to NULL. Oth
13080 65 72 77 69 73 65 2c 20 73 65 74 20 69 74 0a 20  erwise, set it. 
13090 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 30           ** to 0
130a0 2e 20 49 66 20 72 65 67 69 73 74 65 72 20 72 4d  . If register rM
130b0 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 61 6c  ayHaveNull is al
130c0 72 65 61 64 79 20 73 65 74 20 74 6f 20 73 6f 6d  ready set to som
130d0 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  e value.        
130e0 20 20 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20    ** other than 
130f0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 74  NULL, then the t
13100 65 73 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  est has already 
13110 62 65 65 6e 20 72 75 6e 20 61 6e 64 20 0a 20 20  been run and .  
13120 20 20 20 20 20 20 20 20 2a 2a 20 72 4e 6f 74 46          ** rNotF
13130 6f 75 6e 64 20 69 73 20 61 6c 72 65 61 64 79 20  ound is already 
13140 70 6f 70 75 6c 61 74 65 64 2e 0a 20 20 20 20 20  populated..     
13150 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13160 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
13170 68 61 72 20 6e 75 6c 6c 52 65 63 6f 72 64 5b 5d  har nullRecord[]
13180 20 3d 20 7b 20 30 78 30 32 2c 20 30 78 30 30 20   = { 0x02, 0x00 
13190 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 33 20  };.          j3 
131a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
131b0 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op1(v, OP_NotNul
131c0 6c 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29  l, rMayHaveNull)
131d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
131e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
131f0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4e 6f   OP_Null, 0, rNo
13200 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20  tFound);.       
13210 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13220 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
13230 20 32 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   2, rMayHaveNull
13240 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
13250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13260 20 20 20 6e 75 6c 6c 52 65 63 6f 72 64 2c 20 50     nullRecord, P
13270 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
13280 20 20 20 20 20 6a 34 20 3d 20 73 71 6c 69 74 65       j4 = sqlite
13290 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
132a0 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
132b0 69 54 61 62 6c 65 2c 20 30 2c 20 72 4d 61 79 48  iTable, 0, rMayH
132c0 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  aveNull);.      
132d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
132e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
132f0 67 65 72 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e  ger, 0, rNotFoun
13300 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  d);.          sq
13310 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
13320 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20  e(v, j4);.      
13330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
13340 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a  umpHere(v, j3);.
13350 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
13360 70 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  py the value of 
13370 72 65 67 69 73 74 65 72 20 72 4e 6f 74 46 6f 75  register rNotFou
13380 6e 64 20 28 77 68 69 63 68 20 69 73 20 65 69 74  nd (which is eit
13390 68 65 72 20 4e 55 4c 4c 20 6f 72 20 30 29 0a 20  her NULL or 0). 
133a0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f           ** into
133b0 20 74 68 65 20 74 61 72 67 65 74 20 72 65 67 69   the target regi
133c0 73 74 65 72 2e 20 54 68 69 73 20 77 69 6c 6c 20  ster. This will 
133d0 62 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  be the result of
133e0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
133f0 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  * expression..  
13400 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13410 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13420 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
13430 79 2c 20 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 61  y, rNotFound, ta
13440 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
13450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13460 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13470 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 20  re(v, j2);.     
13480 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13490 48 65 72 65 28 76 2c 20 6a 35 29 3b 0a 20 20 20  Here(v, j5);.   
134a0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
134b0 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 20  v, "end IN expr 
134c0 72 25 64 22 2c 20 74 61 72 67 65 74 29 29 3b 0a  r%d", target));.
134d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
134e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a   }.#endif.    /*
134f0 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
13500 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
13510 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
13520 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
13530 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
13540 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
13550 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
13560 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
13570 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
13580 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
13590 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
135a0 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
135b0 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
135c0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
135d0 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
135e0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
135f0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
13600 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
13610 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
13620 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
13630 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20  _item *pLItem = 
13640 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
13650 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  a;.      Expr *p
13660 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
13670 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 63 6f  pExpr;..      co
13680 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64  deCompareOperand
13690 73 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  s(pParse, pLeft,
136a0 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c   &r1, &regFree1,
136b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136d0 20 20 20 70 52 69 67 68 74 2c 20 26 72 32 2c 20     pRight, &r2, 
136e0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
136f0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
13700 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
13710 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
13720 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
13730 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
13740 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
13750 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74        r4 = sqlit
13760 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
13770 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  rse);.      code
13780 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
13790 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
137a0 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20  P_Ge,.          
137b0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
137c0 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r3, SQLITE_STORE
137d0 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65  P2);.      pLIte
137e0 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68  m++;.      pRigh
137f0 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
13800 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
13810 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
13820 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
13830 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
13840 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
13850 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
13860 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
13870 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
13880 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
13890 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
138a0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
138b0 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20  ght, OP_Le, r1, 
138c0 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53  r2, r4, SQLITE_S
138d0 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73  TOREP2);.      s
138e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
138f0 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20  (v, OP_And, r3, 
13900 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r4, target);.   
13910 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
13920 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
13930 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r3);.      sqli
13940 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
13950 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20  g(pParse, r4);. 
13960 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13970 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
13980 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  LUS: {.      inR
13990 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
139a0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
139b0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
139c0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
139d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
139e0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    /*.    ** Form
139f0 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   A:.    **   CAS
13a00 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e  E x WHEN e1 THEN
13a10 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
13a20 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
13a30 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
13a40 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
13a50 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20   Form B:.    ** 
13a60 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54    CASE WHEN e1 T
13a70 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
13a80 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
13a90 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
13aa0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
13ab0 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61   ** Form A is ca
13ac0 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64  n be transformed
13ad0 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61   into the equiva
13ae0 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66  lent form B as f
13af0 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20  ollows:.    **  
13b00 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20   CASE WHEN x=e1 
13b10 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65  THEN r1 WHEN x=e
13b20 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20  2 THEN r2 ....  
13b30 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e    **        WHEN
13b40 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c   x=eN THEN rN EL
13b50 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
13b60 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20      ** X (if it 
13b70 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45  exists) is in pE
13b80 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
13b90 2a 2a 20 59 20 69 73 20 69 6e 20 70 45 78 70 72  ** Y is in pExpr
13ba0 2d 3e 70 52 69 67 68 74 2e 20 20 54 68 65 20 59  ->pRight.  The Y
13bb0 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61   is also optiona
13bc0 6c 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  l.  If there is 
13bd0 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20 63  no.    ** ELSE c
13be0 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74 68  lause and no oth
13bf0 65 72 20 74 65 72 6d 20 6d 61 74 63 68 65 73 2c  er term matches,
13c00 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
13c10 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65   of the.    ** e
13c20 78 70 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c  xprssion is NULL
13c30 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69  ..    ** Ei is i
13c40 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
13c50 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73  a[i*2] and Ri is
13c60 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
13c70 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a  [i*2+1]..    **.
13c80 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c      ** The resul
13c90 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  t of the express
13ca0 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f  ion is the Ri fo
13cb0 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
13cc0 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20  hing Ei,.    ** 
13cd0 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  or if there is n
13ce0 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74  o matching Ei, t
13cf0 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20  he ELSE term Y, 
13d00 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  or if there is. 
13d10 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65     ** no ELSE te
13d20 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f  rm, NULL..    */
13d30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
13d40 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  E: {.      int e
13d50 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d70 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
13d80 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
13d90 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
13da0 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
13db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
13dc0 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
13dd0 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
13de0 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
13df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13e00 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
13e10 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
13e20 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
13e30 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13e50 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
13e60 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
13e70 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
13e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
13e90 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
13ea0 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
13eb0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
13ec0 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
13ed0 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
13ee0 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
13ef0 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f10 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
13f20 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
13f30 70 72 20 63 61 63 68 65 58 3b 20 20 20 20 20 20  pr cacheX;      
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f50 2f 2a 20 43 61 63 68 65 64 20 65 78 70 72 65 73  /* Cached expres
13f60 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20  sion X */.      
13f70 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f90 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65    /* The X expre
13fa0 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
13fb0 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20  xpr *pTest = 0; 
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20   /* X==Ei (form 
13fe0 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66  A) or just Ei (f
13ff0 6f 72 6d 20 42 29 20 2a 2f 0a 0a 20 20 20 20 20  orm B) */..     
14000 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
14010 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
14020 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
14030 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
14040 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14050 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ((pExpr->x.pList
14060 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20  ->nExpr % 2) == 
14070 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
14080 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
14090 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
140a0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
140b0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
140c0 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
140d0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
140e0 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
140f0 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
14100 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
14110 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
14120 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
14130 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
14140 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68   ){.        cach
14150 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  eX = *pX;.      
14160 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
14170 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
14180 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49   pX->op==TK_REGI
14190 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20  STER );.        
141a0 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20  cacheX.iTable = 
141b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
141c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20  emp(pParse, pX, 
141d0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
141e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
141f0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
14200 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d       cacheX.op =
14210 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
14220 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
14230 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20  op = TK_EQ;.    
14240 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c      opCompare.pL
14250 65 66 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20  eft = &cacheX;. 
14260 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26         pTest = &
14270 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  opCompare;.     
14280 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d   }.      pParse-
14290 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
142a0 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ++;.      for(i=
142b0 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b  0; i<nExpr; i=i+
142c0 32 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2){.        if( 
142d0 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
142e0 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
142f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
14300 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
14310 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
14320 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
14330 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
14340 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
14350 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
14360 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
14370 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
14380 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
14390 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
143a0 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
143b0 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 65 73 74 2d  COLUMN || pTest-
143c0 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
143d0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
143e0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
143f0 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65  Parse, pTest, ne
14400 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a  xtCase, SQLITE_J
14410 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
14420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
14430 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
14440 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
14450 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  N );.        tes
14460 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d  tcase( aListelem
14470 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  [i+1].pExpr->op=
14480 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
14490 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
144a0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
144b0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
144c0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
144d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
144e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
144f0 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c  oto, 0, endLabel
14500 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14510 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
14520 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b  el(v, nextCase);
14530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14540 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
14550 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14560 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
14570 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
14580 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
14590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
145a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
145b0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
145c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
145d0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
145e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
145f0 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
14600 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14610 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
14620 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  ache>0 );.      
14630 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
14640 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20  olCache--;.     
14650 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
14660 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14670 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
14680 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
14690 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
146a0 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20  ->trigStack ){. 
146b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
146c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146e0 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
146f0 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
14700 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
14710 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
14720 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14730 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14740 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 21  pExpr->affinity!
14750 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
14760 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14770 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
14780 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20  OE_Rollback ||. 
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147a0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
147b0 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20  == OE_Abort ||. 
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147d0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
147e0 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20  == OE_Fail );.  
147f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
14800 71 75 6f 74 65 45 78 70 72 28 64 62 2c 20 70 45  quoteExpr(db, pE
14810 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 73  xpr);.         s
14820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14830 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
14840 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
14850 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
14860 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
14870 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
14880 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
14890 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
148a0 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n);.      } else
148b0 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65   {.         asse
148c0 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  rt( pExpr->affin
148d0 69 74 79 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65  ity == OE_Ignore
148e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   );.         sql
148f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14900 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c  , OP_ContextPop,
14910 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
14920 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14930 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
14940 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  , pParse->trigSt
14950 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29  ack->ignoreJump)
14960 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62 65 43  ;.         VdbeC
14970 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 61 69 73  omment((v, "rais
14980 65 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20  e(IGNORE)"));.  
14990 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
149a0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
149b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
149c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
149d0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
149e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
149f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14a00 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75  egFree2);.  retu
14a10 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
14a20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
14a30 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
14a40 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
14a50 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
14a60 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
14a70 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ter.  Return the
14a80 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
14a90 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c   where the resul
14aa0 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  ts.** are stored
14ab0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
14ac0 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
14ad0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
14ae0 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c  that can be deal
14af0 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e  located,.** then
14b00 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65   write its numbe
14b10 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49  r into *pReg.  I
14b20 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67  f the result reg
14b30 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  ister is not.** 
14b40 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65  a temporary, the
14b50 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a  n set *pReg to z
14b60 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ero..*/.int sqli
14b70 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
14b80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
14b90 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
14ba0 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31  *pReg){.  int r1
14bb0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14bc0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
14bd0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
14be0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
14bf0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
14c00 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20  );.  if( r2==r1 
14c10 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72  ){.    *pReg = r
14c20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
14c30 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
14c40 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
14c50 29 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30  );.    *pReg = 0
14c60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
14c70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
14c80 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
14c90 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
14ca0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
14cb0 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
14cc0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
14cd0 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
14ce0 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
14cf0 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
14d00 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
14d10 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73  target..*/.int s
14d20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
14d30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
14d40 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
14d50 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
14d60 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
14d70 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
14d80 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
14d90 20 29 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71   );.  inReg = sq
14da0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
14db0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
14dc0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73  r, target);.  as
14dd0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
14de0 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  dbe || pParse->d
14df0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14e00 29 3b 0a 20 20 69 66 28 20 69 6e 52 65 67 21 3d  );.  if( inReg!=
14e10 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65  target && pParse
14e20 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73  ->pVdbe ){.    s
14e30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14e40 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
14e50 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
14e60 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20   target);.  }.  
14e70 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d  return target;.}
14e80 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
14e90 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75   code that evalu
14ea0 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
14eb0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
14ec0 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
14ed0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
14ee0 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
14ef0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
14f00 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
14f10 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
14f20 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
14f30 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
14f40 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
14f50 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
14f60 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
14f70 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
14f80 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
14f90 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
14fa0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
14fb0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
14fc0 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
14fd0 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
14fe0 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
14ff0 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
15000 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
15010 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
15020 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
15030 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
15040 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
15050 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
15060 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
15070 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
15080 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
15090 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
150a0 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69    int inReg;.  i
150b0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
150c0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
150d0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
150e0 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
150f0 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  0 );.  if( pExpr
15100 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
15110 52 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69  R ){  .    int i
15120 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20  Mem;.    iMem = 
15130 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
15140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15150 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
15160 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a  , inReg, iMem);.
15170 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
15180 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45  e = iMem;.    pE
15190 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
151a0 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ISTER;.  }.  ret
151b0 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
151c0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
151d0 69 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 63  if pExpr is an c
151e0 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
151f0 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
15200 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61  priate.** for fa
15210 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61  ctoring out of a
15220 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69   loop.  Appropri
15230 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
15240 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  are:.**.**    * 
15250 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
15260 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
15270 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70  o two or more op
15280 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  codes..**.**    
15290 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65  *  Any OP_Intege
152a0 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53  r, OP_Real, OP_S
152b0 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20  tring, OP_Blob, 
152c0 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20  OP_Null, .**    
152d0 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c     or OP_Variabl
152e0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
152f0 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65  need to be place
15300 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20  d in a .**      
15310 20 73 70 65 63 69 66 69 63 20 72 65 67 69 73 74   specific regist
15320 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  er..**.** There 
15330 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66  is no point in f
15340 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e  actoring out sin
15350 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20  gle-instruction 
15360 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72  constant.** expr
15370 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65  essions that nee
15380 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
15390 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
153a0 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65  egister.  .** We
153b0 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68   could factor th
153c0 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e  em out, but then
153d0 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70   we would end up
153e0 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50   adding an.** OP
153f0 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69  _SCopy instructi
15400 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76  on to move the v
15410 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f  alue into the co
15420 72 72 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a  rrect register.*
15430 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67  * later.  We mig
15440 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20  ht as well just 
15450 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  use the original
15460 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
15470 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50  .** avoid the OP
15480 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69  _SCopy..*/.stati
15490 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69  c int isAppropri
154a0 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28  ateForFactoring(
154b0 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
154c0 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
154d0 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29  nstantNotJoin(p)
154e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
154f0 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74  ;  /* Only const
15500 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ant expressions 
15510 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
15520 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f  for factoring */
15530 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66  .  }.  if( (p->f
15540 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 44  lags & EP_FixedD
15550 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  est)==0 ){.    r
15560 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79  eturn 1;  /* Any
15570 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75   constant withou
15580 74 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  t a fixed destin
15590 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72  ation is appropr
155a0 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68  iate */.  }.  wh
155b0 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
155c0 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c  PLUS ) p = p->pL
155d0 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70  eft;.  switch( p
155e0 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20  ->op ){.#ifndef 
155f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
15600 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
15610 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69  e TK_BLOB:.#endi
15620 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
15630 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65  RIABLE:.    case
15640 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
15650 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
15660 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
15670 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
15680 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65  RING: {.      te
15690 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
156a0 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20  K_BLOB );.      
156b0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
156c0 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a  =TK_VARIABLE );.
156d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
156e0 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  p->op==TK_INTEGE
156f0 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
15700 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ase( p->op==TK_F
15710 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65  LOAT );.      te
15720 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
15730 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  K_NULL );.      
15740 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
15750 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20  =TK_STRING );.  
15760 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e      /* Single-in
15770 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61  struction consta
15780 6e 74 73 20 77 69 74 68 20 61 20 66 69 78 65 64  nts with a fixed
15790 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65   destination are
157a0 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72  .      ** better
157b0 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20   done in-line.  
157c0 49 66 20 77 65 20 66 61 63 74 6f 72 20 74 68 65  If we factor the
157d0 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73  m, they will jus
157e0 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75  t end.      ** u
157f0 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20  p generating an 
15800 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65  OP_SCopy to move
15810 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68   the value to th
15820 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20  e destination.  
15830 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e      ** register.
15840 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
15850 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   0;.    }.    ca
15860 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
15870 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c         if( p->pL
15880 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
15890 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f  T || p->pLeft->o
158a0 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
158b0 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
158c0 20 30 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20   0;.       }.   
158d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
158e0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
158f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15900 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15910 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  1;.}../*.** If p
15920 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61  Expr is a consta
15930 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  nt expression th
15940 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
15950 65 20 66 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69  e for.** factori
15960 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ng out of a loop
15970 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
15980 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
15990 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
159a0 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68  r and convert th
159b0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74  e expression int
159c0 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  o a TK_REGISTER.
159d0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
159e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 76 61  /.static int eva
159f0 6c 43 6f 6e 73 74 45 78 70 72 28 57 61 6c 6b 65  lConstExpr(Walke
15a00 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
15a10 20 2a 70 45 78 70 72 29 7b 0a 20 20 50 61 72 73   *pExpr){.  Pars
15a20 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
15a30 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  ker->pParse;.  s
15a40 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
15a50 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
15a60 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
15a70 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
15a80 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  }.    case TK_FU
15a90 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
15aa0 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
15ab0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
15ac0 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20  NST_FUNC: {.    
15ad0 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
15ae0 74 73 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  ts to a function
15af0 20 68 61 76 65 20 61 20 66 69 78 65 64 20 64 65   have a fixed de
15b00 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20  stination..     
15b10 20 2a 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74 68   ** Mark them th
15b20 69 73 20 77 61 79 20 74 6f 20 61 76 6f 69 64 20  is way to avoid 
15b30 67 65 6e 65 72 61 74 65 64 20 75 6e 6e 65 65 64  generated unneed
15b40 65 64 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20  ed OP_SCopy.    
15b50 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
15b60 73 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  s. .      */.   
15b70 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
15b80 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
15b90 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ist;.      asser
15ba0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
15bb0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
15bc0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
15bd0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
15be0 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70         int i = p
15bf0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
15c00 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
15c10 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
15c20 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20   = pList->a;.   
15c30 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20       for(; i>0; 
15c40 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
15c50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
15c60 65 6d 2d 3e 70 45 78 70 72 20 29 20 70 49 74 65  em->pExpr ) pIte
15c70 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  m->pExpr->flags 
15c80 7c 3d 20 45 50 5f 46 69 78 65 64 44 65 73 74 3b  |= EP_FixedDest;
15c90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15ca0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
15cb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
15cc0 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72  isAppropriateFor
15cd0 46 61 63 74 6f 72 69 6e 67 28 70 45 78 70 72 29  Factoring(pExpr)
15ce0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d   ){.    int r1 =
15cf0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
15d00 0a 20 20 20 20 69 6e 74 20 72 32 3b 0a 20 20 20  .    int r2;.   
15d10 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
15d20 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
15d30 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
15d40 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29      if( r1!=r2 )
15d50 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
15d60 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
15d70 31 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f  1);.    pExpr->o
15d80 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
15d90 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
15da0 6c 65 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74  le = r2;.    ret
15db0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
15dc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
15dd0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
15de0 2a 2a 20 50 72 65 65 76 61 6c 75 61 74 65 20 63  ** Preevaluate c
15df0 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72 65  onstant subexpre
15e00 73 73 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45  ssions within pE
15e10 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
15e20 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
15e30 72 65 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69  registers.  Modi
15e40 66 79 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  fy pExpr so that
15e50 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75   the constant su
15e60 62 65 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61  bexpresions.** a
15e70 72 65 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f  re TK_REGISTER o
15e80 70 63 6f 64 65 73 20 74 68 61 74 20 72 65 66 65  pcodes that refe
15e90 72 20 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70  r to the precomp
15ea0 75 74 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  uted values..*/.
15eb0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
15ec0 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 50 61  CodeConstants(Pa
15ed0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
15ee0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
15ef0 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
15f00 43 61 6c 6c 62 61 63 6b 20 3d 20 65 76 61 6c 43  Callback = evalC
15f10 6f 6e 73 74 45 78 70 72 3b 0a 20 20 77 2e 78 53  onstExpr;.  w.xS
15f20 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
15f30 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  0;.  w.pParse = 
15f40 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
15f50 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
15f60 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  xpr);.}.../*.** 
15f70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
15f80 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
15f90 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
15fa0 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
15fb0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
15fc0 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
15fd0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
15fe0 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
15ff0 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
16000 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
16010 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
16020 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
16030 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
16040 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
16050 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
16060 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
16070 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
16080 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st,   /* The exp
16090 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
160a0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
160b0 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20  t target,       
160c0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
160d0 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  te results */.  
160e0 69 6e 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20  int doHardCopy  
160f0 20 20 20 2f 2a 20 4d 61 6b 65 20 61 20 68 61 72     /* Make a har
16100 64 20 63 6f 70 79 20 6f 66 20 65 76 65 72 79 20  d copy of every 
16110 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  element */.){.  
16120 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
16130 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
16140 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72  nt i, n;.  asser
16150 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
16160 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
16170 30 20 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74  0 );.  n = pList
16180 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70  ->nExpr;.  for(p
16190 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
161a0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49  =0; i<n; i++, pI
161b0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
161c0 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 29 7b  pItem->iAlias ){
161d0 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 67 20  .      int iReg 
161e0 3d 20 63 6f 64 65 41 6c 69 61 73 28 70 50 61 72  = codeAlias(pPar
161f0 73 65 2c 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61  se, pItem->iAlia
16200 73 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  s, pItem->pExpr,
16210 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
16220 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
16230 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
16240 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52  e);.      if( iR
16250 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a  eg!=target+i ){.
16260 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16270 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16280 53 43 6f 70 79 2c 20 69 52 65 67 2c 20 74 61 72  SCopy, iReg, tar
16290 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a  get+i);.      }.
162a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
162b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
162c0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
162d0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29  pExpr, target+i)
162e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
162f0 64 6f 48 61 72 64 43 6f 70 79 20 29 7b 0a 20 20  doHardCopy ){.  
16300 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 48      sqlite3ExprH
16310 61 72 64 43 6f 70 79 28 70 50 61 72 73 65 2c 20  ardCopy(pParse, 
16320 74 61 72 67 65 74 2c 20 6e 29 3b 0a 20 20 20 20  target, n);.    
16330 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
16340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
16350 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
16360 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
16370 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
16380 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
16390 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
163a0 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
163b0 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20  ion is true but 
163c0 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
163d0 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
163e0 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
163f0 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e  ession is false.
16400 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
16410 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
16420 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
16430 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
16440 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b  se), then.** tak
16450 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
16460 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61  e jumpIfNull fla
16470 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50  g is SQLITE_JUMP
16480 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  IFNULL..**.** Th
16490 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
164a0 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
164b0 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76   certain token v
164c0 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51  alues (ex: TK_EQ
164d0 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  ).** are the sam
164e0 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75  e as opcode valu
164f0 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74  es (ex: OP_Eq) t
16500 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  hat implement th
16510 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
16520 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ** operation.  S
16530 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20  pecial comments 
16540 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68  in vdbe.c and th
16550 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
16560 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65  script in.** the
16570 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61   make process ca
16580 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  use these values
16590 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65   to align.  Asse
165a0 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64  rt()s in the cod
165b0 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66  e.** below verif
165c0 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
165d0 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63  rs are aligned c
165e0 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69  orrectly..*/.voi
165f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
16600 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
16610 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
16620 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
16630 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
16640 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
16650 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
16660 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
16670 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
16680 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
16690 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
166a0 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
166b0 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
166c0 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
166d0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  ==0 );.  if( v==
166e0 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
166f0 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20 70  return;.  op = p
16700 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
16710 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
16720 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
16730 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
16740 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
16750 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
16760 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
16770 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
16780 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69  case( pParse->di
16790 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30  sableColCache==0
167a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
167b0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
167c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
167d0 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c  t, d2,jumpIfNull
167e0 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
167f0 4c 4c 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  LL);.      pPars
16800 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
16810 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  he++;.      sqli
16820 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
16830 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
16840 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
16850 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
16860 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69  sert( pParse->di
16870 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20  sableColCache>0 
16880 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
16890 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
168a0 2d 2d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  --;.      sqlite
168b0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
168c0 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
168d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
168e0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
168f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
16900 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
16910 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16920 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
16930 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20  olCache==0 );.  
16940 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
16950 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
16960 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
16970 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
16980 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
16990 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  ableColCache++;.
169a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
169b0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
169c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
169d0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
169e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
169f0 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
16a00 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20  olCache>0 );.   
16a10 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
16a20 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  leColCache--;.  
16a30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16a40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
16a50 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
16a60 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
16a70 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
16a80 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
16a90 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
16aa0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
16ab0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
16ac0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16ad0 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
16ae0 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
16af0 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
16b00 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
16b10 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
16b20 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
16b30 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
16b40 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
16b50 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
16b60 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
16b70 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
16b80 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
16b90 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
16ba0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16bb0 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
16bc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16bd0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
16be0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16bf0 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
16c00 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
16c10 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
16c20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16c30 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
16c40 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
16c50 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16c60 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
16c70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16c80 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
16c90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
16ca0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
16cb0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
16cc0 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c  Operands(pParse,
16cd0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
16ce0 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20  r1, &regFree1,. 
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d10 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
16d20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &r2, &regFree2);
16d30 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
16d40 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
16d50 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
16d60 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
16d80 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
16d90 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74  IfNull);.      t
16da0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16db0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
16dc0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
16dd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
16de0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16df0 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
16e00 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
16e10 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L: {.      asser
16e20 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
16e30 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  _IsNull );.     
16e40 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
16e50 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
16e60 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16e70 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
16e80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16e90 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
16ea0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
16eb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16ec0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
16ed0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
16ee0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
16ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16f00 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
16f10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16f20 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16f30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16f40 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
16f50 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
16f60 2f 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  /*    x BETWEEN 
16f70 79 20 41 4e 44 20 7a 0a 20 20 20 20 20 20 2a 2a  y AND z.      **
16f80 0a 20 20 20 20 20 20 2a 2a 20 49 73 20 65 71 75  .      ** Is equ
16f90 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20  ivalent to .    
16fa0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
16fb0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
16fc0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16fd0 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68   Code it as such
16fe0 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f  , taking care to
16ff0 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73   do the common s
17000 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  ubexpression.   
17010 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69     ** elementati
17020 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20 20 20 2a  on of x..      *
17030 2f 0a 20 20 20 20 20 20 45 78 70 72 20 65 78 70  /.      Expr exp
17040 72 41 6e 64 3b 0a 20 20 20 20 20 20 45 78 70 72  rAnd;.      Expr
17050 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20   compLeft;.     
17060 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
17070 0a 20 20 20 20 20 20 45 78 70 72 20 65 78 70 72  .      Expr expr
17080 58 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  X;..      assert
17090 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
170a0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
170b0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
170c0 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
170d0 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78  >pLeft;.      ex
170e0 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
170f0 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  D;.      exprAnd
17100 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
17110 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ft;.      exprAn
17120 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70  d.pRight = &comp
17130 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d  Right;.      com
17140 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
17150 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
17160 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
17170 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e  .      compLeft.
17180 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
17190 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
171a0 78 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52  xpr;.      compR
171b0 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b  ight.op = TK_LE;
171c0 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74  .      compRight
171d0 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
171e0 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74  .      compRight
171f0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
17200 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
17210 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72  Expr;.      expr
17220 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  X.iTable = sqlit
17230 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
17240 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26  Parse, &exprX, &
17250 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
17260 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
17270 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
17280 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45  exprX.op = TK_RE
17290 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 74 65  GISTER;.      te
172a0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
172b0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
172c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
172d0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
172e0 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
172f0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
17300 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
17310 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31  ault: {.      r1
17320 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17330 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
17340 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
17350 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17360 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
17370 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  If, r1, dest, ju
17380 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
17390 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
173a0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
173b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
173c0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
173d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
173e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
173f0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
17400 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
17410 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
17420 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
17430 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a  regFree2);  .}..
17440 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
17450 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
17460 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
17470 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
17480 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
17490 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
174a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
174b0 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63  s false but exec
174c0 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
174d0 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
174e0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
174f0 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  on is true..**.*
17500 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
17510 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
17520 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
17530 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74  rue nor false) t
17540 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a  hen.** jump if j
17550 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c  umpIfNull is SQL
17560 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f  ITE_JUMPIFNULL o
17570 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  r fall through i
17580 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20  f jumpIfNull.** 
17590 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  is 0..*/.void sq
175a0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
175b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
175c0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
175d0 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
175e0 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
175f0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
17600 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
17610 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
17620 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
17630 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
17640 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
17650 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
17660 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
17670 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
17680 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c   );.  if( v==0 |
17690 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  | pExpr==0 ) ret
176a0 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76  urn;..  /* The v
176b0 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f  alue of pExpr->o
176c0 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c  p and op are rel
176d0 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
176e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
176f0 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
17700 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20        op.  **   
17710 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20      ---------   
17720 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
17730 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  -.  **       TK_
17740 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20  ISNULL          
17750 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20  OP_NotNull.  ** 
17760 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c        TK_NOTNULL
17770 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75           OP_IsNu
17780 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
17790 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _NE             
177a0 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20   OP_Eq.  **     
177b0 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20    TK_EQ         
177c0 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20       OP_Ne.  ** 
177d0 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20        TK_GT     
177e0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20           OP_Le. 
177f0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20   **       TK_LE 
17800 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
17810 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Gt.  **       TK
17820 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _GE             
17830 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Lt.  **     
17840 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20    TK_LT         
17850 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a       OP_Ge.  **.
17860 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76    ** For other v
17870 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e  alues of pExpr->
17880 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69  op, op is undefi
17890 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a  ned and unused..
178a0 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    ** The value o
178b0 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
178c0 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61  nstants are arra
178d0 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77  nged such that w
178e0 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75  e.  ** can compu
178f0 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61  te the mapping a
17900 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66  bove using the f
17910 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
17920 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74  ion..  ** Assert
17930 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20  ()s verify that 
17940 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
17950 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f  is correct..  */
17960 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d  .  op = ((pExpr-
17970 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  >op+(TK_ISNULL&1
17980 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c  ))^1)-(TK_ISNULL
17990 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  &1);..  /* Verif
179a0 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d  y correct alignm
179b0 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  ent of TK_ and O
179c0 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a  P_ constants.  *
179d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  /.  assert( pExp
179e0 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  r->op!=TK_ISNULL
179f0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75   || op==OP_NotNu
17a00 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
17a10 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f  pExpr->op!=TK_NO
17a20 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TNULL || op==OP_
17a30 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  IsNull );.  asse
17a40 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
17a50 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45  K_NE || op==OP_E
17a60 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  q );.  assert( p
17a70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
17a80 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  || op==OP_Ne );.
17a90 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
17aa0 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70  >op!=TK_LT || op
17ab0 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ge );.  ass
17ac0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
17ad0 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LE || op==OP_
17ae0 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Gt );.  assert( 
17af0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54  pExpr->op!=TK_GT
17b00 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b   || op==OP_Le );
17b10 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
17b20 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f  ->op!=TK_GE || o
17b30 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73  p==OP_Lt );..  s
17b40 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
17b50 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
17b60 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  AND: {.      tes
17b70 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
17b80 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  l==0 );.      te
17b90 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e  stcase( pParse->
17ba0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d  disableColCache=
17bb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
17bc0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
17bd0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
17be0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
17bf0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50  fNull);.      pP
17c00 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
17c10 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73  Cache++;.      s
17c20 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
17c30 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
17c40 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
17c50 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
17c60 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
17c70 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
17c80 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  e>0 );.      pPa
17c90 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
17ca0 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72  ache--;.      br
17cb0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
17cc0 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
17cd0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
17ce0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17cf0 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
17d00 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
17d10 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
17d20 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69  case( pParse->di
17d30 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30  sableColCache==0
17d40 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17d50 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
17d60 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17d70 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  , d2, jumpIfNull
17d80 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
17d90 4c 4c 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  LL);.      pPars
17da0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
17db0 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  he++;.      sqli
17dc0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
17dd0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
17de0 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
17df0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
17e00 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
17e10 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30  isableColCache>0
17e20 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   );.      pParse
17e30 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
17e40 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e--;.      sqlit
17e50 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17e60 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
17e70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17e80 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
17e90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17ea0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
17eb0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
17ec0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
17ed0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17ee0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
17ef0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
17f00 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
17f10 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
17f20 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
17f30 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
17f40 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _EQ: {.      tes
17f50 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54  tcase( op==TK_LT
17f60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17f70 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  se( op==TK_LE );
17f80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17f90 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20   op==TK_GT );.  
17fa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17fb0 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
17fc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17fd0 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
17fe0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
17ff0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
18000 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
18010 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
18020 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28  CompareOperands(
18030 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18040 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46  Left, &r1, &regF
18050 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ree1,.          
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
18080 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67  Right, &r2, &reg
18090 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
180a0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
180b0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
180c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
180d0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
180e0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
180f0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
18100 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18110 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
18120 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
18130 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
18140 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18150 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
18160 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
18170 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
18180 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
18190 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
181a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
181b0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
181c0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
181d0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
181e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
181f0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
18200 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18210 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
18220 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
18230 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
18240 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
18250 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
18260 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
18270 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78   {.      /*    x
18280 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
18290 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
182a0 2a 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74  ** Is equivalent
182b0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20   to .      **.  
182c0 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
182d0 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a  ND x<=z.      **
182e0 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69  .      ** Code i
182f0 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e  t as such, takin
18300 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65  g care to do the
18310 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65   common subexpre
18320 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65  ssion.      ** e
18330 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
18340 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18350 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20   Expr exprAnd;. 
18360 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65       Expr compLe
18370 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63  ft;.      Expr c
18380 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ompRight;.      
18390 45 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20  Expr exprX;..   
183a0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
183b0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
183c0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
183d0 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 20   );.      exprX 
183e0 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
183f0 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 6f  .      exprAnd.o
18400 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
18410 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
18420 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20  = &compLeft;.   
18430 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68     exprAnd.pRigh
18440 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a  t = &compRight;.
18450 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f        compLeft.o
18460 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 20  p = TK_GE;.     
18470 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20   compLeft.pLeft 
18480 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20  = &exprX;.      
18490 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
184a0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
184b0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
184c0 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70      compRight.op
184d0 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20   = TK_LE;.      
184e0 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
184f0 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20  = &exprX;.      
18500 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74  compRight.pRight
18510 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
18520 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
18530 20 20 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c       exprX.iTabl
18540 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  e = sqlite3ExprC
18550 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
18560 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65  &exprX, &regFree
18570 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
18580 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
18590 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f  );.      exprX.o
185a0 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
185b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
185c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
185d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
185e0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
185f0 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
18600 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
18610 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18620 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
18630 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
18640 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
18650 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
18660 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
18670 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18680 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op3(v, OP_IfNot,
18690 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
186a0 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
186b0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
186c0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
186d0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
186e0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
186f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18700 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
18710 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18720 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
18730 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18740 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
18750 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Free2);.}../*.**
18760 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
18770 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
18780 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
18790 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e  Return TRUE (non
187a0 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65  -zero).** if the
187b0 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20  y are identical 
187c0 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45  and return FALSE
187d0 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
187e0 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
187f0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
18800 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
18810 74 75 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20  turn FALSE even 
18820 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
18830 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79  ssions.** really
18840 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   are equivalent.
18850 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70    If we cannot p
18860 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78  rove that the ex
18870 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
18880 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72   identical, we r
18890 65 74 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74  eturn FALSE just
188a0 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
188b0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
188c0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73  .** returns fals
188d0 65 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  e, then you do n
188e0 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
188f0 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
18900 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
18910 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
18920 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
18930 65 74 20 61 20 54 52 55 45 20 72 65 74 75 72 6e  et a TRUE return
18940 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61  , then you.** ca
18950 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78  n be sure the ex
18960 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
18970 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20  e same.  In the 
18980 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20  places where.** 
18990 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
189a0 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f  used, it does no
189b0 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e  t hurt to get an
189c0 20 65 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74   extra FALSE - t
189d0 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68  hat.** just migh
189e0 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65  t result in some
189f0 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72   slightly slower
18a00 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75   code.  But retu
18a10 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f  rning.** an inco
18a20 72 72 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64  rrect TRUE could
18a30 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
18a40 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
18a50 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
18a60 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
18a70 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *pB){.  int i;.
18a80 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d    if( pA==0||pB=
18a90 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
18aa0 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69   pB==pA;.  }.  i
18ab0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
18ac0 74 79 28 70 41 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pA, EP_xIsSel
18ad0 65 63 74 29 20 7c 7c 20 45 78 70 72 48 61 73 50  ect) || ExprHasP
18ae0 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f 78  roperty(pB, EP_x
18af0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
18b00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
18b10 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20   if( (pA->flags 
18b20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d  & EP_Distinct)!=
18b30 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pB->flags & EP_
18b40 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75  Distinct) ) retu
18b50 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
18b60 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74  op!=pB->op ) ret
18b70 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
18b80 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
18b90 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e  (pA->pLeft, pB->
18ba0 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20  pLeft) ) return 
18bb0 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
18bc0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
18bd0 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69  >pRight, pB->pRi
18be0 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ght) ) return 0;
18bf0 0a 0a 20 20 69 66 28 20 70 41 2d 3e 78 2e 70 4c  ..  if( pA->x.pL
18c00 69 73 74 20 26 26 20 70 42 2d 3e 78 2e 70 4c 69  ist && pB->x.pLi
18c10 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  st ){.    if( pA
18c20 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
18c30 21 3d 70 42 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  !=pB->x.pList->n
18c40 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b  Expr ) return 0;
18c50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
18c60 70 41 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pA->x.pList->nEx
18c70 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
18c80 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70  Expr *pExprA = p
18c90 41 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  A->x.pList->a[i]
18ca0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78  .pExpr;.      Ex
18cb0 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d  pr *pExprB = pB-
18cc0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
18cd0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
18ce0 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
18cf0 61 72 65 28 70 45 78 70 72 41 2c 20 70 45 78 70  are(pExprA, pExp
18d00 72 42 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  rB) ) return 0;.
18d10 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
18d20 28 20 70 41 2d 3e 78 2e 70 4c 69 73 74 20 7c 7c  ( pA->x.pList ||
18d30 20 70 42 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a   pB->x.pList ){.
18d40 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18d50 7d 0a 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61  }..  if( pA->iTa
18d60 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20  ble!=pB->iTable 
18d70 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  || pA->iColumn!=
18d80 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65  pB->iColumn ) re
18d90 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
18da0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
18db0 26 26 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  && pA->token.z )
18dc0 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  {.    if( pB->to
18dd0 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72  ken.z==0 ) retur
18de0 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d  n 0;.    if( pB-
18df0 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f  >token.n!=pA->to
18e00 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20 30  ken.n ) return 0
18e10 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
18e20 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
18e30 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28 63 68  )pA->token.z,(ch
18e40 61 72 2a 29 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c  ar*)pB->token.z,
18e50 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20  pB->token.n)!=0 
18e60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
18e70 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
18e80 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 1;.}.../*.
18e90 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
18ea0 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
18eb0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
18ec0 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
18ed0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
18ee0 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
18ef0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
18f00 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
18f10 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
18f20 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
18f30 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a  Column(sqlite3 *
18f40 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
18f50 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
18f60 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
18f70 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
18f80 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20  te(.       db,. 
18f90 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
18fa0 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  l,.       sizeof
18fb0 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29  (pInfo->aCol[0])
18fc0 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20  ,.       3,.    
18fd0 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
18fe0 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  mn,.       &pInf
18ff0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c  o->nColumnAlloc,
19000 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
19010 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
19020 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e   ../*.** Add a n
19030 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
19040 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
19050 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  c[] array.  Retu
19060 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
19070 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
19080 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
19090 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
190a0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
190b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
190c0 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69  AggInfoFunc(sqli
190d0 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
190e0 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
190f0 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  i;.  pInfo->aFun
19100 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  c = sqlite3Array
19110 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
19120 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e   db, .       pIn
19130 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20  fo->aFunc,.     
19140 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
19150 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20  aFunc[0]),.     
19160 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e    3,.       &pIn
19170 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
19180 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41    &pInfo->nFuncA
19190 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  lloc,.       &i.
191a0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
191b0 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .}    ../*.** Th
191c0 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43  is is the xExprC
191d0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72  allback for a tr
191e0 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69  ee walker.  It i
191f0 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70  s used to.** imp
19200 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78  lement sqlite3Ex
19210 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
19220 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
19230 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
19240 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
19250 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
19260 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
19270 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
19280 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70  regate(Walker *p
19290 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
192a0 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
192b0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
192c0 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
192d0 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  NC;.  Parse *pPa
192e0 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
192f0 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e;.  SrcList *pS
19300 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
19310 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66  rcList;.  AggInf
19320 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e  o *pAggInfo = pN
19330 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20  C->pAggInfo;..  
19340 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
19350 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
19360 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
19370 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
19380 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
19390 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
193a0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
193b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
193c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
193d0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  UMN );.      /* 
193e0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
193f0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
19400 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
19410 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
19420 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
19430 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
19440 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
19450 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
19460 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
19470 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
19480 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
19490 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
194a0 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
194b0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
194c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
194d0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
194e0 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
194f0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
19500 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
19510 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
19520 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
19530 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
19540 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
19550 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
19560 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
19570 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
19580 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
19590 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
195a0 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
195b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
195c0 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
195d0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
195e0 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
195f0 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
19600 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
19610 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
19620 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
19630 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
19640 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
19650 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
19660 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
19670 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
19680 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
19690 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
196a0 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
196b0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
196c0 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
196d0 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
196f0 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
19700 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
19720 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
19730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
19740 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
19750 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
19760 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
19770 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
19780 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
19790 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
197a0 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
197b0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
197c0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
197d0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
197e0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
197f0 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
19800 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
19810 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
19820 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
19830 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
19840 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
19850 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
19860 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
19870 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
19880 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
198a0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
198b0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
198c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
198d0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
198e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
198f0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
19900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
19910 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
19930 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
19940 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
19950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19960 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
19970 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
19980 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
19990 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
199a0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
199b0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
199c0 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
199d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
199e0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
199f0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a10 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
19a20 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
19a30 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
19a40 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
19a50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
19a60 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
19a70 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a90 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
19aa0 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
19ac0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
19ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19ae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19af0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19b00 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
19b10 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
19b20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
19b30 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
19b40 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
19b50 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
19b60 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
19b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19b80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
19b90 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
19ba0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
19bb0 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
19bc0 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
19be0 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
19bf0 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
19c00 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
19c10 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
19c20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
19c30 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
19c40 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
19c50 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
19c60 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
19c70 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
19c80 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
19c90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
19ca0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
19cb0 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
19cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
19cd0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
19ce0 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
19cf0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
19d00 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20   = k;.          
19d10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19d20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
19d30 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
19d40 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
19d50 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
19d60 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
19d70 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
19d80 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
19d90 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
19da0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
19db0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  TION: {.      /*
19dc0 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68   The pNC->nDepth
19dd0 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65 73 20  ==0 test causes 
19de0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
19df0 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69 65  ons in subquerie
19e00 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65  s.      ** to be
19e10 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20   ignored */.    
19e20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74    if( pNC->nDept
19e30 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h==0 ){.        
19e40 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
19e50 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
19e60 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
19e70 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
19e80 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
19e90 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
19ea0 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
19eb0 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
19ec0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
19ed0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
19ee0 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
19ef0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
19f00 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
19f10 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
19f20 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
19f30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
19f40 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
19f50 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70  (pItem->pExpr, p
19f60 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
19f70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19f90 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
19fa0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  =pAggInfo->nFunc
19fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
19fc0 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e   pExpr is origin
19fd0 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20  al.  Make a new 
19fe0 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66  entry in pAggInf
19ff0 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20  o->aFunc[].     
1a000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1a010 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
1a020 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
1a030 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67        i = addAgg
1a040 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d  InfoFunc(pParse-
1a050 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a  >db, pAggInfo);.
1a060 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
1a070 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1a080 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1a090 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1a0a0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1a0b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
1a0c0 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
1a0d0 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
1a0e0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
1a0f0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
1a100 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
1a110 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
1a120 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
1a130 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
1a140 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
1a150 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
1a160 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1a170 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78        (char*)pEx
1a180 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
1a190 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20  pr->token.n,.   
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1b0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f  pExpr->x.pList ?
1a1c0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1a1d0 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
1a1e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1a1f0 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
1a200 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20  s & EP_Distinct 
1a210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1a220 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
1a230 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
1a240 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1a250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1a260 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
1a270 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
1a280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a290 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1a2a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
1a2b0 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74  pExpr point to t
1a2c0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
1a2d0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
1a2e0 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a   entry.        *
1a2f0 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  /.        pExpr-
1a300 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
1a310 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
1a320 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
1a330 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
1a340 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
1a350 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1a360 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1a370 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
1a380 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1a390 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20  InSelect(Walker 
1a3a0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
1a3b0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 4e 61   *pSelect){.  Na
1a3c0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
1a3d0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
1a3e0 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70  .  if( pNC->nDep
1a3f0 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 43  th==0 ){.    pNC
1a400 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20  ->nDepth++;.    
1a410 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1a420 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65  t(pWalker, pSele
1a430 63 74 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  ct);.    pNC->nD
1a440 65 70 74 68 2d 2d 3b 0a 20 20 20 20 72 65 74 75  epth--;.    retu
1a450 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1a460 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
1a470 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1a480 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61    }.}../*.** Ana
1a490 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65  lyze the given e
1a4a0 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
1a4b0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
1a4c0 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
1a4d0 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
1a4e0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
1a4f0 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72  dded to the pPar
1a500 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
1a510 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69  ..** Make additi
1a520 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20  onal entries to 
1a530 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
1a540 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
1a550 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
1a560 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
1a570 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
1a580 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
1a590 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
1a5a0 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
1a5b0 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
1a5c0 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
1a5d0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1a5e0 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
1a5f0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
1a600 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
1a610 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
1a620 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
1a630 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
1a640 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
1a650 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
1a660 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
1a670 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
1a680 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
1a690 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
1a6a0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
1a6b0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1a6c0 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
1a6d0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
1a6e0 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
1a6f0 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
1a700 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1a710 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
1a720 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
1a730 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
1a740 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
1a750 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1a760 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
1a770 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
1a780 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
1a790 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
1a7a0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1a7b0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
1a7c0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1a7d0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1a7e0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
1a7f0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
1a800 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
1a810 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
1a820 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
1a830 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
1a840 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1a850 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64  ** Allocate or d
1a860 65 61 6c 6c 6f 63 61 74 65 20 74 65 6d 70 6f 72  eallocate tempor
1a870 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
1a880 73 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65  s during code ge
1a890 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  neration..*/.int
1a8a0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1a8b0 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
1a8c0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
1a8d0 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
1a8e0 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
1a8f0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
1a900 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
1a910 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
1a920 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
1a930 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
1a940 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
1a950 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1a960 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20  eg){.  if( iReg 
1a970 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
1a980 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
1a990 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
1a9a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1a9b0 70 72 57 72 69 74 61 62 6c 65 52 65 67 69 73 74  prWritableRegist
1a9c0 65 72 28 70 50 61 72 73 65 2c 20 69 52 65 67 29  er(pParse, iReg)
1a9d0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  ;.    pParse->aT
1a9e0 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
1a9f0 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
1aa00 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
1aa10 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
1aa20 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
1aa30 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
1aa40 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a  ve registers.*/.
1aa50 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
1aa60 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
1aa70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
1aa80 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
1aa90 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
1aaa0 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
1aab0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
1aac0 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 26 26    if( nReg<=n &&
1aad0 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
1aae0 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
1aaf0 2b 6e 2d 31 29 20 29 7b 0a 20 20 20 20 70 50 61  +n-1) ){.    pPa
1ab00 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
1ab10 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
1ab20 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
1ab30 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
1ab40 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
1ab50 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
1ab60 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
1ab70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1ab80 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
1ab90 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1aba0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1abb0 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
1abc0 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg){.  if( nReg>
1abd0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
1abe0 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
1abf0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
1ac00 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
1ac10 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
1ac20 0a 20 20 7d 0a 7d 0a                             .  }.}.