/ Hex Artifact Content
Login

Artifact 0a23a7f58084a40c38e1fc3afcd8adbbc8950b45:


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 30 32 20 32 30 30 38 2f 31 31 2f 31 32 20  .402 2008/11/12 
0220: 30 38 3a 30 37 3a 31 32 20 64 61 6e 69 65 6c 6b  08:07:12 danielk
0230: 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69  1977 Exp $.*/.#i
0240: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0250: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0260: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 52  type.h>../*.** R
0270: 65 74 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e  eturn the 'affin
0280: 69 74 79 27 20 6f 66 20 74 68 65 20 65 78 70 72  ity' of the expr
0290: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20  ession pExpr if 
02a0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  any..**.** If pE
02b0: 78 70 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  xpr is a column,
02c0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
02d0: 61 20 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20  a column via an 
02e0: 27 41 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f  'AS' alias,.** o
02f0: 72 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77  r a sub-select w
0300: 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20  ith a column as 
0310: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
0320: 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61  , then the .** a
0330: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20  ffinity of that 
0340: 63 6f 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e  column is return
0350: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
0360: 78 30 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c  x00 is returned,
0370: 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  .** indicating n
0380: 6f 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74  o affinity for t
0390: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
03a0: 2a 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48  *.** i.e. the WH
03b0: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
03c0: 73 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 66  sssions in the f
03d0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
03e0: 6e 74 73 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20  nts all.** have 
03f0: 61 6e 20 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a  an affinity:.**.
0400: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
0410: 74 31 28 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54  t1(a);.** SELECT
0420: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
0430: 20 61 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20   a;.** SELECT a 
0440: 41 53 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45  AS b FROM t1 WHE
0450: 52 45 20 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20  RE b;.** SELECT 
0460: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
0470: 28 73 65 6c 65 63 74 20 61 20 66 72 6f 6d 20 74  (select a from t
0480: 31 29 3b 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  1);.*/.char sqli
0490: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
04b0: 69 6e 74 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  int op = pExpr->
04c0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
04d0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72  _SELECT ){.    r
04e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
04f0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0500: 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  >pSelect->pEList
0510: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
0520: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
0530: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 69 66  E_OMIT_CAST.  if
0540: 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b  ( op==TK_CAST ){
0550: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0560: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0570: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
0580: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
0590: 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c   (op==TK_AGG_COL
05a0: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f  UMN || op==TK_CO
05b0: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52  LUMN || op==TK_R
05c0: 45 47 49 53 54 45 52 29 20 0a 20 20 20 26 26 20  EGISTER) .   && 
05d0: 70 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20  pExpr->pTab!=0. 
05e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54   ){.    /* op==T
05f0: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45  K_REGISTER && pE
0600: 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70  xpr->pTab!=0 hap
0610: 70 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20  pens when pExpr 
0620: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
0630: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
0640: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
0650: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
0660: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
0670: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69  egister */.    i
0680: 6e 74 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43  nt j = pExpr->iC
0690: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a  olumn;.    if( j
06a0: 3c 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <0 ) return SQLI
06b0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
06c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
06d0: 72 2d 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78  r->pTab && j<pEx
06e0: 70 72 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  pr->pTab->nCol )
06f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  ;.    return pEx
0700: 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pr->pTab->aCol[j
0710: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a  ].affinity;.  }.
0720: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
0730: 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a  affinity;.}../*.
0740: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
0750: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
0760: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  r expression pEx
0770: 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c  pr to be the col
0780: 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
0790: 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b  ce named by pTok
07a0: 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70  en.   Return a p
07b0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65  ointer to the re
07c0: 76 69 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e  vised expression
07d0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  ..** The collati
07e0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d  ng sequence is m
07f0: 61 72 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63  arked as "explic
0800: 69 74 22 20 75 73 69 6e 67 20 74 68 65 20 45 50  it" using the EP
0810: 5f 45 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66  _ExpCollate.** f
0820: 6c 61 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69  lag.  An explici
0830: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
0840: 65 6e 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69  ence will overri
0850: 64 65 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63  de implicit.** c
0860: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0870: 65 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  es..*/.Expr *sql
0880: 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28  ite3ExprSetColl(
0890: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
08a0: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
08b0: 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 29 7b 0a 20  n *pCollName){. 
08c0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30   char *zColl = 0
08d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
08e0: 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66  Dequoted name of
08f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0900: 6e 63 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  nce */.  CollSeq
0910: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74   *pColl;.  sqlit
0920: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0930: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
0940: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
0950: 6b 65 6e 28 64 62 2c 20 70 43 6f 6c 6c 4e 61 6d  ken(db, pCollNam
0960: 65 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20  e);.  if( pExpr 
0970: 26 26 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  && zColl ){.    
0980: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
0990: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
09a0: 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b  rse, zColl, -1);
09b0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
09c0: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  {.      pExpr->p
09d0: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  Coll = pColl;.  
09e0: 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73      pExpr->flags
09f0: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
0a00: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  e;.    }.  }.  s
0a10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
0a20: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72   zColl);.  retur
0a30: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pExpr;.}../*.*
0a40: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  * Return the def
0a50: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
0a60: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
0a70: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0a80: 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73  . If.** there is
0a90: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
0aa0: 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74 75  ation type, retu
0ab0: 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  rn 0..*/.CollSeq
0ac0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
0ad0: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
0ae0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
0af0: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
0b00: 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a  ll = 0;.  Expr *
0b10: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69  p = pExpr;.  whi
0b20: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  le( p ){.    int
0b30: 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d   op;.    pColl =
0b40: 20 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69   p->pColl;.    i
0b50: 66 28 20 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b  f( pColl ) break
0b60: 3b 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ;.    op = p->op
0b70: 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54  ;.    if( (op==T
0b80: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  K_AGG_COLUMN || 
0b90: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
0ba0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
0bb0: 29 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20  ) && p->pTab!=0 
0bc0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
0bd0: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
0be0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
0bf0: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
0c00: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
0c10: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
0c20: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
0c30: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
0c40: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
0c50: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
0c60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
0c70: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  l;.      int j =
0c80: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
0c90: 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20     if( j>=0 ){. 
0ca0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a         sqlite3 *
0cb0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0cc0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  .        zColl =
0cd0: 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a   p->pTab->aCol[j
0ce0: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
0cf0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
0d00: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
0d10: 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
0d20: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  -1, 0);.        
0d30: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pExpr->pColl = p
0d40: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
0d50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0d60: 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  .    if( op!=TK_
0d70: 43 41 53 54 20 26 26 20 6f 70 21 3d 54 4b 5f 55  CAST && op!=TK_U
0d80: 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 62 72  PLUS ){.      br
0d90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
0da0: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d   = p->pLeft;.  }
0db0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
0dc0: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
0dd0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
0de0: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
0df0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
0e00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
0e10: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
0e20: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
0e30: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
0e40: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
0e50: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
0e60: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
0e70: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
0e80: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
0e90: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
0ea0: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
0eb0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
0ec0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
0ed0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
0ee0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
0ef0: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
0f00: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
0f10: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
0f20: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
0f30: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
0f40: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
0f50: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
0f60: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
0f70: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
0f80: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
0f90: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
0fa0: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
0fb0: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
0fc0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0fd0: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
0fe0: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
0ff0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1000: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
1010: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1020: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
1030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1040: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1050: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
1060: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1070: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1080: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
1090: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
10a0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
10b0: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
10c0: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
10d0: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
10e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
10f0: 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NONE;.  }else{.
1100: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
1110: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
1120: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
1130: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
1140: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
1150: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1160: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1170: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1180: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
1190: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
11a0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
11b0: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
11c0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
11d0: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
11e0: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
11f0: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1200: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1210: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1220: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1230: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1240: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1250: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1260: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1270: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1280: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
1290: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
12a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
12b0: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
12c0: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
12d0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
12e0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
12f0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ->op==TK_NE );. 
1300: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1310: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
1320: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1330: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
1340: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
1350: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
1360: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
1370: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1380: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
1390: 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
13a0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
13b0: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
13c0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
13d0: 74 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  ty(pExpr->pSelec
13e0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
13f0: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
1400: 0a 20 20 65 6c 73 65 20 69 66 28 20 21 61 66 66  .  else if( !aff
1410: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
1420: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1430: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
1440: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1450: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1460: 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20  expression, eg. 
1470: 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e  '=', '<', IN(...
1480: 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66  ) etc..** idx_af
1490: 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66  finity is the af
14a0: 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64  finity of an ind
14b0: 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74  exed column. Ret
14c0: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74  urn true.** if t
14d0: 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66  he index with af
14e0: 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e  finity idx_affin
14f0: 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20  ity may be used 
1500: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
1510: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1520: 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20  n pExpr..*/.int 
1530: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
1540: 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78  nityOk(Expr *pEx
1550: 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66  pr, char idx_aff
1560: 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61  inity){.  char a
1570: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
1580: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
1590: 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b    switch( aff ){
15a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
15b0: 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20  _AFF_NONE:.     
15c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63   return 1;.    c
15d0: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
15e0: 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72  EXT:.      retur
15f0: 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d  n idx_affinity==
1600: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
1610: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
1620: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1630: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1640: 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79  ity(idx_affinity
1650: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1660: 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61  Return the P5 va
1670: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
1680: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
1690: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
16a0: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
16b0: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
16c0: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
16d0: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
16e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69  .*/.static u8 bi
16f0: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78  naryCompareP5(Ex
1700: 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72  pr *pExpr1, Expr
1710: 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75   *pExpr2, int ju
1720: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20  mpIfNull){.  u8 
1730: 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69  aff = (char)sqli
1740: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1750: 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d  pExpr2);.  aff =
1760: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
1770: 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20  ffinity(pExpr1, 
1780: 61 66 66 29 20 7c 20 6a 75 6d 70 49 66 4e 75 6c  aff) | jumpIfNul
1790: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  l;.  return aff;
17a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
17c0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
17d0: 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64  ence that should
17e0: 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61   be used by.** a
17f0: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
1800: 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70  on operator comp
1810: 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20  aring pLeft and 
1820: 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  pRight..**.** If
1830: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65   the left hand e
1840: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
1850: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1860: 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74  ce type, then it
1870: 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68   is.** used. Oth
1880: 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61  erwise the colla
1890: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
18a0: 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  r the right hand
18b0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
18c0: 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64  s used, or the d
18d0: 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20  efault (BINARY) 
18e0: 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65  if neither expre
18f0: 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c  ssion has a coll
1900: 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a  ating.** type..*
1910: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52  *.** Argument pR
1920: 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c  ight (but not pL
1930: 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75  eft) may be a nu
1940: 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74  ll pointer. In t
1950: 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20  his case,.** it 
1960: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
1970: 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  d..*/.CollSeq *s
1980: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
1990: 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61  areCollSeq(.  Pa
19a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
19b0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20  Expr *pLeft, .  
19c0: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
19d0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
19e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
19f0: 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  t );.  if( pLeft
1a00: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
1a10: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61  Collate ){.    a
1a20: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43  ssert( pLeft->pC
1a30: 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  oll );.    pColl
1a40: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
1a50: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
1a60: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66  ght && pRight->f
1a70: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
1a80: 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65  late ){.    asse
1a90: 72 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c  rt( pRight->pCol
1aa0: 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  l );.    pColl =
1ab0: 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a   pRight->pColl;.
1ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f    }else{.    pCo
1ad0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1ae0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1af0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
1b00: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
1b10: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1b20: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1b30: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
1b40: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1b50: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Coll;.}../*.** G
1b60: 65 6e 65 72 61 74 65 20 74 68 65 20 6f 70 65 72  enerate the oper
1b70: 61 6e 64 73 20 66 6f 72 20 61 20 63 6f 6d 70 61  ands for a compa
1b80: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  rison operation.
1b90: 20 20 42 65 66 6f 72 65 0a 2a 2a 20 67 65 6e 65    Before.** gene
1ba0: 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20  rating the code 
1bb0: 66 6f 72 20 65 61 63 68 20 6f 70 65 72 61 6e 64  for each operand
1bc0: 2c 20 73 65 74 20 74 68 65 20 45 50 5f 41 6e 79  , set the EP_Any
1bd0: 41 66 66 0a 2a 2a 20 66 6c 61 67 20 6f 6e 20 74  Aff.** flag on t
1be0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
1bf0: 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
1c00: 20 61 62 6c 65 20 74 6f 20 75 73 65 64 20 61 0a   able to used a.
1c10: 2a 2a 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e  ** cached column
1c20: 20 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 20   value that has 
1c30: 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 64 65 72  previously under
1c40: 67 6f 6e 65 20 61 6e 0a 2a 2a 20 61 66 66 69 6e  gone an.** affin
1c50: 69 74 79 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 73  ity change..*/.s
1c60: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 43  tatic void codeC
1c70: 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 0a  ompareOperands(.
1c80: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1c90: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
1ca0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1cb0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1cc0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
1cd0: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
1ce0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  erand */.  int *
1cf0: 70 52 65 67 4c 65 66 74 2c 20 20 20 20 2f 2a 20  pRegLeft,    /* 
1d00: 52 65 67 69 73 74 65 72 20 77 68 65 72 65 20 6c  Register where l
1d10: 65 66 74 20 6f 70 65 72 61 6e 64 20 69 73 20 73  eft operand is s
1d20: 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  tored */.  int *
1d30: 70 46 72 65 65 4c 65 66 74 2c 20 20 20 2f 2a 20  pFreeLeft,   /* 
1d40: 46 72 65 65 20 74 68 69 73 20 72 65 67 69 73 74  Free this regist
1d50: 65 72 20 77 68 65 6e 20 64 6f 6e 65 20 2a 2f 0a  er when done */.
1d60: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
1d70: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1d80: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1d90: 74 20 2a 70 52 65 67 52 69 67 68 74 2c 20 20 20  t *pRegRight,   
1da0: 2f 2a 20 52 65 67 69 73 74 65 72 20 77 68 65 72  /* Register wher
1db0: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1dc0: 69 73 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69  is stored */.  i
1dd0: 6e 74 20 2a 70 46 72 65 65 52 69 67 68 74 20 20  nt *pFreeRight  
1de0: 20 2f 2a 20 57 72 69 74 65 20 74 65 6d 70 20 72   /* Write temp r
1df0: 65 67 69 73 74 65 72 20 66 6f 72 20 72 69 67 68  egister for righ
1e00: 74 20 6f 70 65 72 61 6e 64 20 74 68 65 72 65 20  t operand there 
1e10: 2a 2f 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  */.){.  while( p
1e20: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  Left->op==TK_UPL
1e30: 55 53 20 29 20 70 4c 65 66 74 20 3d 20 70 4c 65  US ) pLeft = pLe
1e40: 66 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 4c 65  ft->pLeft;.  pLe
1e50: 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ft->flags |= EP_
1e60: 41 6e 79 41 66 66 3b 0a 20 20 2a 70 52 65 67 4c  AnyAff;.  *pRegL
1e70: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
1e80: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e90: 2c 20 70 4c 65 66 74 2c 20 70 46 72 65 65 4c 65  , pLeft, pFreeLe
1ea0: 66 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 52  ft);.  while( pR
1eb0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  ight->op==TK_UPL
1ec0: 55 53 20 29 20 70 52 69 67 68 74 20 3d 20 70 52  US ) pRight = pR
1ed0: 69 67 68 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70  ight->pLeft;.  p
1ee0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  Right->flags |= 
1ef0: 45 50 5f 41 6e 79 41 66 66 3b 0a 20 20 2a 70 52  EP_AnyAff;.  *pR
1f00: 65 67 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  egRight = sqlite
1f10: 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f20: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 70 46  arse, pRight, pF
1f30: 72 65 65 52 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a  reeRight);.}../*
1f40: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1f50: 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73  e for a comparis
1f60: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
1f70: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43  static int codeC
1f80: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
1f90: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54  *pParse,    /* T
1fa0: 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20  he parsing (and 
1fb0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29  code generating)
1fc0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1fd0: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
1fe0: 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72  /* The left oper
1ff0: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
2000: 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68  Right,     /* Th
2010: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
2020: 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c  */.  int opcode,
2030: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2040: 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20  mparison opcode 
2050: 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e  */.  int in1, in
2060: 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74  t in2, /* Regist
2070: 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61  er holding opera
2080: 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  nds */.  int des
2090: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
20a0: 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e  mp here if true.
20b0: 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49    */.  int jumpI
20c0: 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74  fNull    /* If t
20d0: 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74  rue, jump if eit
20e0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
20f0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ULL */.){.  int 
2100: 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p5;.  int addr;.
2110: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a    CollSeq *p4;..
2120: 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69    p4 = sqlite3Bi
2130: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
2140: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
2150: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20  , pRight);.  p5 
2160: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
2170: 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  5(pLeft, pRight,
2180: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
2190: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
21a0: 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d  beAddOp4(pParse-
21b0: 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20  >pVdbe, opcode, 
21c0: 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a  in2, dest, in1,.
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
21f0: 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  *)p4, P4_COLLSEQ
2200: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2210: 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d  ChangeP5(pParse-
2220: 3e 70 56 64 62 65 2c 20 70 35 29 3b 0a 20 20 69  >pVdbe, p5);.  i
2230: 66 28 20 28 70 35 20 26 20 53 51 4c 49 54 45 5f  f( (p5 & SQLITE_
2240: 41 46 46 5f 4d 41 53 4b 29 21 3d 53 51 4c 49 54  AFF_MASK)!=SQLIT
2250: 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
2260: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2270: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
2280: 28 70 50 61 72 73 65 2c 20 69 6e 31 2c 20 31 29  (pParse, in1, 1)
2290: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
22a0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
22b0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 32  ange(pParse, in2
22c0: 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
22d0: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66 20  rn addr;.}..#if 
22e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
22f0: 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  DEPTH>0./*.** Ch
2300: 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e  eck that argumen
2310: 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73  t nHeight is les
2320: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
2330: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  to the maximum.*
2340: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
2350: 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69  th allowed. If i
2360: 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20  t is not, leave 
2370: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2380: 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a   in.** pParse..*
2390: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
23a0: 72 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72  rCheckHeight(Par
23b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
23c0: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20  nHeight){.  int 
23d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23e0: 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d    int mxHeight =
23f0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
2400: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
2410: 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20  _EXPR_DEPTH];.  
2420: 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65  if( nHeight>mxHe
2430: 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ight ){.    sqli
2440: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2450: 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70  se, .       "Exp
2460: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
2470: 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d  too large (maxim
2480: 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d  um depth %d)", m
2490: 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20  xHeight.    );. 
24a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
24b0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
24c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  rn rc;.}../* The
24d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65   following three
24e0: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67   functions, heig
24f0: 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67  htOfExpr(), heig
2500: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a  htOfExprList().*
2510: 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65  * and heightOfSe
2520: 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64  lect(), are used
2530: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2540: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2550: 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65  .** of any expre
2560: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
2570: 65 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72  enced by the str
2580: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
2590: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72   the.** first ar
25a0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
25b0: 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65   this maximum he
25c0: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
25d0: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
25e0: 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a   value pointed.*
25f0: 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74  * to by pnHeight
2600: 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  , the second par
2610: 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74  ameter, then set
2620: 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68   *pnHeight to th
2630: 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a  at.** value..*/.
2640: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
2650: 68 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70  htOfExpr(Expr *p
2660: 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29  , int *pnHeight)
2670: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
2680: 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e   if( p->nHeight>
2690: 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20  *pnHeight ){.   
26a0: 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70     *pnHeight = p
26b0: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d  ->nHeight;.    }
26c0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
26d0: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  id heightOfExprL
26e0: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
26f0: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
2700: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2710: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
2720: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
2730: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67  i++){.      heig
2740: 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d  htOfExpr(p->a[i]
2750: 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74  .pExpr, pnHeight
2760: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
2770: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
2780: 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74  tOfSelect(Select
2790: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
27a0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
27b0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
27c0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65  (p->pWhere, pnHe
27d0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
27e0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69  tOfExpr(p->pHavi
27f0: 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  ng, pnHeight);. 
2800: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
2810: 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69  p->pLimit, pnHei
2820: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2830: 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65  OfExpr(p->pOffse
2840: 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, pnHeight);.  
2850: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
2860: 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e  st(p->pEList, pn
2870: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2880: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
2890: 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69  >pGroupBy, pnHei
28a0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
28b0: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  OfExprList(p->pO
28c0: 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74  rderBy, pnHeight
28d0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  );.    heightOfS
28e0: 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c  elect(p->pPrior,
28f0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a   pnHeight);.  }.
2900: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2910: 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61   Expr.nHeight va
2920: 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74  riable in the st
2930: 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
2940: 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  s an .** argumen
2950: 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  t. An expression
2960: 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65   with no childre
2970: 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72  n, Expr.pList or
2980: 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63   .** Expr.pSelec
2990: 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68  t member has a h
29a0: 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20  eight of 1. Any 
29b0: 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
29c0: 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74  .** has a height
29d0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61   equal to the ma
29e0: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20  ximum height of 
29f0: 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65  any other .** re
2a00: 66 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c  ferenced Expr pl
2a10: 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  us one..*/.stati
2a20: 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48 65  c void exprSetHe
2a30: 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20  ight(Expr *p){. 
2a40: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
2a50: 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72  ;.  heightOfExpr
2a60: 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69  (p->pLeft, &nHei
2a70: 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66  ght);.  heightOf
2a80: 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20  Expr(p->pRight, 
2a90: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69  &nHeight);.  hei
2aa0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
2ab0: 3e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74  >pList, &nHeight
2ac0: 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  );.  heightOfSel
2ad0: 65 63 74 28 70 2d 3e 70 53 65 6c 65 63 74 2c 20  ect(p->pSelect, 
2ae0: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 70 2d 3e  &nHeight);.  p->
2af0: 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
2b00: 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t + 1;.}../*.** 
2b10: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2b20: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73  ight variable us
2b30: 69 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48  ing the exprSetH
2b40: 65 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e  eight() function
2b50: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67  . If.** the heig
2b60: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2b70: 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  an the maximum a
2b80: 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f  llowed expressio
2b90: 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76  n depth,.** leav
2ba0: 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
2bb0: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
2bc0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
2bd0: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
2be0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78  , Expr *p){.  ex
2bf0: 70 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a  prSetHeight(p);.
2c00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
2c10: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
2c20: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a   p->nHeight);.}.
2c30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2c40: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2c50: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
2c60: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
2c70: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
2c80: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
2c90: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
2ca0: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
2cb0: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2cc0: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
2cd0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
2ce0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
2cf0: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
2d00: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
2d10: 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ht;.}.#else.  #d
2d20: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
2d30: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
2d40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
2d50: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
2d60: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
2d70: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
2d80: 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  de and return a 
2d90: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20  pointer to it.  
2da0: 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68  Memory.** for th
2db0: 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74 61 69  is node is obtai
2dc0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
2dd0: 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  _malloc().  The 
2de0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2df0: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
2e00: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
2e10: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
2e20: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
2e30: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
2e40: 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74  te3Expr(.  sqlit
2e50: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
2e60: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
2e70: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2e80: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
2e90: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
2ea0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2eb0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
2ec0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  opcode */.  Expr
2ed0: 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20   *pLeft,        
2ee0: 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72      /* Left oper
2ef0: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
2f00: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
2f10: 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e   /* Right operan
2f20: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  d */.  const Tok
2f30: 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f  en *pToken     /
2f40: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e  * Argument token
2f50: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
2f60: 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  New;.  pNew = sq
2f70: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
2f80: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  o(db, sizeof(Exp
2f90: 72 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  r));.  if( pNew=
2fa0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65  =0 ){.    /* Whe
2fb0: 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20  n malloc fails, 
2fc0: 64 65 6c 65 74 65 20 70 4c 65 66 74 20 61 6e 64  delete pLeft and
2fd0: 20 70 52 69 67 68 74 2e 20 45 78 70 72 65 73 73   pRight. Express
2fe0: 69 6f 6e 73 20 70 61 73 73 65 64 20 74 6f 20 0a  ions passed to .
2ff0: 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63      ** this func
3000: 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61 79 73  tion must always
3010: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 77 69   be allocated wi
3020: 74 68 20 73 71 6c 69 74 65 33 45 78 70 72 28 29  th sqlite3Expr()
3030: 20 66 6f 72 20 74 68 69 73 20 0a 20 20 20 20 2a   for this .    *
3040: 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20 20 20 2a  * reason. .    *
3050: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
3060: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
3070: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
3080: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
3090: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
30a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  n 0;.  }.  pNew-
30b0: 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 4e 65 77  >op = op;.  pNew
30c0: 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b  ->pLeft = pLeft;
30d0: 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20  .  pNew->pRight 
30e0: 3d 20 70 52 69 67 68 74 3b 0a 20 20 70 4e 65 77  = pRight;.  pNew
30f0: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 70  ->iAgg = -1;.  p
3100: 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 28 75  New->span.z = (u
3110: 38 2a 29 22 22 3b 0a 20 20 69 66 28 20 70 54 6f  8*)"";.  if( pTo
3120: 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ken ){.    asser
3130: 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d  t( pToken->dyn==
3140: 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  0 );.    pNew->s
3150: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
3160: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
3170: 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20 29  else if( pLeft )
3180: 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  {.    if( pRight
3190: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
31a0: 69 67 68 74 2d 3e 73 70 61 6e 2e 64 79 6e 3d 3d  ight->span.dyn==
31b0: 30 20 26 26 20 70 4c 65 66 74 2d 3e 73 70 61 6e  0 && pLeft->span
31c0: 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .dyn==0 ){.     
31d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70     sqlite3ExprSp
31e0: 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d  an(pNew, &pLeft-
31f0: 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e  >span, &pRight->
3200: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  span);.      }. 
3210: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
3220: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
3230: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
3240: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
3250: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
3260: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43          pNew->pC
3270: 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43  oll = pRight->pC
3280: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
3290: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
32a0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
32b0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
32c0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
32d0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
32e0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
32f0: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
3300: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78  .    }.  }..  ex
3310: 70 72 53 65 74 48 65 69 67 68 74 28 70 4e 65 77  prSetHeight(pNew
3320: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
3330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73  ;.}../*.** Works
3340: 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
3350: 72 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  r() except that 
3360: 69 74 20 74 61 6b 65 73 20 61 6e 20 65 78 74 72  it takes an extr
3370: 61 20 50 61 72 73 65 2a 0a 2a 2a 20 61 72 67 75  a Parse*.** argu
3380: 6d 65 6e 74 20 61 6e 64 20 6e 6f 74 69 66 69 65  ment and notifie
3390: 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
33a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65   connection obje
33b0: 63 74 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  ct if malloc fai
33c0: 6c 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ls..*/.Expr *sql
33d0: 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72  ite3PExpr(.  Par
33e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
33f0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
3400: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
3410: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
3420: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
3430: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
3440: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
3450: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
3460: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
3470: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20   *pRight,       
3480: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
3490: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
34a0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20  Token *pToken   
34b0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
34c0: 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ken */.){.  Expr
34d0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
34e0: 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70  r(pParse->db, op
34f0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
3500: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
3510: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
3520: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
3530: 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67  pParse, p->nHeig
3540: 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ht);.  }.  retur
3550: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  n p;.}../*.** Wh
3560: 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73 74 65  en doing a neste
3570: 64 20 70 61 72 73 65 2c 20 79 6f 75 20 63 61 6e  d parse, you can
3580: 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73 20 69   include terms i
3590: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
35a0: 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b  ** that look lik
35b0: 65 20 74 68 69 73 3a 20 20 20 23 31 20 23 32 20  e this:   #1 #2 
35c0: 2e 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  ...  These terms
35d0: 20 72 65 66 65 72 20 74 6f 20 72 65 67 69 73 74   refer to regist
35e0: 65 72 73 0a 2a 2a 20 69 6e 20 74 68 65 20 76 69  ers.** in the vi
35f0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
3600: 23 4e 20 69 73 20 74 68 65 20 4e 2d 74 68 20 72  #N is the N-th r
3610: 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
3620: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3630: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
3640: 73 65 72 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ser to deal with
3650: 20 6f 6e 20 6f 66 20 74 68 6f 73 65 20 74 65 72   on of those ter
3660: 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69  ms..** It immedi
3670: 61 74 65 6c 79 20 67 65 6e 65 72 61 74 65 73 20  ately generates 
3680: 63 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  code to store th
3690: 65 20 76 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d  e value in a mem
36a0: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ory location..**
36b0: 20 54 68 65 20 72 65 74 75 72 6e 73 20 61 6e 20   The returns an 
36c0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
36d0: 77 69 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78 74  will code to ext
36e0: 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 66  ract the value f
36f0: 72 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f  rom.** that memo
3700: 72 79 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e  ry location as n
3710: 65 65 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  eeded..*/.Expr *
3720: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45  sqlite3RegisterE
3730: 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
3740: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  e, Token *pToken
3750: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
3760: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
3770: 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 70  Expr *p;.  if( p
3780: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
3790: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
37a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
37b0: 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73 79  "near \"%T\": sy
37c0: 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 70 54 6f  ntax error", pTo
37d0: 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ken);.    return
37e0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
37f0: 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30  arse, TK_NULL, 0
3800: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
3810: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
3820: 20 30 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   0;.  p = sqlite
3830: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
3840: 4b 5f 52 45 47 49 53 54 45 52 2c 20 30 2c 20 30  K_REGISTER, 0, 0
3850: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
3860: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74   p==0 ){.    ret
3870: 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  urn 0;  /* Mallo
3880: 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  c failed */.  }.
3890: 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 61 74    p->iTable = at
38a0: 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f 6b 65  oi((char*)&pToke
38b0: 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 72 65 74 75  n->z[1]);.  retu
38c0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  rn p;.}../*.** J
38d0: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
38e0: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
38f0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
3900: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
3910: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
3920: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
3930: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
3940: 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  on..*/.Expr *sql
3950: 69 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69  ite3ExprAnd(sqli
3960: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
3970: 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67  Left, Expr *pRig
3980: 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74  ht){.  if( pLeft
3990: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
39a0: 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73  n pRight;.  }els
39b0: 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20  e if( pRight==0 
39c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c  ){.    return pL
39d0: 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  eft;.  }else{.  
39e0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
39f0: 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4e 44 2c  Expr(db, TK_AND,
3a00: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
3a10: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
3a20: 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73 70   Set the Expr.sp
3a30: 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  an field of the 
3a40: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
3a50: 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20   to span all.** 
3a60: 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65  text between the
3a70: 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e   two given token
3a80: 73 2e 20 20 42 6f 74 68 20 74 6f 6b 65 6e 73 20  s.  Both tokens 
3a90: 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  must be pointing
3aa0: 0a 2a 2a 20 61 74 20 74 68 65 20 73 61 6d 65 20  .** at the same 
3ab0: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  string..*/.void 
3ac0: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
3ad0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
3ae0: 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e  en *pLeft, Token
3af0: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 61 73 73   *pRight){.  ass
3b00: 65 72 74 28 20 70 52 69 67 68 74 21 3d 30 20 29  ert( pRight!=0 )
3b10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
3b20: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45  t!=0 );.  if( pE
3b30: 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72  xpr ){.    pExpr
3b40: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74  ->span.z = pLeft
3b50: 2d 3e 7a 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ->z;.    pExpr->
3b60: 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d  span.n = pRight-
3b70: 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e 7a 20  >n + (pRight->z 
3b80: 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 7d  - pLeft->z);.  }
3b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
3ba0: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
3bb0: 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20  sion node for a 
3bc0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75  function with mu
3bd0: 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65  ltiple.** argume
3be0: 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  nts..*/.Expr *sq
3bf0: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
3c00: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
3c10: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
3c20: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
3c30: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
3c40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3c50: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
3c60: 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a  sert( pToken );.
3c70: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
3c80: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
3c90: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
3ca0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3cb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
3cc0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
3cd0: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
3ce0: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
3cf0: 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  when malloc fail
3d00: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
3d10: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f  0;.  }.  pNew->o
3d20: 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b  p = TK_FUNCTION;
3d30: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d  .  pNew->pList =
3d40: 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74   pList;.  assert
3d50: 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30  ( pToken->dyn==0
3d60: 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 74 6f 6b 65   );.  pNew->toke
3d70: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 70  n = *pToken;.  p
3d80: 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77  New->span = pNew
3d90: 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69  ->token;..  sqli
3da0: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
3db0: 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b 0a  (pParse, pNew);.
3dc0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3dd0: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61  ../*.** Assign a
3de0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
3df0: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
3e00: 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20 61  n that encodes a
3e10: 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20   wildcard.** in 
3e20: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
3e30: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a   statement.  .**
3e40: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63 6f  .** Wildcards co
3e50: 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
3e60: 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73 73  ngle "?" are ass
3e70: 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20 73  igned the next s
3e80: 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72  equential.** var
3e90: 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a  iable number..**
3ea0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
3eb0: 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22   the form "?nnn"
3ec0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
3ed0: 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20  e number "nnn". 
3ee0: 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65   We make.** sure
3ef0: 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f   "nnn" is not to
3f00: 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20 61 20  o be to avoid a 
3f10: 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63  denial of servic
3f20: 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a  e attack when.**
3f30: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
3f40: 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e  nt comes from an
3f50: 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65   external source
3f60: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
3f70: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a  s of the form ":
3f80: 61 61 61 22 20 6f 72 20 22 24 61 61 61 22 20 61  aaa" or "$aaa" a
3f90: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
3fa0: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
3fb0: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
3fc0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
3fd0: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
3fe0: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
3ff0: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
4000: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
4010: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
4020: 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20  uenial variable 
4030: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
4040: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
4050: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
4060: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
4070: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
4080: 45 78 70 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a  Expr){.  Token *
4090: 70 54 6f 6b 65 6e 3b 0a 20 20 73 71 6c 69 74 65  pToken;.  sqlite
40a0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
40b0: 64 62 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  db;..  if( pExpr
40c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
40d0: 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d  pToken = &pExpr-
40e0: 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  >token;.  assert
40f0: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29  ( pToken->n>=1 )
4100: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
4110: 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73  en->z!=0 );.  as
4120: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  sert( pToken->z[
4130: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  0]!=0 );.  if( p
4140: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20  Token->n==1 ){. 
4150: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
4160: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
4170: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
4180: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4190: 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   */.    pExpr->i
41a0: 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65  Table = ++pParse
41b0: 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20  ->nVar;.  }else 
41c0: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d  if( pToken->z[0]
41d0: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20  =='?' ){.    /* 
41e0: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
41f0: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
4200: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
4210: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
4220: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
4230: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
4240: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  er */.    int i;
4250: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
4260: 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 28 63  le = i = atoi((c
4270: 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b  har*)&pToken->z[
4280: 31 5d 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  1]);.    testcas
4290: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 74  e( i==0 );.    t
42a0: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
42b0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
42c0: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
42d0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
42e0: 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a  LE_NUMBER]-1 );.
42f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
4300: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
4310: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
4320: 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20  E_NUMBER] );.   
4330: 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 64 62   if( i<1 || i>db
4340: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
4350: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
4360: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
4370: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4380: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
4390: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
43a0: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
43b0: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
43c0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
43d0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
43e0: 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 7d  _NUMBER]);.    }
43f0: 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73  .    if( i>pPars
4400: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
4410: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
4420: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  i;.    }.  }else
4430: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
4440: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
4450: 3a 61 61 61 22 20 6f 72 20 22 24 61 61 61 22 2e  :aaa" or "$aaa".
4460: 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65    Reuse the same
4470: 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
4480: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70   number as the p
4490: 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20  rior appearance 
44a0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
44b0: 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65  , or if the name
44c0: 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65  .    ** has neve
44d0: 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72  r appeared befor
44e0: 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  e, reuse the sam
44f0: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
4500: 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  r.    */.    int
4510: 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 70   i, n;.    n = p
4520: 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f  Token->n;.    fo
4530: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
4540: 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b 2b 29 7b  >nVarExpr; i++){
4550: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
4560: 0a 20 20 20 20 20 20 69 66 28 20 28 70 45 20 3d  .      if( (pE =
4570: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
4580: 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20 20 20 20  pr[i])!=0.      
4590: 20 20 20 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e      && pE->token
45a0: 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20 20 20 20  .n==n.          
45b0: 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d 3e 74 6f  && memcmp(pE->to
45c0: 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  ken.z, pToken->z
45d0: 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
45e0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
45f0: 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pE->iTable;. 
4600: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4610: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4620: 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e  if( i>=pParse->n
4630: 56 61 72 45 78 70 72 20 29 7b 0a 20 20 20 20 20  VarExpr ){.     
4640: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
4650: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b   ++pParse->nVar;
4660: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
4670: 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70 50 61  e->nVarExpr>=pPa
4680: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
4690: 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  oc-1 ){.        
46a0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
46b0: 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73 65 2d  Alloc += pParse-
46c0: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b  >nVarExprAlloc +
46d0: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61   10;.        pPa
46e0: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 20 3d  rse->apVarExpr =
46f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
4700: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
4710: 72 65 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ree(.           
4720: 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20     db,.         
4730: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
4740: 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  arExpr,.        
4750: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
4760: 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65  arExprAlloc*size
4770: 6f 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72  of(pParse->apVar
4780: 45 78 70 72 5b 30 5d 29 0a 20 20 20 20 20 20 20  Expr[0]).       
4790: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
47a0: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
47b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
47c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
47d0: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
47e0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
47f0: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
4800: 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  [pParse->nVarExp
4810: 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20  r++] = pExpr;.  
4820: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
4830: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
4840: 6e 45 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e  nErr && pParse->
4850: 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  nVar>db->aLimit[
4860: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
4870: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
4880: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4890: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
48a0: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
48b0: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
48c0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6e 20 65 78  *.** Clear an ex
48d0: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
48e0: 72 65 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  re without delet
48f0: 69 6e 67 20 74 68 65 20 73 74 72 75 63 74 75 72  ing the structur
4900: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 53 75 62  e itself..** Sub
4910: 73 74 72 75 63 74 75 72 65 20 69 73 20 64 65 6c  structure is del
4920: 65 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eted..*/.void sq
4930: 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 28 73  lite3ExprClear(s
4940: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
4950: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
4960: 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  pan.dyn ) sqlite
4970: 33 44 62 46 72 65 65 28 64 62 2c 20 28 63 68 61  3DbFree(db, (cha
4980: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20  r*)p->span.z);. 
4990: 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79   if( p->token.dy
49a0: 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  n ) sqlite3DbFre
49b0: 65 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e  e(db, (char*)p->
49c0: 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69  token.z);.  sqli
49d0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
49e0: 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73  , p->pLeft);.  s
49f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4a00: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
4a10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
4a20: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
4a30: 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
4a40: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
4a50: 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 7d  , p->pSelect);.}
4a60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
4a70: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
4a80: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
4a90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4aa0: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
4ab0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
4ac0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4ad0: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  urn;.  sqlite3Ex
4ae0: 70 72 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  prClear(db, p);.
4af0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4b00: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
4b10: 20 54 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20   The Expr.token 
4b20: 66 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20 61  field might be a
4b30: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
4b40: 74 68 61 74 20 69 73 20 71 75 6f 74 65 64 2e 0a  that is quoted..
4b50: 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d 6f 76 65  ** If so, remove
4b60: 20 74 68 65 20 71 75 6f 74 61 74 69 6f 6e 20 6d   the quotation m
4b70: 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arks..*/.void sq
4b80: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
4b90: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
4ba0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78  pr *p){.  if( Ex
4bb0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
4bc0: 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29  (p, EP_Dequoted)
4bd0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
4be0: 20 20 7d 0a 20 20 45 78 70 72 53 65 74 50 72 6f    }.  ExprSetPro
4bf0: 70 65 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75  perty(p, EP_Dequ
4c00: 6f 74 65 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  oted);.  if( p->
4c10: 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20 29 7b 0a  token.dyn==0 ){.
4c20: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
4c30: 43 6f 70 79 28 64 62 2c 20 26 70 2d 3e 74 6f 6b  Copy(db, &p->tok
4c40: 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a  en, &p->token);.
4c50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71    }.  sqlite3Deq
4c60: 75 6f 74 65 28 28 63 68 61 72 2a 29 70 2d 3e 74  uote((char*)p->t
4c70: 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  oken.z);.}../*.*
4c80: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4c90: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
4ca0: 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69  s make deep copi
4cb0: 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  es of expression
4cc0: 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s,.** expression
4cd0: 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73   lists, ID lists
4ce0: 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61  , and select sta
4cf0: 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f  tements.  The co
4d00: 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64  pies can.** be d
4d10: 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67  eleted (by being
4d20: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72   passed to their
4d30: 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44   respective ...D
4d40: 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73  elete() routines
4d50: 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66  ).** without eff
4d60: 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  ecting the origi
4d70: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nals..**.** The 
4d80: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
4d90: 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20   ID, and source 
4da0: 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20  lists return by 
4db0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4dc0: 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  up(),.** sqlite3
4dd0: 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64  IdListDup(), and
4de0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
4df0: 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20  up() can not be 
4e00: 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64  further expanded
4e10: 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65   .** by subseque
4e20: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
4e30: 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20  te*ListAppend() 
4e40: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20  routines..**.** 
4e50: 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20  Any tables that 
4e60: 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68  the SrcList migh
4e70: 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e  t point to are n
4e80: 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  ot duplicated..*
4e90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
4ea0: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
4eb0: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
4ec0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66  Expr *pNew;.  if
4ed0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
4ee0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
4ef0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
4f00: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  b, sizeof(*p) );
4f10: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4f20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d   return 0;.  mem
4f30: 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a  cpy(pNew, p, siz
4f40: 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69  eof(*pNew));.  i
4f50: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30  f( p->token.z!=0
4f60: 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   ){.    pNew->to
4f70: 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c  ken.z = (u8*)sql
4f80: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
4f90: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  , (char*)p->toke
4fa0: 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29  n.z, p->token.n)
4fb0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  ;.    pNew->toke
4fc0: 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  n.dyn = 1;.  }el
4fd0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
4fe0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  pNew->token.z==0
4ff0: 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   );.  }.  pNew->
5000: 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e  span.z = 0;.  pN
5010: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
5020: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
5030: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77  ->pLeft);.  pNew
5040: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
5050: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
5060: 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77  >pRight);.  pNew
5070: 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
5080: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
5090: 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e   p->pList);.  pN
50a0: 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  ew->pSelect = sq
50b0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
50c0: 62 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  b, p->pSelect);.
50d0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
50e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b  .void sqlite3Tok
50f0: 65 6e 43 6f 70 79 28 73 71 6c 69 74 65 33 20 2a  enCopy(sqlite3 *
5100: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  db, Token *pTo, 
5110: 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20  Token *pFrom){. 
5120: 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20   if( pTo->dyn ) 
5130: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5140: 2c 20 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29  , (char*)pTo->z)
5150: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a  ;.  if( pFrom->z
5160: 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d   ){.    pTo->n =
5170: 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70   pFrom->n;.    p
5180: 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29 73 71 6c  To->z = (u8*)sql
5190: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
51a0: 2c 20 28 63 68 61 72 2a 29 70 46 72 6f 6d 2d 3e  , (char*)pFrom->
51b0: 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20  z, pFrom->n);.  
51c0: 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a    pTo->dyn = 1;.
51d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f    }else{.    pTo
51e0: 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45  ->z = 0;.  }.}.E
51f0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
5200: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
5210: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
5220: 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73  t *p){.  ExprLis
5230: 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63  t *pNew;.  struc
5240: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
5250: 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65  *pItem, *pOldIte
5260: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
5270: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
5280: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
5290: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
52a0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
52b0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
52c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
52d0: 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72 20 3d  pNew->iECursor =
52e0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70   0;.  pNew->nExp
52f0: 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  r = pNew->nAlloc
5300: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70   = p->nExpr;.  p
5310: 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d  New->a = pItem =
5320: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
5330: 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45 78 70  Raw(db,  p->nExp
5340: 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  r*sizeof(p->a[0]
5350: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
5360: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
5370: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
5380: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
5390: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
53a0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
53b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
53c0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
53d0: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
53e0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20  Expr *pNewExpr, 
53f0: 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70  *pOldExpr;.    p
5400: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e  Item->pExpr = pN
5410: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
5420: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
5430: 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Expr = pOldItem-
5440: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
5450: 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e   pOldExpr->span.
5460: 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78 70 72  z!=0 && pNewExpr
5470: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77   ){.      /* Alw
5480: 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  ays make a copy 
5490: 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f 72 20  of the span for 
54a0: 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72 65 73  top-level expres
54b0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  sions in the.   
54c0: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
54d0: 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67 69   list.  The logi
54e0: 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f 63  c in SELECT proc
54f0: 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74 65  essing that dete
5500: 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  rmines.      ** 
5510: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
5520: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
5530: 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68 69  lt set needs thi
5540: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  s information */
5550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
5560: 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 4e 65  kenCopy(db, &pNe
5570: 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f  wExpr->span, &pO
5580: 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  ldExpr->span);. 
5590: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
55a0: 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20   pNewExpr==0 || 
55b0: 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  pNewExpr->span.z
55c0: 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=0 .           
55d0: 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70   || pOldExpr->sp
55e0: 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20  an.z==0.        
55f0: 20 20 20 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f      || db->mallo
5600: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
5610: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
5620: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
5630: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
5640: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73  e);.    pItem->s
5650: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49  ortOrder = pOldI
5660: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
5670: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
5680: 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  = 0;.    pItem->
5690: 69 43 6f 6c 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  iCol = pOldItem-
56a0: 3e 69 43 6f 6c 3b 0a 20 20 20 20 70 49 74 65 6d  >iCol;.    pItem
56b0: 2d 3e 69 41 6c 69 61 73 20 3d 20 70 4f 6c 64 49  ->iAlias = pOldI
56c0: 74 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a 20 20 7d  tem->iAlias;.  }
56d0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
56e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73  }../*.** If curs
56f0: 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76  ors, triggers, v
5700: 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
5710: 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74  ies are all omit
5720: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
5730: 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  build, then none
5740: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
5750: 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65  g routines, exce
5760: 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  pt for .** sqlit
5770: 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63  e3SelectDup(), c
5780: 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71  an be called. sq
5790: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
57a0: 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a   is sometimes.**
57b0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e   called with a N
57c0: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
57d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
57e0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
57f0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
5800: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
5810: 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28   \. || !defined(
5820: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5830: 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73  UERY).SrcList *s
5840: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
5850: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
5860: 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63  cList *p){.  Src
5870: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
5880: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  t i;.  int nByte
5890: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
58a0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
58b0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
58c0: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
58d0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
58e0: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
58f0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
5900: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
5910: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
5920: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
5930: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
5940: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
5950: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
5960: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
5970: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
5980: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
5990: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
59a0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
59b0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
59c0: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
59d0: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
59e0: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
59f0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
5a00: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
5a10: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
5a20: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
5a30: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
5a40: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
5a50: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
5a60: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
5a70: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
5a80: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
5a90: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  , pOldItem->zAli
5aa0: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
5ab0: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
5ac0: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
5ad0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
5ae0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
5af0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
5b00: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70   pNewItem->isPop
5b10: 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65  ulated = pOldIte
5b20: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a  m->isPopulated;.
5b30: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49      pNewItem->zI
5b40: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
5b50: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
5b60: 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20  tem->zIndex);.  
5b70: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49    pNewItem->notI
5b80: 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65  ndexed = pOldIte
5b90: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20  m->notIndexed;. 
5ba0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e     pNewItem->pIn
5bb0: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
5bc0: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
5bd0: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
5be0: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
5bf0: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
5c00: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
5c10: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
5c20: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
5c30: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
5c40: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
5c50: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
5c60: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
5c70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
5c80: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
5c90: 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  pOn);.    pNewIt
5ca0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
5cb0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
5cc0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
5cd0: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
5ce0: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
5cf0: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
5d00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
5d10: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
5d20: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
5d30: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
5d40: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
5d50: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
5d60: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
5d70: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
5d80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
5d90: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
5da0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
5db0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
5dc0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
5dd0: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
5de0: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
5df0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5e00: 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64  ocRaw(db, p->nId
5e10: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
5e20: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
5e30: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
5e40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e  te3DbFree(db, pN
5e50: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
5e60: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
5e70: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
5e80: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
5e90: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
5ea0: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
5eb0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
5ec0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
5ed0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
5ee0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
5ef0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
5f00: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
5f10: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
5f20: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
5f30: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
5f40: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
5f50: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
5f60: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
5f70: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
5f80: 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  *p){.  Select *p
5f90: 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  New;.  if( p==0 
5fa0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
5fb0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
5fc0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
5fd0: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
5fe0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
5ff0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69   0;.  pNew->pELi
6000: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
6010: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
6020: 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  EList);.  pNew->
6030: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
6040: 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  cListDup(db, p->
6050: 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  pSrc);.  pNew->p
6060: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
6070: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  xprDup(db, p->pW
6080: 68 65 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  here);.  pNew->p
6090: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
60a0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
60b0: 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20   p->pGroupBy);. 
60c0: 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
60d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
60e0: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  db, p->pHaving);
60f0: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
6100: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
6110: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
6120: 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d  rderBy);.  pNew-
6130: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  >op = p->op;.  p
6140: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71  New->pPrior = sq
6150: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
6160: 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
6170: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
6180: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6190: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
61a0: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
61b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
61c0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
61d0: 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20  .  pNew->iLimit 
61e0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66  = 0;.  pNew->iOf
61f0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  fset = 0;.  pNew
6200: 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  ->selFlags = p->
6210: 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55  selFlags & ~SF_U
6220: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
6230: 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74  pNew->pRightmost
6240: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61 64   = 0;.  pNew->ad
6250: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
6260: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
6270: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
6280: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
6290: 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a  enEphm[2] = -1;.
62a0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
62b0: 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73  .#else.Select *s
62c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
62d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
62e0: 65 63 74 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ect *p){.  asser
62f0: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
6300: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
6310: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
6320: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
6330: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
6340: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
6350: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
6360: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
6370: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
6380: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
6390: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
63a0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
63b0: 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
63c0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
63d0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
63e0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
63f0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
6400: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
6410: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
6420: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
6430: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
6440: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6450: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
6460: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6470: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me            /*
6480: 20 41 53 20 6b 65 79 77 6f 72 64 20 66 6f 72 20   AS keyword for 
6490: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  the expression *
64a0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
64b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
64c0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
64d0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
64e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
64f0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  ro(db, sizeof(Ex
6500: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
6510: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
6520: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
6530: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
6540: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rt( pList->nAllo
6550: 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66  c==0 );.  }.  if
6560: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c  ( pList->nAlloc<
6570: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  =pList->nExpr ){
6580: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
6590: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
65a0: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d    int n = pList-
65b0: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20  >nAlloc*2 + 4;. 
65c0: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62     a = sqlite3Db
65d0: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
65e0: 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70  t->a, n*sizeof(p
65f0: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
6600: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
6610: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
6620: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
6630: 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69  ->a = a;.    pLi
6640: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a  st->nAlloc = n;.
6650: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
6660: 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69  ist->a!=0 );.  i
6670: 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d  f( pExpr || pNam
6680: 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
6690: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
66a0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
66b0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
66c0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
66d0: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
66e0: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
66f0: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
6700: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
6710: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  db, pName);.    
6720: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
6730: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
6740: 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 7d  >iAlias = 0;.  }
6750: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
6760: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
6770: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
6780: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
6790: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
67a0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
67b0: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
67c0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
67d0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
67e0: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
67f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
6800: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
6810: 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e  t pEList contain
6820: 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d  s more than iLim
6830: 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20  it elements,.** 
6840: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
6850: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
6860: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6870: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
6880: 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70  ngth(.  Parse *p
6890: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
68a0: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e  t *pEList,.  con
68b0: 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74  st char *zObject
68c0: 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70  .){.  int mx = p
68d0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
68e0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
68f0: 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61  OLUMN];.  testca
6900: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
6910: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20  List->nExpr==mx 
6920: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
6930: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
6940: 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a  >nExpr==mx+1 );.
6950: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
6960: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78  pEList->nExpr>mx
6970: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
6980: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6990: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
69a0: 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63  s in %s", zObjec
69b0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
69c0: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
69d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
69e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
69f0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
6a00: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
6a10: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
6a20: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
6a30: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
6a40: 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
6a50: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
6a60: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
6a70: 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74  ->a!=0 || (pList
6a80: 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c  ->nExpr==0 && pL
6a90: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20  ist->nAlloc==0) 
6aa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  );.  assert( pLi
6ab0: 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74  st->nExpr<=pList
6ac0: 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f  ->nAlloc );.  fo
6ad0: 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
6ae0: 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
6af0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
6b00: 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
6b10: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6b20: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
6b30: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6b40: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  (db, pItem->zNam
6b50: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
6b60: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
6b70: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
6b80: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
6b90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  );.}../*.** Thes
6ba0: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
6bb0: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e  alker callbacks.
6bc0: 20 20 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73    Walker.u.pi is
6bd0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
6be0: 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68   an integer.  Th
6bf0: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
6c00: 20 63 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70   checking an exp
6c10: 72 65 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a  ression to see.*
6c20: 2a 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e  * if it is a con
6c30: 73 74 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c  stant.  Set *Wal
6c40: 6b 65 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66  ker.u.pi to 0 if
6c50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6c60: 69 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61  is.** not consta
6c70: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  nt..**.** These 
6c80: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
6c90: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d  s are used to im
6ca0: 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c  plement the foll
6cb0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
6cc0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
6cd0: 6e 73 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20  nstant().**     
6ce0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
6cf0: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a  stantNotJoin().*
6d00: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
6d10: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
6d20: 63 74 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74  ction().**.*/.st
6d30: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
6d40: 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b  eIsConstant(Walk
6d50: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
6d60: 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a  r *pExpr){..  /*
6d70: 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69   If pWalker->u.i
6d80: 20 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74   is 3 then any t
6d90: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
6da0: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
6db0: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
6dc0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
6dd0: 65 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73  es of a join dis
6de0: 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78  qualifies the ex
6df0: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72  pression.  ** fr
6e00: 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65  om being conside
6e10: 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f  red constant. */
6e20: 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  .  if( pWalker->
6e30: 75 2e 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61  u.i==3 && ExprHa
6e40: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
6e50: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
6e60: 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
6e70: 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65  >u.i = 0;.    re
6e80: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
6e90: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
6ea0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
6eb0: 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63  /* Consider func
6ec0: 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73  tions to be cons
6ed0: 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69  tant if all thei
6ee0: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  r arguments are 
6ef0: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20  constant.    ** 
6f00: 61 6e 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  and pWalker->u.i
6f10: 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ==2 */.    case 
6f20: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
6f30: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
6f40: 75 2e 69 3d 3d 32 20 29 20 72 65 74 75 72 6e 20  u.i==2 ) return 
6f50: 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  0;.      /* Fall
6f60: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
6f70: 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20  case TK_ID:.    
6f80: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a  case TK_COLUMN:.
6f90: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
6fa0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
6fb0: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
6fc0: 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
6fd0: 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  N:.#ifndef SQLIT
6fe0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
6ff0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
7000: 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  CT:.    case TK_
7010: 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 74 65  EXISTS:.      te
7020: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
7030: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
7040: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7050: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
7060: 49 53 54 53 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ISTS );.#endif. 
7070: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
7080: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
7090: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
70a0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
70b0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
70c0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
70d0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a  ->op==TK_DOT );.
70e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
70f0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
7100: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
7110: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
7120: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
7130: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
7140: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
7150: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
7160: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 64 65  RC_Abort;.    de
7170: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
7180: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
7190: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69  ;.  }.}.static i
71a0: 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43  nt selectNodeIsC
71b0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
71c0: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
71d0: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 70 57 61  *pSelect){.  pWa
71e0: 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20  lker->u.i = 0;. 
71f0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
7200: 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  t;.}.static int 
7210: 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72  exprIsConst(Expr
7220: 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61   *p, int initFla
7230: 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  g){.  Walker w;.
7240: 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46 6c    w.u.i = initFl
7250: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
7260: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
7270: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
7280: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
7290: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
72a0: 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65  nstant;.  sqlite
72b0: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
72c0: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e 69  ;.  return w.u.i
72d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
72e0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
72f0: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
7300: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7310: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
7320: 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
7330: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
7340: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e   function calls.
7350: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
7360: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
7370: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
7380: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
7390: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
73a0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
73b0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
73c0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
73d0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
73e0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
73f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7400: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45  ExprIsConstant(E
7410: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
7420: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
7430: 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   1);.}../*.** Wa
7440: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
7450: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
7460: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
7470: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
7480: 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f  * that does no o
7490: 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68  riginate from th
74a0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
74b0: 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e  auses of a join.
74c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
74d0: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
74e0: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
74f0: 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73  n calls or terms
7500: 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f   from.** an ON o
7510: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
7520: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
7530: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
7540: 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oin(Expr *p){.  
7550: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
7560: 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 3);.}../*.
7570: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
7580: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
7590: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
75a0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
75b0: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
75c0: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
75d0: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
75e0: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
75f0: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
7600: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
7610: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
7620: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
7630: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
7640: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
7650: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
7660: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
7670: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
7680: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
7690: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
76a0: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
76b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
76c0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
76d0: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29  unction(Expr *p)
76e0: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
76f0: 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d 0a  sConst(p, 2);.}.
7700: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
7710: 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
7720: 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
7730: 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
7740: 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
7750: 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
7760: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
7770: 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
7780: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
7790: 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
77a0: 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
77b0: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
77c0: 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
77d0: 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
77e0: 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
77f0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
7800: 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
7810: 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
7820: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
7830: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
7840: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
7850: 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  pValue){.  int r
7860: 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  c = 0;.  if( p->
7870: 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
7880: 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c  lue ){.    *pVal
7890: 75 65 20 3d 20 70 2d 3e 69 54 61 62 6c 65 3b 0a  ue = p->iTable;.
78a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
78b0: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  }.  switch( p->o
78c0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
78d0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
78e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 47 65    rc = sqlite3Ge
78f0: 74 49 6e 74 33 32 28 28 63 68 61 72 2a 29 70 2d  tInt32((char*)p-
7900: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75 65  >token.z, pValue
7910: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7920: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
7930: 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
7940: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70   rc = sqlite3Exp
7950: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
7960: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
7970: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7980: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
7990: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
79a0: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
79b0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
79c0: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
79d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   ){.        *pVa
79e0: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
79f0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
7a00: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7a10: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
7a20: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  : break;.  }.  i
7a30: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 2d 3e  f( rc ){.    p->
7a40: 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b  op = TK_INTEGER;
7a50: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
7a60: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
7a70: 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 2a 70    p->iTable = *p
7a80: 56 61 6c 75 65 3b 0a 20 20 7d 0a 20 20 72 65 74  Value;.  }.  ret
7a90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7aa0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
7ab0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
7ac0: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
7ad0: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
7ae0: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
7af0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
7b00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
7b10: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
7b20: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
7b30: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
7b40: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
7b50: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
7b60: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
7b70: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
7b80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
7b90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
7ba0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
7bb0: 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  T.  int sqlite3_
7bc0: 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 3d 20  enable_in_opt = 
7bd0: 31 3b 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69  1;.#else.  #defi
7be0: 6e 65 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  ne sqlite3_enabl
7bf0: 65 5f 69 6e 5f 6f 70 74 20 31 0a 23 65 6e 64 69  e_in_opt 1.#endi
7c00: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
7c10: 74 72 75 65 20 69 66 20 74 68 65 20 49 4e 20 6f  true if the IN o
7c20: 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61  perator optimiza
7c30: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
7c40: 61 6e 64 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43  and.** the SELEC
7c50: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 20 65 78  T statement p ex
7c60: 69 73 74 73 20 61 6e 64 20 69 73 20 6f 66 20 74  ists and is of t
7c70: 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 66 6f 72  he.** simple for
7c80: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  m:.**.**     SEL
7c90: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
7ca0: 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20  M <table>.**.** 
7cb0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
7cc0: 61 73 65 2c 20 69 74 20 6d 61 79 20 62 65 20 70  ase, it may be p
7cd0: 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61  ossible to use a
7ce0: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
7cf0: 0a 2a 2a 20 6f 72 20 69 6e 64 65 78 20 69 6e 73  .** or index ins
7d00: 74 65 61 64 20 6f 66 20 67 65 6e 65 72 61 74 69  tead of generati
7d10: 6e 67 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20  ng an epheremal 
7d20: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
7d30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7d40: 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e  BQUERY.static in
7d50: 74 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  t isCandidateFor
7d60: 49 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29  InOpt(Select *p)
7d70: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
7d80: 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c;.  ExprList *p
7d90: 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a  EList;.  Table *
7da0: 70 54 61 62 3b 0a 20 20 69 66 28 20 21 73 71 6c  pTab;.  if( !sql
7db0: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f  ite3_enable_in_o
7dc0: 70 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  pt ) return 0; /
7dd0: 2a 20 49 4e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * IN optimizatio
7de0: 6e 20 6d 75 73 74 20 62 65 20 65 6e 61 62 6c 65  n must be enable
7df0: 64 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20  d */.  if( p==0 
7e00: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7e20: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
7e30: 20 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54   of IN is SELECT
7e40: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
7e50: 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e70: 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  Not a compound S
7e80: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70  ELECT */.  if( p
7e90: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
7ea0: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
7eb0: 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 20  regate) ){.     
7ec0: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
7ed0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
7ee0: 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
7ef0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
7f00: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72    }.  if( p->pGr
7f10: 6f 75 70 42 79 20 29 20 72 65 74 75 72 6e 20 30  oupBy ) return 0
7f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7f30: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
7f40: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
7f50: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
7f60: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
7f70: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
7f80: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  IT clause */.  i
7f90: 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 20  f( p->pOffset ) 
7fa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
7fb0: 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
7fc0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
7fd0: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45     /* Has no WHE
7fe0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70  RE clause */.  p
7ff0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
8000: 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 72   if( pSrc==0 ) r
8010: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
8020: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
8030: 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
8040: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
8050: 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
8060: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
8070: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
8080: 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  .pSelect ) retur
8090: 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  n 0;     /* FROM
80a0: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
80b0: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
80c0: 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
80d0: 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 70 54 61  .pTab;.  if( pTa
80e0: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  b==0 ) return 0;
80f0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
8100: 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
8110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
8120: 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
8130: 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
8140: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
8150: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
8160: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
8170: 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
8180: 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
8190: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
81a0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
81b0: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
81c0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63  ;       /* One c
81d0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
81e0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28  ult set */.  if(
81f0: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
8200: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
8210: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  MN ) return 0; /
8220: 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f  * Result is a co
8230: 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  lumn */.  return
8240: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
8250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
8260: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
8270: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
8280: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
8290: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
82a0: 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
82b0: 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62  tor..** It's job
82c0: 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
82d0: 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73  reate a b-tree s
82e0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61  tructure that ma
82f0: 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74  y be used.** eit
8300: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
8310: 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68  membership of th
8320: 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74  e (...) set or t
8330: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
8340: 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73  h.** its members
8350: 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
8360: 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cates..**.** The
8370: 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f   cursor opened o
8380: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
8390: 28 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c  (database table,
83a0: 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
83b0: 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20  .** or ephermal 
83c0: 74 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64  table) is stored
83d0: 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62   in pX->iTable b
83e0: 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
83f0: 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20  ion returns..** 
8400: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
8410: 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  ue indicates the
8420: 20 73 74 72 75 63 74 75 72 65 20 74 79 70 65 2c   structure type,
8430: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
8440: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
8450: 57 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72  WID - The cursor
8460: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
8470: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
8480: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
8490: 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f  NDEX - The curso
84a0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
84b0: 61 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  a database index
84c0: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
84d0: 45 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73  EPH -   The curs
84e0: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
84f0: 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
8500: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
8520: 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
8530: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
8540: 41 6e 20 65 78 69 73 74 69 6e 67 20 73 74 72 75  An existing stru
8550: 63 74 75 72 65 20 6d 61 79 20 6f 6e 6c 79 20 62  cture may only b
8560: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 53 45  e used if the SE
8570: 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 73  LECT is of the s
8580: 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a  imple.** form:.*
8590: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
85a0: 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74  <column> FROM <t
85b0: 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  able>.**.** If p
85c0: 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d 65  rNotFound parame
85d0: 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 74  ter is 0, then t
85e0: 68 65 20 73 74 72 75 63 74 75 72 65 20 77 69 6c  he structure wil
85f0: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
8600: 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
8610: 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 2c  the set members,
8620: 20 73 6b 69 70 70 69 6e 67 20 61 6e 79 20 64 75   skipping any du
8630: 70 6c 69 63 61 74 65 73 2e 20 49 6e 20 74 68 69  plicates. In thi
8640: 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68  s case an.** eph
8650: 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
8660: 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  t be used unless
8670: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c 63   the selected <c
8680: 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e  olumn> is guaran
8690: 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e  teed.** to be un
86a0: 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65  ique - either be
86b0: 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49  cause it is an I
86c0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
86d0: 45 59 20 6f 72 20 69 74 0a 2a 2a 20 69 73 20 75  EY or it.** is u
86e0: 6e 69 71 75 65 20 62 79 20 76 69 72 74 75 65 20  nique by virtue 
86f0: 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  of a constraint 
8700: 6f 72 20 69 6d 70 6c 69 63 69 74 20 69 6e 64 65  or implicit inde
8710: 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  x..**.** If the 
8720: 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61 6d  prNotFound param
8730: 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
8740: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
8750: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
8760: 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20  ** for fast set 
8770: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
8780: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
8790: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
87a0: 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73  e must .** be us
87b0: 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d  ed unless <colum
87c0: 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  n> is an INTEGER
87d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
87e0: 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a  an index can .**
87f0: 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c   be found with <
8800: 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c  column> as its l
8810: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e  eft-most column.
8820: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
8830: 73 74 72 75 63 74 75 72 65 20 69 73 20 62 65 69  structure is bei
8840: 6e 67 20 75 73 65 64 20 66 6f 72 20 73 65 74 20  ng used for set 
8850: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
8860: 2c 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 6e 65  , the user.** ne
8870: 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74  eds to know whet
8880: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 73  her or not the s
8890: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
88a0: 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 0a 2a  s an SQL NULL .*
88b0: 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65 72  * value in order
88c0: 20 74 6f 20 63 6f 72 72 65 63 74 6c 79 20 65 76   to correctly ev
88d0: 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
88e0: 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e 20 28 59  ns like "X IN (Y
88f0: 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20 74 68 65  , Z)"..** If the
8900: 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
8910: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
8920: 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  e may contain a 
8930: 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a  NULL value at.**
8940: 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61   runtime, then a
8950: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
8960: 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72  ocated and the r
8970: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
8980: 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72  ritten.** to *pr
8990: 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20 74 68 65  NotFound. If the
89a0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
89b0: 74 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75  that the structu
89c0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  re contains a.**
89d0: 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65   NULL value, the
89e0: 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73  n *prNotFound is
89f0: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
8a00: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
8a10: 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
8a20: 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69  d and its locati
8a30: 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72  on stored in *pr
8a40: 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a  NotFound, then.*
8a50: 2a 20 69 74 73 20 69 6e 69 74 69 61 6c 20 76 61  * its initial va
8a60: 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20 49 66 20  lue is NULL. If 
8a70: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64 6f  the structure do
8a80: 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e 20 63 6f  es not remain co
8a90: 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 74 68  nstant.** for th
8aa0: 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20 74 68  e duration of th
8ab0: 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20 74 68  e query (i.e. th
8ac0: 65 20 73 65 74 20 69 73 20 61 20 63 6f 72 72 65  e set is a corre
8ad0: 6c 61 74 65 64 20 73 75 62 2d 73 65 6c 65 63 74  lated sub-select
8ae0: 29 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ), .** the value
8af0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
8b00: 64 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  d register is re
8b10: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68  set to NULL each
8b20: 20 74 69 6d 65 20 74 68 65 20 0a 2a 2a 20 73 74   time the .** st
8b30: 72 75 63 74 75 72 65 20 69 73 20 72 65 70 6f 70  ructure is repop
8b40: 75 6c 61 74 65 64 2e 20 54 68 69 73 20 61 6c 6c  ulated. This all
8b50: 6f 77 73 20 74 68 65 20 63 61 6c 6c 65 72 20 74  ows the caller t
8b60: 6f 20 75 73 65 20 76 64 62 65 20 63 6f 64 65 20  o use vdbe code 
8b70: 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74  .** equivalent t
8b80: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
8b90: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 72 65 67  .**.**   if( reg
8ba0: 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a  ister==NULL ){.*
8bb0: 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c 6c 20 3d  *     has_null =
8bc0: 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20 73   <test if data s
8bd0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
8be0: 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20 20 20 72  s null>.**     r
8bf0: 65 67 69 73 74 65 72 20 3d 20 31 0a 2a 2a 20 20  egister = 1.**  
8c00: 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f 72 64 65   }.**.** in orde
8c10: 72 20 74 6f 20 61 76 6f 69 64 20 72 75 6e 6e 69  r to avoid runni
8c20: 6e 67 20 74 68 65 20 3c 74 65 73 74 20 69 66 20  ng the <test if 
8c30: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
8c40: 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a  ontains null>.**
8c50: 20 74 65 73 74 20 6d 6f 72 65 20 6f 66 74 65 6e   test more often
8c60: 20 74 68 61 6e 20 69 73 20 6e 65 63 65 73 73 61   than is necessa
8c70: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
8c80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
8c90: 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  ERY.int sqlite3F
8ca0: 69 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65  indInIndex(Parse
8cb0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
8cc0: 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f 74 46 6f  pX, int *prNotFo
8cd0: 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  und){.  Select *
8ce0: 70 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  p;.  int eType =
8cf0: 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   0;.  int iTab =
8d00: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
8d10: 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
8d20: 71 75 65 20 3d 20 21 70 72 4e 6f 74 46 6f 75 6e  que = !prNotFoun
8d30: 64 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  d;..  /* The fol
8d40: 6c 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 65 78  lwing if(...) ex
8d50: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
8d60: 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69   if the SELECT i
8d70: 73 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 73  s of the .  ** s
8d80: 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  imple form:.  **
8d90: 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
8da0: 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c   <column> FROM <
8db0: 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a 20 20 2a 2a  table>.  **.  **
8dc0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
8dd0: 63 61 73 65 2c 20 69 74 20 6d 61 79 20 62 65 20  case, it may be 
8de0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
8df0: 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
8e00: 65 0a 20 20 2a 2a 20 6f 72 20 69 6e 64 65 78 20  e.  ** or index 
8e10: 69 6e 73 74 65 61 64 20 6f 66 20 67 65 6e 65 72  instead of gener
8e20: 61 74 69 6e 67 20 61 6e 20 65 70 68 65 72 65 6d  ating an epherem
8e30: 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  al table..  */. 
8e40: 20 70 20 3d 20 70 58 2d 3e 70 53 65 6c 65 63 74   p = pX->pSelect
8e50: 3b 0a 20 20 69 66 28 20 69 73 43 61 6e 64 69 64  ;.  if( isCandid
8e60: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29  ateForInOpt(p) )
8e70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
8e80: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8e90: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
8ea0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
8eb0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
8ec0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  0].pExpr;.    in
8ed0: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
8ee0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 56 64 62  iColumn;.    Vdb
8ef0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
8f00: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 0a  tVdbe(pParse);..
8f10: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
8f20: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
8f30: 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61  led from two pla
8f40: 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73  ces. In both cas
8f50: 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20 20  es the vdbe.    
8f60: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
8f70: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53  een allocated. S
8f80: 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33  o assume sqlite3
8f90: 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c 77  GetVdbe() is alw
8fa0: 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  ays.    ** succe
8fb0: 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20  ssful here..    
8fc0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  */.    assert(v)
8fd0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
8fe0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d   ){.      int iM
8ff0: 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
9000: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Mem;.      int i
9010: 41 64 64 72 3b 0a 20 20 20 20 20 20 54 61 62 6c  Addr;.      Tabl
9020: 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  e *pTab = p->pSr
9030: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
9040: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
9050: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
9060: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
9070: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
9080: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
9090: 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  e(v, iDb);..    
90a0: 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65    iAddr = sqlite
90b0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
90c0: 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  P_If, iMem);.   
90d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
90e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
90f0: 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 0a 20  er, 1, iMem);.. 
9100: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
9110: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
9120: 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
9130: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
9140: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
9150: 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  DEX_ROWID;..    
9160: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
9170: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
9180: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9190: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
91a0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  on sequence used
91b0: 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73   by the comparis
91c0: 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20  on. If an index 
91d0: 69 73 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  is to .      ** 
91e0: 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
91f0: 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65   of a temp-table
9200: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64  , it must be ord
9210: 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20  ered according. 
9220: 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20       ** to this 
9230: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9240: 63 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ce..      */.   
9250: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71     CollSeq *pReq
9260: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
9270: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
9280: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
9290: 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20  , pExpr);..     
92a0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
92b0: 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  he affinity that
92c0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
92d0: 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20   perform the .  
92e0: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
92f0: 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
9300: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
9310: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a   the column. If.
9320: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
9330: 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
9340: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e  ssible to use an
9350: 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a  y index..      *
9360: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
9370: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
9380: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [0].pTab;.      
9390: 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61  char aff = compa
93a0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 58  risonAffinity(pX
93b0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  );.      int aff
93c0: 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70 54 61 62  inity_ok = (pTab
93d0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66  ->aCol[iCol].aff
93e0: 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61 66 66 3d  inity==aff||aff=
93f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
9400: 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49  );..      for(pI
9410: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
9420: 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d   pIdx && eType==
9430: 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b  0 && affinity_ok
9440: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
9450: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
9460: 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e   (pIdx->aiColumn
9470: 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20  [0]==iCol).     
9480: 20 20 20 20 26 26 20 28 70 52 65 71 3d 3d 73 71      && (pReq==sq
9490: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
94a0: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49  (db, ENC(db), pI
94b0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 2d  dx->azColl[0], -
94c0: 31 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  1, 0)).         
94d0: 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75  && (!mustBeUniqu
94e0: 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c  e || (pIdx->nCol
94f0: 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e  umn==1 && pIdx->
9500: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
9510: 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
9520: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
9530: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
9540: 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
9550: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
9560: 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20  int iAddr;.     
9570: 20 20 20 20 20 63 68 61 72 20 2a 70 4b 65 79 3b       char *pKey;
9580: 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4b  .  .          pK
9590: 65 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ey = (char *)sql
95a0: 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
95b0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
95c0: 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
95d0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
95e0: 6e 64 65 78 28 64 62 2c 20 70 49 64 78 2d 3e 70  ndex(db, pIdx->p
95f0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
9600: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
9610: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
9620: 0a 0a 20 20 20 20 20 20 20 20 20 20 69 41 64 64  ..          iAdd
9630: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
9640: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
9650: 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  iMem);.         
9660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9670: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
9680: 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a 20  , 1, iMem);.  . 
9690: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
96a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
96b0: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
96c0: 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  0, pIdx->nColumn
96d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
96e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
96f0: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
9700: 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
9710: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9730: 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59       pKey,P4_KEY
9740: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
9750: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
9760: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
9770: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
9780: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
9790: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a  IN_INDEX_INDEX;.
97a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
97b0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
97c0: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
97d0: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
97e0: 6e 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f  nd && !pTab->aCo
97f0: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
9800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
9810: 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70  prNotFound = ++p
9820: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
9830: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9840: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
9850: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70  .  }..  if( eTyp
9860: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e==0 ){.    int 
9870: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
9880: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
9890: 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
98a0: 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29  if( prNotFound )
98b0: 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f  {.      *prNotFo
98c0: 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e 75  und = rMayHaveNu
98d0: 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
98e0: 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Mem;.    }else i
98f0: 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43  f( pX->pLeft->iC
9900: 6f 6c 75 6d 6e 3c 30 20 26 26 20 70 58 2d 3e 70  olumn<0 && pX->p
9910: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
9920: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
9930: 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 7d  DEX_ROWID;.    }
9940: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
9950: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
9960: 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75  , pX, rMayHaveNu
9970: 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  ll, eType==IN_IN
9980: 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 7d 65  DEX_ROWID);.  }e
9990: 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61  lse{.    pX->iTa
99a0: 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a  ble = iTab;.  }.
99b0: 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a    return eType;.
99c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
99d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
99e0: 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72  r scalar subquer
99f0: 69 65 73 20 75 73 65 64 20 61 73 20 61 6e 20 65  ies used as an e
9a00: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64  xpression.** and
9a10: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20   IN operators.  
9a20: 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
9a30: 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52      (SELECT a FR
9a40: 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d  OM b)          -
9a50: 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  - subquery.**   
9a60: 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54    EXISTS (SELECT
9a70: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20   a FROM b)   -- 
9a80: 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a  EXISTS subquery.
9a90: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35  **     x IN (4,5
9aa0: 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20  ,11)            
9ab0: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
9ac0: 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69   with list on ri
9ad0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a  ght-hand side.**
9ae0: 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
9af0: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
9b00: 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
9b10: 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20  ith subquery on 
9b20: 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20  the right.**.** 
9b30: 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65  The pExpr parame
9b40: 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68  ter describes th
9b50: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
9b60: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
9b70: 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72  N.** operator or
9b80: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
9b90: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73   If parameter is
9ba0: 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
9bb0: 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69  o, then expressi
9bc0: 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72  on pExpr is guar
9bd0: 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
9be0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f  of the form "<ro
9bf0: 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f  wid> IN (?, ?, ?
9c00: 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64  )", where <rowid
9c10: 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  > is a reference
9c20: 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65  .** to some inte
9c30: 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f  ger key column o
9c40: 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65  f a table B-Tree
9c50: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
9c60: 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79  use an.** intkey
9c70: 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65   B-Tree to store
9c80: 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e   the set of IN(.
9c90: 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65  ..) values inste
9ca0: 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a  ad of the usual.
9cb0: 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69  ** (slower) vari
9cc0: 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73  able length keys
9cd0: 20 42 2d 54 72 65 65 2e 0a 2a 2f 0a 23 69 66 6e   B-Tree..*/.#ifn
9ce0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9cf0: 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71  SUBQUERY.void sq
9d00: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
9d10: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
9d20: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  rse, .  Expr *pE
9d30: 78 70 72 2c 20 0a 20 20 69 6e 74 20 72 4d 61 79  xpr, .  int rMay
9d40: 48 61 76 65 4e 75 6c 6c 2c 0a 20 20 69 6e 74 20  HaveNull,.  int 
9d50: 69 73 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74  isRowid.){.  int
9d60: 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 20 20   testAddr = 0;  
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
9d90: 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f   test address */
9da0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
9db0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
9dc0: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
9dd0: 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20 20 2f 2a  ) return;...  /*
9de0: 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20   This code must 
9df0: 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e  be run in its en
9e00: 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d  tirety every tim
9e10: 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
9e20: 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  red.  ** if any 
9e30: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
9e40: 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20   is true:.  **. 
9e50: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
9e60: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
9e70: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
9e80: 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a  bquery.  **    *
9e90: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
9ea0: 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72   side is an expr
9eb0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
9ec0: 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73  aining variables
9ed0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61  .  **    *  We a
9ee0: 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67  re inside a trig
9ef0: 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ger.  **.  ** If
9f00: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
9f10: 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65  e are false, the
9f20: 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69  n we can run thi
9f30: 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65  s code just once
9f40: 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72  .  ** save the r
9f50: 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73  esults, and reus
9f60: 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  e the same resul
9f70: 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
9f80: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  invocations..  *
9f90: 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  /.  if( !ExprHas
9fa0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
9fb0: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
9fc0: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72 69   && !pParse->tri
9fd0: 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e  gStack ){.    in
9fe0: 74 20 6d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  t mem = ++pParse
9ff0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
a000: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
a010: 20 4f 50 5f 49 66 2c 20 6d 65 6d 29 3b 0a 20 20   OP_If, mem);.  
a020: 20 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c    testAddr = sql
a030: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a040: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
a050: 20 6d 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72   mem);.    asser
a060: 74 28 20 74 65 73 74 41 64 64 72 3e 30 20 7c 7c  t( testAddr>0 ||
a070: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
a080: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d  locFailed );.  }
a090: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
a0a0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
a0b0: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
a0c0: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a   char affinity;.
a0d0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65        KeyInfo ke
a0e0: 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74  yInfo;.      int
a0f0: 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a   addr;        /*
a100: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
a110: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
a120: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
a130: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
a140: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 0a 20  pExpr->pLeft;.. 
a150: 20 20 20 20 20 69 66 28 20 72 4d 61 79 48 61 76       if( rMayHav
a160: 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  eNull ){.       
a170: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a180: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
a190: 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
a1a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
a1b0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
a1c0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
a1d0: 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Left);..      /*
a1e0: 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
a1f0: 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54   an 'x IN(SELECT
a200: 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49  ...)' or an 'x I
a210: 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20  N(<exprlist>)'. 
a220: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
a230: 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64  on it is handled
a240: 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41   the same way. A
a250: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
a260: 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c  s .      ** fill
a270: 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66  ed with single-f
a280: 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20  ield index keys 
a290: 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
a2a0: 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a   results.      *
a2b0: 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43  * from the SELEC
a2c0: 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69  T or the <exprli
a2d0: 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  st>..      **.  
a2e0: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78      ** If the 'x
a2f0: 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ' expression is 
a300: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
a310: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
a320: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
a330: 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f  ent returns a co
a340: 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  lumn value, then
a350: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
a360: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
a370: 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f  olumn is used to
a380: 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78   build the index
a390: 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27   keys. If both '
a3a0: 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20  x' and the.     
a3b0: 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74   ** SELECT... st
a3c0: 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
a3d0: 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
a3e0: 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73  c affinity is us
a3f0: 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65  ed.      ** if e
a400: 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73  ither column has
a410: 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45   NUMERIC or INTE
a420: 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66  GER affinity. If
a430: 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a   neither.      *
a440: 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45  * 'x' nor the SE
a450: 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
a460: 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
a470: 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
a480: 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73  nity.      ** is
a490: 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   used..      */.
a4a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
a4b0: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ble = pParse->nT
a4c0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72  ab++;.      addr
a4d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
a4e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
a4f0: 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d  phemeral, pExpr-
a500: 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69  >iTable, !isRowi
a510: 64 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  d);.      memset
a520: 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69  (&keyInfo, 0, si
a530: 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a  zeof(keyInfo));.
a540: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46        keyInfo.nF
a550: 69 65 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20  ield = 1;..     
a560: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
a570: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
a580: 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
a590: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
a5a0: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
a5b0: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
a5c0: 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
a5d0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
a5e0: 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
a5f0: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
a600: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
a610: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
a620: 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
a630: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c    */.        Sel
a640: 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
a650: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
a660: 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20  pEList;..       
a670: 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69   assert( !isRowi
a680: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d );.        sql
a690: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
a6a0: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65  it(&dest, SRT_Se
a6b0: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
a6c0: 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  );.        dest.
a6d0: 61 66 66 69 6e 69 74 79 20 3d 20 28 69 6e 74 29  affinity = (int)
a6e0: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
a6f0: 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72    assert( (pExpr
a700: 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46  ->iTable&0x0000F
a710: 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61  FFF)==pExpr->iTa
a720: 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ble );.        i
a730: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
a740: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
a750: 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20  pSelect, &dest) 
a760: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
a770: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
a780: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
a790: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
a7a0: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
a7b0: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
a7c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b  List->nExpr>0 ){
a7d0: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
a7e0: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  nfo.aColl[0] = s
a7f0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
a800: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
a810: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
a820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
a830: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
a840: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
a850: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
a860: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
a870: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
a880: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
a890: 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
a8a0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f  **.        ** Fo
a8b0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
a8c0: 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65  n, build an inde
a8d0: 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65  x key from the e
a8e0: 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20  valuation and.  
a8f0: 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69        ** store i
a900: 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  t in the tempora
a910: 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78  ry table. If <ex
a920: 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  pr> is a column,
a930: 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20   then use.      
a940: 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e    ** that column
a950: 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20  s affinity when 
a960: 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b  building index k
a970: 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  eys. If <expr> i
a980: 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
a990: 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e   a column, use n
a9a0: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e  umeric affinity.
a9b0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a9c0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
a9d0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
a9e0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
a9f0: 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
aa00: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
aa10: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20  *pItem;.        
aa20: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
aa30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
aa40: 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
aa50: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
aa60: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
aa70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aa80: 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b    keyInfo.aColl[
aa90: 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  0] = sqlite3Expr
aaa0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
aab0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a  pExpr->pLeft);..
aac0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
aad0: 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
aae0: 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
aaf0: 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
ab00: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
ab10: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ab20: 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
ab30: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
ab40: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
ab50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ab60: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
ab70: 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  0, r2);.        
ab80: 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
ab90: 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
aba0: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
abb0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
abc0: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
abd0: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
abe0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
abf0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
ac00: 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
ac10: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
ac20: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
ac30: 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
ac40: 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
ac50: 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
ac60: 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
ac70: 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
ac80: 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
ac90: 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
aca0: 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
acb0: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
acc0: 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
acd0: 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
ace0: 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
acf0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ad00: 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72      if( testAddr
ad10: 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
ad20: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
ad30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
ad40: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ad50: 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64  ToNoop(v, testAd
ad60: 64 72 2d 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  dr-1, 2);.      
ad70: 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d        testAddr =
ad80: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
ad90: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
ada0: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
adb0: 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
adc0: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
add0: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
ade0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
adf0: 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  ableColCache++;.
ae00: 20 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73            r3 = s
ae10: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
ae20: 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32  rget(pParse, pE2
ae30: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
ae40: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
ae50: 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
ae60: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >0 );.          
ae70: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
ae80: 6f 6c 43 61 63 68 65 2d 2d 3b 0a 0a 20 20 20 20  olCache--;..    
ae90: 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
aea0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
aeb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
aec0: 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
aed0: 6e 74 2c 20 72 33 2c 20 73 71 6c 69 74 65 33 56  nt, r3, sqlite3V
aee0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
aef0: 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )+2);.          
af00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
af10: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
af20: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
af30: 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20   r2, r3);.      
af40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
af50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
af60: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
af70: 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
af80: 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
af90: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
afa0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
afb0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
afc0: 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
afe0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
aff0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
b000: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
b010: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
b020: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b030: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
b040: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
b050: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
b060: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
b070: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
b080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b090: 20 21 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20   !isRowid ){.   
b0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b0b0: 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
b0c0: 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e  , (void *)&keyIn
b0d0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
b0e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
b0f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
b100: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
b110: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
b120: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
b130: 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  This has to be a
b140: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
b150: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b160: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
b170: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
b180: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
b190: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
b1a0: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
b1b0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
b1c0: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
b1d0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  olumn..      */.
b1e0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
b1f0: 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b  st Token one = {
b200: 20 28 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20   (u8*)"1", 0, 1 
b210: 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  };.      Select 
b220: 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20 53 65 6c  *pSel;.      Sel
b230: 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 0a 20  ectDest dest;.. 
b240: 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
b250: 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  r->pSelect;.    
b260: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
b270: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30  estInit(&dest, 0
b280: 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  , ++pParse->nMem
b290: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
b2a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
b2b0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73  T ){.        des
b2c0: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65  t.eDest = SRT_Me
b2d0: 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
b2e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b2f0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74  OP_Null, 0, dest
b300: 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  .iParm);.       
b310: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
b320: 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
b330: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
b340: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b350: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
b360: 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
b370: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b380: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
b390: 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29  , 0, dest.iParm)
b3a0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
b3b0: 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
b3c0: 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
b3d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b3e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
b3f0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
b400: 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  el->pLimit);.   
b410: 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
b420: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
b430: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
b440: 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a  R, 0, 0, &one);.
b450: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
b460: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
b470: 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a  pSel, &dest) ){.
b480: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
b490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45        }.      pE
b4a0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 64  xpr->iColumn = d
b4b0: 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20  est.iParm;.     
b4c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b4d0: 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64  }..  if( testAdd
b4e0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
b4f0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b500: 74 65 73 74 41 64 64 72 2d 31 29 3b 0a 20 20 7d  testAddr-1);.  }
b510: 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ..  return;.}.#e
b520: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
b530: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
b540: 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  ./*.** Duplicate
b550: 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75 65   an 8-byte value
b560: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
b570: 2a 64 75 70 38 62 79 74 65 73 28 56 64 62 65 20  *dup8bytes(Vdbe 
b580: 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
b590: 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74  in){.  char *out
b5a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b5b0: 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62  ocRaw(sqlite3Vdb
b5c0: 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69 66  eDb(v), 8);.  if
b5d0: 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d  ( out ){.    mem
b5e0: 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b  cpy(out, in, 8);
b5f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75  .  }.  return ou
b600: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
b610: 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
b620: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
b630: 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70  t the floating p
b640: 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65  oint.** value de
b650: 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e  scribed by z[0..
b660: 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
b670: 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er iMem..**.** T
b680: 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
b690: 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
b6a0: 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
b6b0: 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
b6c0: 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
b6d0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
b6e0: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
b6f0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
b700: 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
b710: 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
b720: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
b730: 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c  ic void codeReal
b740: 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
b750: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
b760: 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20  int negateFlag, 
b770: 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 61 73 73  int iMem){.  ass
b780: 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c  ert( z || v==0 |
b790: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  | sqlite3VdbeDb(
b7a0: 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  v)->mallocFailed
b7b0: 20 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20   );.  if( z ){. 
b7c0: 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b     double value;
b7d0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20  .    char *zV;. 
b7e0: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 64 69     assert( !isdi
b7f0: 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20  git(z[n]) );.   
b800: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20   sqlite3AtoF(z, 
b810: 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28  &value);.    if(
b820: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61   sqlite3IsNaN(va
b830: 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  lue) ){.      sq
b840: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b850: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
b860: 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Mem);.    }else{
b870: 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 61 74  .      if( negat
b880: 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20  eFlag ) value = 
b890: 2d 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56  -value;.      zV
b8a0: 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20   = dup8bytes(v, 
b8b0: 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a  (char*)&value);.
b8c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b8d0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65  eAddOp4(v, OP_Re
b8e0: 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  al, 0, iMem, 0, 
b8f0: 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20  zV, P4_REAL);.  
b900: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
b910: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
b920: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
b930: 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
b940: 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
b950: 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
b960: 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
b970: 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iMem..**.** The 
b980: 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  z[] string will 
b990: 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20  probably not be 
b9a0: 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
b9b0: 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b    But the .** z[
b9c0: 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20  n] character is 
b9d0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
b9e0: 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
b9f0: 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a  does not look.**
ba00: 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e   like the contin
ba10: 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75  uation of the nu
ba20: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
ba30: 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
ba40: 28 56 64 62 65 20 2a 76 2c 20 45 78 70 72 20 2a  (Vdbe *v, Expr *
ba50: 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c  pExpr, int negFl
ba60: 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
ba70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
ba80: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
ba90: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
baa0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
bab0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
bac0: 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
bad0: 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c   i = -i;.    sql
bae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
baf0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
bb00: 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 20   iMem);.  }else 
bb10: 69 66 28 20 28 7a 20 3d 20 28 63 68 61 72 2a 29  if( (z = (char*)
bb20: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 21  pExpr->token.z)!
bb30: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
bb40: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78  .    int n = pEx
bb50: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
bb60: 20 61 73 73 65 72 74 28 20 21 69 73 64 69 67 69   assert( !isdigi
bb70: 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20 20 69  t(z[n]) );.    i
bb80: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
bb90: 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20  32(z, &i) ){.   
bba0: 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
bbb0: 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 20 20 73   i = -i;.      s
bbc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
bbd0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
bbe0: 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65  i, iMem);.    }e
bbf0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46  lse if( sqlite3F
bc00: 69 74 73 49 6e 36 34 42 69 74 73 28 7a 2c 20 6e  itsIn64Bits(z, n
bc10: 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20  egFlag) ){.     
bc20: 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20   i64 value;.    
bc30: 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20    char *zV;.    
bc40: 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28    sqlite3Atoi64(
bc50: 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
bc60: 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
bc70: 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
bc80: 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62        zV = dup8b
bc90: 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26  ytes(v, (char*)&
bca0: 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71  value);.      sq
bcb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
bcc0: 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20  v, OP_Int64, 0, 
bcd0: 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f  iMem, 0, zV, P4_
bce0: 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73  INT64);.    }els
bcf0: 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61  e{.      codeRea
bd00: 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65 67 46 6c  l(v, z, n, negFl
bd10: 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d  ag, iMem);.    }
bd20: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
bd30: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
bd40: 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74  t will extract t
bd50: 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
bd60: 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  lumn from.** tab
bd70: 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72  le pTab and stor
bd80: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
bd90: 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ue in a register
bda0: 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20  .  An effort.** 
bdb0: 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65  is made to store
bdc0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
bdd0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  e in register iR
bde0: 65 67 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a  eg, but this is.
bdf0: 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65  ** not guarantee
be00: 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  d.  The location
be10: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76   of the column v
be20: 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
be30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
be40: 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75  st be an open cu
be50: 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20  rsor to pTab in 
be60: 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73  iTable when this
be70: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
be80: 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75  alled.  If iColu
be90: 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69  mn<0 then code i
bea0: 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74  s generated that
beb0: 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f   extracts the ro
bec0: 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  wid..**.** This 
bed0: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61 74  routine might at
bee0: 74 65 6d 70 74 20 74 6f 20 72 65 75 73 65 20 74  tempt to reuse t
bef0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
bf00: 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68  column that.** h
bf10: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
bf20: 6c 6f 61 64 65 64 20 69 6e 74 6f 20 61 20 72 65  loaded into a re
bf30: 67 69 73 74 65 72 2e 20 20 54 68 65 20 76 61 6c  gister.  The val
bf40: 75 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a 2a  ue will always.*
bf50: 2a 20 62 65 20 75 73 65 64 20 69 66 20 69 74 20  * be used if it 
bf60: 68 61 73 20 6e 6f 74 20 75 6e 64 65 72 67 6f 6e  has not undergon
bf70: 65 20 61 6e 79 20 61 66 66 69 6e 69 74 79 20 63  e any affinity c
bf80: 68 61 6e 67 65 73 2e 20 20 42 75 74 20 69 66 0a  hanges.  But if.
bf90: 2a 2a 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63  ** an affinity c
bfa0: 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72  hange has occurr
bfb0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 61 63  ed, then the cac
bfc0: 68 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 6f  hed value will o
bfd0: 6e 6c 79 20 62 65 0a 2a 2a 20 75 73 65 64 20 69  nly be.** used i
bfe0: 66 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20 69  f allowAffChng i
bff0: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
c000: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
c010: 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  tColumn(.  Parse
c020: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
c030: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
c040: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
c050: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
c060: 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Tab,     /* Desc
c070: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
c080: 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64  able we are read
c090: 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ing from */.  in
c0a0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t iColumn,     /
c0b0: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
c0c0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  able column */. 
c0d0: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
c0e0: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
c0f0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
c100: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
c110: 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
c120: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72  tore results her
c130: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 6c 6f 77  e */.  int allow
c140: 41 66 66 43 68 6e 67 20 2f 2a 20 54 72 75 65 20  AffChng /* True 
c150: 69 66 20 70 72 69 6f 72 20 61 66 66 69 6e 69 74  if prior affinit
c160: 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 4f 4b  y changes are OK
c170: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
c180: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
c190: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
c1a0: 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
c1b0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  ;..  for(i=0, p=
c1c0: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
c1d0: 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  e; i<pParse->nCo
c1e0: 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b  lCache; i++, p++
c1f0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54  ){.    if( p->iT
c200: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
c210: 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  p->iColumn==iCol
c220: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 20 20 26  umn.           &
c230: 26 20 28 21 70 2d 3e 61 66 66 43 68 61 6e 67 65  & (!p->affChange
c240: 20 7c 7c 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67   || allowAffChng
c250: 29 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20 20  ) ){.#if 0.     
c260: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c270: 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(v, OP_Noop);.
c280: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
c290: 74 28 28 76 2c 20 22 4f 50 54 3a 20 74 61 62 25  t((v, "OPT: tab%
c2a0: 64 2e 63 6f 6c 25 64 20 2d 3e 20 72 25 64 22 2c  d.col%d -> r%d",
c2b0: 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
c2c0: 2c 20 70 2d 3e 69 52 65 67 29 29 3b 0a 23 65 6e  , p->iReg));.#en
c2d0: 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
c2e0: 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
c2f0: 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
c300: 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 43  v!=0 );.  if( iC
c310: 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 69  olumn<0 ){.    i
c320: 6e 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26 26  nt op = (pTab &&
c330: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
c340: 29 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20  ) ? OP_VRowid : 
c350: 4f 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73 71  OP_Rowid;.    sq
c360: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c370: 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69  v, op, iTable, i
c380: 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Reg);.  }else if
c390: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
c3a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c3b0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
c3c0: 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
c3d0: 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65  , iReg);.  }else
c3e0: 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49  {.    int op = I
c3f0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
c400: 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50   OP_VColumn : OP
c410: 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c  _Column;.    sql
c420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c430: 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 43  , op, iTable, iC
c440: 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
c450: 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44    sqlite3ColumnD
c460: 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20  efault(v, pTab, 
c470: 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65  iColumn);.#ifnde
c480: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
c490: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
c4a0: 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   if( pTab->aCol[
c4b0: 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
c4c0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
c4d0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL ){.      sqli
c4e0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c4f0: 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
c500: 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a 23  , iReg);.    }.#
c510: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20  endif.  }.  if( 
c520: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
c530: 6f 6c 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20  olCache==0 ){.  
c540: 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 43    i = pParse->iC
c550: 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20 70 20 3d  olCache;.    p =
c560: 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61   &pParse->aColCa
c570: 63 68 65 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e 69  che[i];.    p->i
c580: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
c590: 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
c5a0: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 2d   iColumn;.    p-
c5b0: 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
c5c0: 20 20 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 3d    p->affChange =
c5d0: 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20   0;.    i++;.   
c5e0: 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a   if( i>=ArraySiz
c5f0: 65 28 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  e(pParse->aColCa
c600: 63 68 65 29 20 29 20 69 20 3d 20 30 3b 0a 20 20  che) ) i = 0;.  
c610: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
c620: 6e 43 6f 6c 43 61 63 68 65 20 29 20 70 50 61 72  nColCache ) pPar
c630: 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20  se->nColCache = 
c640: 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  i;.    pParse->i
c650: 43 6f 6c 43 61 63 68 65 20 3d 20 69 3b 0a 20 20  ColCache = i;.  
c660: 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
c670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
c680: 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  all column cache
c690: 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
c6a0: 74 65 64 20 77 69 74 68 20 74 68 65 20 76 64 62  ted with the vdb
c6b0: 65 0a 2a 2a 20 63 75 72 73 6f 72 20 77 69 74 68  e.** cursor with
c6c0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69   cursor number i
c6d0: 54 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Table..*/.void s
c6e0: 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 43  qlite3ExprClearC
c6f0: 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65  olumnCache(Parse
c700: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
c710: 61 62 6c 65 29 7b 0a 20 20 69 66 28 20 69 54 61  able){.  if( iTa
c720: 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 70 50 61  ble<0 ){.    pPa
c730: 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d  rse->nColCache =
c740: 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
c750: 69 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 20  iColCache = 0;. 
c760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
c770: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
c780: 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
c790: 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  che; i++){.     
c7a0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f   if( pParse->aCo
c7b0: 6c 43 61 63 68 65 5b 69 5d 2e 69 54 61 62 6c 65  lCache[i].iTable
c7c0: 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ==iTable ){.    
c7d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
c7e0: 3d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  =pParse->nColCac
c7f0: 68 65 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  he-1 );.        
c800: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
c810: 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61  e[i] = pParse->a
c820: 43 6f 6c 43 61 63 68 65 5b 2d 2d 70 50 61 72 73  ColCache[--pPars
c830: 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20  e->nColCache];. 
c840: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69         pParse->i
c850: 43 6f 6c 43 61 63 68 65 20 3d 20 70 50 61 72 73  ColCache = pPars
c860: 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20 20  e->nColCache;.  
c870: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c880: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
c890: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e  the fact that an
c8a0: 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
c8b0: 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e   has occurred on
c8c0: 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73   iCount.** regis
c8d0: 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
c8e0: 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f  th iStart..*/.vo
c8f0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
c900: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
c910: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
c920: 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
c930: 20 69 43 6f 75 6e 74 29 7b 0a 20 20 69 6e 74 20   iCount){.  int 
c940: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
c950: 69 43 6f 75 6e 74 20 2d 20 31 3b 0a 20 20 69 6e  iCount - 1;.  in
c960: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
c970: 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
c980: 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  che; i++){.    i
c990: 6e 74 20 72 20 3d 20 70 50 61 72 73 65 2d 3e 61  nt r = pParse->a
c9a0: 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
c9b0: 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 53 74  ;.    if( r>=iSt
c9c0: 61 72 74 20 26 26 20 72 3c 3d 69 45 6e 64 20 29  art && r<=iEnd )
c9d0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
c9e0: 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 61 66 66  aColCache[i].aff
c9f0: 43 68 61 6e 67 65 20 3d 20 31 3b 0a 20 20 20 20  Change = 1;.    
ca00: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
ca10: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
ca20: 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  move content fro
ca30: 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f  m registers iFro
ca40: 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31  m...iFrom+nReg-1
ca50: 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e  .** over to iTo.
ca60: 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65  .iTo+nReg-1. Kee
ca70: 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  p the column cac
ca80: 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a  he up-to-date..*
ca90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
caa0: 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65  prCodeMove(Parse
cab0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
cac0: 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e  rom, int iTo, in
cad0: 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t nReg){.  int i
cae0: 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 69  ;.  if( iFrom==i
caf0: 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  To ) return;.  s
cb00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
cb10: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
cb20: 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
cb30: 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 66 6f  iTo, nReg);.  fo
cb40: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
cb50: 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29  >nColCache; i++)
cb60: 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50  {.    int x = pP
cb70: 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
cb80: 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  i].iReg;.    if(
cb90: 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69   x>=iFrom && x<i
cba0: 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20  From+nReg ){.   
cbb0: 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43     pParse->aColC
cbc0: 61 63 68 65 5b 69 5d 2e 69 52 65 67 20 2b 3d 20  ache[i].iReg += 
cbd0: 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d  iTo-iFrom;.    }
cbe0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
cbf0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
cc00: 6f 70 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  opy content from
cc10: 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
cc20: 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
cc30: 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
cc40: 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76  iTo+nReg-1..*/.v
cc50: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
cc60: 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70  odeCopy(Parse *p
cc70: 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
cc80: 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
cc90: 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
cca0: 20 69 66 28 20 69 46 72 6f 6d 3d 3d 69 54 6f 20   if( iFrom==iTo 
ccb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
ccc0: 69 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b 2b  i=0; i<nReg; i++
ccd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
cce0: 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
ccf0: 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c  >pVdbe, OP_Copy,
cd00: 20 69 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69 29   iFrom+i, iTo+i)
cd10: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
cd20: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
cd30: 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  y register in th
cd40: 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69  e range iFrom..i
cd50: 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a  To (inclusive).*
cd60: 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  * is used as par
cd70: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
cd80: 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cache..*/.static
cd90: 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d   int usedAsColum
cda0: 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  nCache(Parse *pP
cdb0: 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
cdc0: 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74   int iTo){.  int
cdd0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
cde0: 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
cdf0: 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  he; i++){.    in
ce00: 74 20 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 43  t r = pParse->aC
ce10: 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b  olCache[i].iReg;
ce20: 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f  .    if( r>=iFro
ce30: 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65  m && r<=iTo ) re
ce40: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
ce50: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
ce60: 20 54 68 65 72 65 73 20 69 73 20 61 20 76 61 6c   Theres is a val
ce70: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
ce80: 43 75 72 72 65 6e 74 2e 20 20 57 65 20 75 6c 74  Current.  We ult
ce90: 69 6d 61 74 65 6c 79 20 77 61 6e 74 0a 2a 2a 20  imately want.** 
cea0: 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  the value to be 
ceb0: 69 6e 20 72 65 67 69 73 74 65 72 20 69 54 61 72  in register iTar
cec0: 67 65 74 2e 20 20 49 74 20 6d 69 67 68 74 20 62  get.  It might b
ced0: 65 20 74 68 61 74 0a 2a 2a 20 69 43 75 72 72 65  e that.** iCurre
cee0: 6e 74 20 61 6e 64 20 69 54 61 72 67 65 74 20 61  nt and iTarget a
cef0: 72 65 20 74 68 65 20 73 61 6d 65 20 72 65 67 69  re the same regi
cf00: 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ster..**.** We a
cf10: 72 65 20 67 6f 69 6e 67 20 74 6f 20 6d 6f 64 69  re going to modi
cf20: 66 79 20 74 68 65 20 76 61 6c 75 65 2c 20 73 6f  fy the value, so
cf30: 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65   we need to make
cf40: 20 73 75 72 65 20 69 74 0a 2a 2a 20 69 73 20 6e   sure it.** is n
cf50: 6f 74 20 61 20 63 61 63 68 65 64 20 72 65 67 69  ot a cached regi
cf60: 73 74 65 72 2e 20 20 49 66 20 69 43 75 72 72 65  ster.  If iCurre
cf70: 6e 74 20 69 73 20 61 20 63 61 63 68 65 64 20 72  nt is a cached r
cf80: 65 67 69 73 74 65 72 2c 0a 2a 2a 20 74 68 65 6e  egister,.** then
cf90: 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   try to move the
cfa0: 20 76 61 6c 75 65 20 6f 76 65 72 20 74 6f 20 69   value over to i
cfb0: 54 61 72 67 65 74 2e 20 20 49 66 20 69 54 61 72  Target.  If iTar
cfc0: 67 65 74 20 69 73 20 61 0a 2a 2a 20 63 61 63 68  get is a.** cach
cfd0: 65 64 20 72 65 67 69 73 74 65 72 2c 20 74 68 65  ed register, the
cfe0: 6e 20 63 6c 65 61 72 20 74 68 65 20 63 6f 72 72  n clear the corr
cff0: 65 73 70 6f 6e 64 69 6e 67 20 63 61 63 68 65 20  esponding cache 
d000: 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  line..**.** Retu
d010: 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
d020: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 65  that the value e
d030: 6e 64 73 20 75 70 20 69 6e 2e 0a 2a 2f 0a 69 6e  nds up in..*/.in
d040: 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 72 69  t sqlite3ExprWri
d050: 74 61 62 6c 65 52 65 67 69 73 74 65 72 28 50 61  tableRegister(Pa
d060: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
d070: 20 69 43 75 72 72 65 6e 74 2c 20 69 6e 74 20 69   iCurrent, int i
d080: 54 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  Target){.  int i
d090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
d0a0: 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 0a  se->pVdbe!=0 );.
d0b0: 20 20 69 66 28 20 21 75 73 65 64 41 73 43 6f 6c    if( !usedAsCol
d0c0: 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
d0d0: 20 69 43 75 72 72 65 6e 74 2c 20 69 43 75 72 72   iCurrent, iCurr
d0e0: 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ent) ){.    retu
d0f0: 72 6e 20 69 43 75 72 72 65 6e 74 3b 0a 20 20 7d  rn iCurrent;.  }
d100: 0a 20 20 69 66 28 20 69 43 75 72 72 65 6e 74 21  .  if( iCurrent!
d110: 3d 69 54 61 72 67 65 74 20 29 7b 0a 20 20 20 20  =iTarget ){.    
d120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d130: 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
d140: 20 4f 50 5f 53 43 6f 70 79 2c 20 69 43 75 72 72   OP_SCopy, iCurr
d150: 65 6e 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ent, iTarget);. 
d160: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
d170: 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
d180: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  e; i++){.    if(
d190: 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
d1a0: 68 65 5b 69 5d 2e 69 52 65 67 3d 3d 69 54 61 72  he[i].iReg==iTar
d1b0: 67 65 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  get ){.      pPa
d1c0: 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
d1d0: 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  ] = pParse->aCol
d1e0: 43 61 63 68 65 5b 2d 2d 70 50 61 72 73 65 2d 3e  Cache[--pParse->
d1f0: 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 20 20  nColCache];.    
d200: 20 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61    pParse->iColCa
d210: 63 68 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 43  che = pParse->nC
d220: 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20 7d 0a 20  olCache;.    }. 
d230: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 54 61 72   }.  return iTar
d240: 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  get;.}../*.** If
d250: 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75   the last instru
d260: 63 74 69 6f 6e 20 63 6f 64 65 64 20 69 73 20 61  ction coded is a
d270: 6e 20 65 70 68 65 6d 65 72 61 6c 20 63 6f 70 79  n ephemeral copy
d280: 20 6f 66 20 61 6e 79 20 6f 66 0a 2a 2a 20 74 68   of any of.** th
d290: 65 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 74  e registers in t
d2a0: 68 65 20 6e 52 65 67 20 72 65 67 69 73 74 65 72  he nReg register
d2b0: 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
d2c0: 20 69 52 65 67 2c 20 74 68 65 6e 0a 2a 2a 20 63   iReg, then.** c
d2d0: 6f 6e 76 65 72 74 20 74 68 65 20 6c 61 73 74 20  onvert the last 
d2e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 72 6f 6d  instruction from
d2f0: 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 4f 50 5f   OP_SCopy to OP_
d300: 43 6f 70 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  Copy..*/.void sq
d310: 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f 70  lite3ExprHardCop
d320: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
d330: 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
d340: 52 65 67 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  Reg){.  int addr
d350: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
d360: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 76  .  Vdbe *v;..  v
d370: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
d380: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
d390: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
d3a0: 72 28 76 29 3b 0a 20 20 70 4f 70 20 3d 20 73 71  r(v);.  pOp = sq
d3b0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
d3c0: 2c 20 61 64 64 72 2d 31 29 3b 0a 20 20 61 73 73  , addr-1);.  ass
d3d0: 65 72 74 28 20 70 4f 70 20 7c 7c 20 70 50 61 72  ert( pOp || pPar
d3e0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
d3f0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f  iled );.  if( pO
d400: 70 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  p && pOp->opcode
d410: 3d 3d 4f 50 5f 53 43 6f 70 79 20 26 26 20 70 4f  ==OP_SCopy && pO
d420: 70 2d 3e 70 31 3e 3d 69 52 65 67 20 26 26 20 70  p->p1>=iReg && p
d430: 4f 70 2d 3e 70 31 3c 69 52 65 67 2b 6e 52 65 67  Op->p1<iReg+nReg
d440: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63   ){.    pOp->opc
d450: 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20  ode = OP_Copy;. 
d460: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
d470: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74 6f  rate code to sto
d480: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
d490: 74 68 65 20 69 41 6c 69 61 73 2d 74 68 20 61 6c  the iAlias-th al
d4a0: 69 61 73 20 69 6e 20 72 65 67 69 73 74 65 72 0a  ias in register.
d4b0: 2a 2a 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  ** target.  The 
d4c0: 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
d4d0: 69 73 20 63 61 6c 6c 65 64 2c 20 70 45 78 70 72  is called, pExpr
d4e0: 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 74 6f   is evaluated to
d4f0: 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
d500: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 69  value of the ali
d510: 61 73 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  as.  The value i
d520: 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  s stored in an a
d530: 75 78 69 6c 69 61 72 79 20 72 65 67 69 73 74 65  uxiliary registe
d540: 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 75 6d  r.** and the num
d550: 62 65 72 20 6f 66 20 74 68 61 74 20 72 65 67 69  ber of that regi
d560: 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
d570: 2e 20 20 4f 6e 20 73 75 62 73 65 71 75 65 6e 74  .  On subsequent
d580: 20 63 61 6c 6c 73 2c 0a 2a 2a 20 74 68 65 20 72   calls,.** the r
d590: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69  egister number i
d5a0: 73 20 72 65 74 75 72 6e 65 64 20 77 69 74 68 6f  s returned witho
d5b0: 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e  ut generating an
d5c0: 79 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  y code..**.** No
d5d0: 74 65 20 74 68 61 74 20 69 6e 20 6f 72 64 65 72  te that in order
d5e0: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 77 6f 72   for this to wor
d5f0: 6b 2c 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  k, code must be 
d600: 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65  generated in the
d610: 0a 2a 2a 20 73 61 6d 65 20 6f 72 64 65 72 20 74  .** same order t
d620: 68 61 74 20 69 74 20 69 73 20 65 78 65 63 75 74  hat it is execut
d630: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 69 61 73 65  ed..**.** Aliase
d640: 73 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  s are numbered s
d650: 74 61 72 74 69 6e 67 20 77 69 74 68 20 31 2e 20  tarting with 1. 
d660: 20 53 6f 20 69 41 6c 69 61 73 20 69 73 20 69 6e   So iAlias is in
d670: 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f 66   the range.** of
d680: 20 31 20 74 6f 20 70 50 61 72 73 65 2d 3e 6e 41   1 to pParse->nA
d690: 6c 69 61 73 20 69 6e 63 6c 75 73 69 76 65 2e 20  lias inclusive. 
d6a0: 20 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   .**.** pParse->
d6b0: 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d  aAlias[iAlias-1]
d6c0: 20 72 65 63 6f 72 64 73 20 74 68 65 20 72 65 67   records the reg
d6d0: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
d6e0: 72 65 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  re the value.** 
d6f0: 6f 66 20 74 68 65 20 69 41 6c 69 61 73 2d 74 68  of the iAlias-th
d700: 20 61 6c 69 61 73 20 69 73 20 73 74 6f 72 65 64   alias is stored
d710: 2e 20 20 49 66 20 7a 65 72 6f 2c 20 74 68 61 74  .  If zero, that
d720: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 0a   means that the.
d730: 2a 2a 20 61 6c 69 61 73 20 68 61 73 20 6e 6f 74  ** alias has not
d740: 20 79 65 74 20 62 65 65 6e 20 63 6f 6d 70 75 74   yet been comput
d750: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
d760: 74 20 63 6f 64 65 41 6c 69 61 73 28 50 61 72 73  t codeAlias(Pars
d770: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
d780: 41 6c 69 61 73 2c 20 45 78 70 72 20 2a 70 45 78  Alias, Expr *pEx
d790: 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
d7a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d7b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
d7c0: 6e 74 20 69 52 65 67 3b 0a 20 20 69 66 28 20 70  nt iReg;.  if( p
d7d0: 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 3d 3d 30  Parse->aAlias==0
d7e0: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
d7f0: 61 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  aAlias = sqlite3
d800: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
d810: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 20 73 69 7a 65 6f 66 28 70 50 61 72 73 65     sizeof(pParse
d840: 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 2a 70 50 61  ->aAlias[0])*pPa
d850: 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20  rse->nAlias );. 
d860: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
d870: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
d880: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
d890: 28 20 69 41 6c 69 61 73 3e 30 20 26 26 20 69 41  ( iAlias>0 && iA
d8a0: 6c 69 61 73 3c 3d 70 50 61 72 73 65 2d 3e 6e 41  lias<=pParse->nA
d8b0: 6c 69 61 73 20 29 3b 0a 20 20 69 52 65 67 20 3d  lias );.  iReg =
d8c0: 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b   pParse->aAlias[
d8d0: 69 41 6c 69 61 73 2d 31 5d 3b 0a 20 20 69 66 28  iAlias-1];.  if(
d8e0: 20 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20   iReg==0 ){.    
d8f0: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  if( pParse->disa
d900: 62 6c 65 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20  bleColCache ){. 
d910: 20 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69       iReg = sqli
d920: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
d930: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
d940: 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 65   target);.    }e
d950: 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 67 20  lse{.      iReg 
d960: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d970: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
d980: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d990: 70 45 78 70 72 2c 20 69 52 65 67 29 3b 0a 20 20  pExpr, iReg);.  
d9a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 6c 69      pParse->aAli
d9b0: 61 73 5b 69 41 6c 69 61 73 2d 31 5d 20 3d 20 69  as[iAlias-1] = i
d9c0: 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Reg;.    }.  }. 
d9d0: 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
d9e0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
d9f0: 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
da00: 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
da10: 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
da20: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
da30: 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72   Attempt to stor
da40: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
da50: 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65   register "targe
da60: 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  t"..** Return th
da70: 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
da80: 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
da90: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  red..**.** With 
daa0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
dab0: 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e  ere is no guaran
dac0: 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73  tee that results
dad0: 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72   will.** be stor
dae0: 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54  ed in target.  T
daf0: 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20  he result might 
db00: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d  be stored in som
db10: 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73  e other.** regis
db20: 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ter if it is con
db30: 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f  venient to do so
db40: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
db50: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
db60: 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
db70: 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74   code and move t
db80: 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
db90: 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67  e desired.** reg
dba0: 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
dbb0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
dbc0: 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  get(Parse *pPars
dbd0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
dbe0: 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
dbf0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
dc00: 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20  >pVdbe;  /* The 
dc10: 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  VM under constru
dc20: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ction */.  int o
dc30: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
dc40: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
dc50: 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  de being coded *
dc60: 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20  /.  int inReg = 
dc70: 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a  target;       /*
dc80: 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20   Results stored 
dc90: 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65  in register inRe
dca0: 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  g */.  int regFr
dcb0: 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee1 = 0;        
dcc0: 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
dcd0: 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
dce0: 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
dcf0: 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
dd00: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
dd10: 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
dd20: 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
dd30: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
dd40: 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b   r1, r2, r3, r4;
dd50: 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
dd60: 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  s register numbe
dd70: 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rs */.  sqlite3 
dd80: 2a 64 62 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61  *db;..  db = pPa
dd90: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
dda0: 74 28 20 76 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  t( v!=0 || db->m
ddb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
ddc0: 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
ddd0: 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
dde0: 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
ddf0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
de00: 20 30 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72   0;..  if( pExpr
de10: 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
de20: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
de30: 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
de40: 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
de50: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
de60: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
de70: 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
de80: 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
de90: 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
dea0: 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
deb0: 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
dec0: 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
ded0: 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
dee0: 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
def0: 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
df00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
df10: 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
df20: 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
df30: 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
df40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
df50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
df60: 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
df70: 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
df80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
df90: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
dfa0: 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
dfb0: 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
dfe0: 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
dff0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e000: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
e010: 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
e020: 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
e030: 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
e040: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e050: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
e060: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
e070: 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  able<0 ){.      
e080: 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
e090: 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69  appens when codi
e0a0: 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61  ng check constra
e0b0: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
e0c0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
e0d0: 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20  ckBase>0 );.    
e0e0: 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
e0f0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61  r->iColumn + pPa
e100: 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20  rse->ckBase;.   
e110: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e120: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 45 78    testcase( (pEx
e130: 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 41  pr->flags & EP_A
e140: 6e 79 41 66 66 29 21 3d 30 20 29 3b 0a 20 20 20  nyAff)!=0 );.   
e150: 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
e160: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
e170: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45  olumn(pParse, pE
e180: 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20  xpr->pTab,.     
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
e1b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70  r->iColumn, pExp
e1c0: 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
e1d0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73      pExpr->flags
e200: 20 26 20 45 50 5f 41 6e 79 41 66 66 29 3b 0a 20   & EP_AnyAff);. 
e210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
e220: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e230: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
e240: 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
e250: 65 72 28 76 2c 20 70 45 78 70 72 2c 20 30 2c 20  er(v, pExpr, 0, 
e260: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
e270: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e280: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
e290: 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
e2a0: 76 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  v, (char*)pExpr-
e2b0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
e2c0: 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 2c 20 74 61 72  >token.n, 0, tar
e2d0: 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
e2e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e2f0: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
e300: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
e310: 6f 74 65 45 78 70 72 28 64 62 2c 20 70 45 78 70  oteExpr(db, pExp
e320: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
e330: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 4f 50  3VdbeAddOp4(v,OP
e340: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72  _String8, 0, tar
e350: 67 65 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  get, 0,.        
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
e380: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
e390: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72  ken.n);.      br
e3a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e3b0: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
e3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e3d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
e3e0: 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
e3f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e400: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
e410: 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
e420: 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
e430: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
e440: 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
e450: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
e460: 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
e470: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
e480: 3e 74 6f 6b 65 6e 2e 6e 3e 3d 33 20 29 3b 0a 20  >token.n>=3 );. 
e490: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
e4a0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d  pr->token.z[0]==
e4b0: 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 74 6f  'x' || pExpr->to
e4c0: 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 58 27 20 29 3b  ken.z[0]=='X' );
e4d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e4e0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 31 5d  Expr->token.z[1]
e4f0: 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
e500: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74  assert( pExpr->t
e510: 6f 6b 65 6e 2e 7a 5b 70 45 78 70 72 2d 3e 74 6f  oken.z[pExpr->to
e520: 6b 65 6e 2e 6e 2d 31 5d 3d 3d 27 5c 27 27 20 29  ken.n-1]=='\'' )
e530: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 78 70  ;.      n = pExp
e540: 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a  r->token.n - 3;.
e550: 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a        z = (char*
e560: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20  )pExpr->token.z 
e570: 2b 20 32 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  + 2;.      zBlob
e580: 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
e590: 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
e5a0: 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
e5b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e5c0: 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
e5d0: 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
e5e0: 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
e5f0: 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
e600: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
e610: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
e620: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
e630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e640: 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70  , OP_Variable, p
e650: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
e660: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
e670: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e   pExpr->token.n>
e680: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
e690: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
e6a0: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
e6b0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
e6c0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
e6d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
e6e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e6f0: 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
e700: 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
e710: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
e720: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e730: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
e740: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  S: {.      inReg
e750: 20 3d 20 63 6f 64 65 41 6c 69 61 73 28 70 50 61   = codeAlias(pPa
e760: 72 73 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  rse, pExpr->iTab
e770: 6c 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  le, pExpr->pLeft
e780: 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
e790: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
e7a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e7b0: 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
e7c0: 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
e7d0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
e7e0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
e7f0: 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
e800: 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  en) */.      int
e810: 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20   aff, to_op;.   
e820: 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
e830: 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
e840: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
e850: 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
e860: 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
e870: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
e880: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
e890: 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66        to_op = af
e8a0: 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f - SQLITE_AFF_T
e8b0: 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b  EXT + OP_ToText;
e8c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
e8d0: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20  o_op==OP_ToText 
e8e0: 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
e8f0: 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b  E_AFF_TEXT    );
e900: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
e910: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20  o_op==OP_ToBlob 
e920: 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
e930: 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b  E_AFF_NONE    );
e940: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
e950: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72  o_op==OP_ToNumer
e960: 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54  ic || aff!=SQLIT
e970: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
e980: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
e990: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20  o_op==OP_ToInt  
e9a0: 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
e9b0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
e9c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
e9d0: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20  o_op==OP_ToReal 
e9e0: 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
e9f0: 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b  E_AFF_REAL    );
ea00: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ea10: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78   to_op==OP_ToTex
ea20: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
ea30: 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
ea40: 6f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 74  oBlob );.      t
ea50: 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
ea60: 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a  OP_ToNumeric );.
ea70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ea80: 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20  to_op==OP_ToInt 
ea90: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
eaa0: 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52  e( to_op==OP_ToR
eab0: 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eal );.      if(
eac0: 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29   inReg!=target )
ead0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
eae0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
eaf0: 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
eb00: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
eb10: 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
eb20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
eb30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
eb40: 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67  (v, to_op, inReg
eb50: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
eb60: 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  e( usedAsColumnC
eb70: 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ache(pParse, inR
eb80: 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20  eg, inReg) );.  
eb90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
eba0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
ebb0: 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  ge(pParse, inReg
ebc0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
ebd0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
ebe0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
ebf0: 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
ec00: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
ec10: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
ec20: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
ec30: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
ec40: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
ec50: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
ec60: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
ec70: 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
ec80: 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
ec90: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
eca0: 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
ecb0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ecc0: 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
ecd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
ece0: 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
ecf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
ed00: 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
ed10: 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
ed20: 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  =TK_LT );.      
ed30: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
ed40: 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
ed50: 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54  tcase( op==TK_GT
ed60: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
ed70: 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b  se( op==TK_GE );
ed80: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ed90: 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20   op==TK_EQ );.  
eda0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
edb0: 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20  ==TK_NE );.     
edc0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72   codeCompareOper
edd0: 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 45 78  ands(pParse, pEx
ede0: 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20  pr->pLeft, &r1, 
edf0: 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20  &regFree1,.     
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
ee20: 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 32 2c  pr->pRight, &r2,
ee30: 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
ee40: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
ee50: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
ee60: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
ee70: 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
ee80: 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
ee90: 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
eea0: 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
eeb0: 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
eec0: 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
eed0: 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
eee0: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
eef0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ef00: 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
ef10: 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
ef20: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
ef30: 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
ef40: 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
ef50: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
ef60: 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
ef70: 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
ef80: 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
ef90: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
efa0: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
efb0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
efc0: 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
efd0: 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
efe0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
eff0: 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20  D==OP_And );.   
f000: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
f010: 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20  ==OP_Or );.     
f020: 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
f030: 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20  ==OP_Add );.    
f040: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
f050: 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
f060: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f070: 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
f080: 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61  inder );.      a
f090: 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44  ssert( TK_BITAND
f0a0: 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20  ==OP_BitAnd );. 
f0b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
f0c0: 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20  BITOR==OP_BitOr 
f0d0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f0e0: 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
f0f0: 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73  vide );.      as
f100: 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
f110: 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
f120: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
f130: 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
f140: 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  ftRight );.     
f150: 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
f160: 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
f170: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f180: 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20   op==TK_AND );. 
f190: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
f1a0: 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20  p==TK_OR );.    
f1b0: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
f1c0: 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20  TK_PLUS );.     
f1d0: 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
f1e0: 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20  K_MINUS );.     
f1f0: 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
f200: 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 74  K_REM );.      t
f210: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
f220: 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
f230: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
f240: 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20  _BITOR );.      
f250: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
f260: 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20  _SLASH );.      
f270: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
f280: 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _LSHIFT );.     
f290: 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
f2a0: 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_RSHIFT );.    
f2b0: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
f2c0: 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20  TK_CONCAT );.   
f2d0: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
f2e0: 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
f2f0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
f300: 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
f310: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
f320: 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
f330: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
f340: 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
f350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f360: 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
f370: 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
f380: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f390: 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
f3a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
f3b0: 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
f3c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f3d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
f3e0: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
f3f0: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
f400: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
f410: 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
f420: 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
f430: 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c  >op==TK_FLOAT ||
f440: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
f450: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
f460: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
f470: 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
f480: 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
f490: 76 2c 20 28 63 68 61 72 2a 29 70 4c 65 66 74 2d  v, (char*)pLeft-
f4a0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d  >token.z, pLeft-
f4b0: 3e 74 6f 6b 65 6e 2e 6e 2c 20 31 2c 20 74 61 72  >token.n, 1, tar
f4c0: 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  get);.        }e
f4d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
f4e0: 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70 4c  odeInteger(v, pL
f4f0: 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  eft, 1, target);
f500: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f520: 72 65 67 46 72 65 65 31 20 3d 20 72 31 20 3d 20  regFree1 = r1 = 
f530: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
f540: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
f550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f560: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
f570: 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20  er, 0, r1);.    
f580: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
f590: 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
f5a0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f5b0: 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
f5c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f5d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
f5e0: 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c  ubtract, r2, r1,
f5f0: 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
f600: 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
f610: 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
f620: 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
f630: 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
f640: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f650: 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
f660: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
f670: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
f680: 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
f690: 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61  itNot );.      a
f6a0: 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f  ssert( TK_NOT==O
f6b0: 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74  P_Not );.      t
f6c0: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
f6d0: 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  BITNOT );.      
f6e0: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
f6f0: 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 69 6e  _NOT );.      in
f700: 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
f710: 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
f720: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
f730: 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
f740: 20 74 65 73 74 63 61 73 65 28 20 69 6e 52 65 67   testcase( inReg
f750: 3d 3d 74 61 72 67 65 74 20 29 3b 0a 20 20 20 20  ==target );.    
f760: 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64    testcase( used
f770: 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
f780: 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52  arse, inReg, inR
f790: 65 67 29 20 29 3b 0a 20 20 20 20 20 20 69 6e 52  eg) );.      inR
f7a0: 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
f7b0: 57 72 69 74 61 62 6c 65 52 65 67 69 73 74 65 72  WritableRegister
f7c0: 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
f7d0: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
f7e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f7f0: 28 76 2c 20 6f 70 2c 20 69 6e 52 65 67 29 3b 0a  (v, op, inReg);.
f800: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f810: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
f820: 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
f830: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
f840: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
f850: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
f860: 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
f870: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f880: 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
f890: 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  _NotNull );.    
f8a0: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
f8b0: 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
f8c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
f8d0: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
f8e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f8f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
f900: 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
f910: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
f920: 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
f930: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
f940: 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
f950: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f960: 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
f970: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
f980: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f990: 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20  (v, op, r1);.   
f9a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f9b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
f9c0: 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a  m, target, -1);.
f9d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f9e0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
f9f0: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
fa00: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fa10: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
fa20: 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
fa30: 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d   *pInfo = pExpr-
fa40: 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
fa50: 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
fa60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fa70: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
fa80: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
fa90: 65 67 61 74 65 3a 20 25 54 22 2c 0a 20 20 20 20  egate: %T",.    
faa0: 20 20 20 20 20 20 20 20 26 70 45 78 70 72 2d 3e          &pExpr->
fab0: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  span);.      }el
fac0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
fad0: 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  g = pInfo->aFunc
fae0: 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
faf0: 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
fb00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fb10: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54     case TK_CONST
fb20: 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20  _FUNC:.    case 
fb30: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
fb40: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
fb50: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
fb60: 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ist;.      int n
fb70: 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70  Expr = pList ? p
fb80: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
fb90: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
fba0: 70 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  pDef;.      int 
fbb0: 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  nId;.      const
fbc0: 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20   char *zId;.    
fbd0: 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20    int constMask 
fbe0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 0;.      int i
fbf0: 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  ;.      u8 enc =
fc00: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20   ENC(db);.      
fc10: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
fc20: 20 30 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63   0;..      testc
fc30: 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53  ase( op==TK_CONS
fc40: 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20  T_FUNC );.      
fc50: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
fc60: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
fc70: 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29     zId = (char*)
fc80: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
fc90: 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70        nId = pExp
fca0: 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  r->token.n;.    
fcb0: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
fcc0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
fcd0: 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72   zId, nId, nExpr
fce0: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
fcf0: 20 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30   assert( pDef!=0
fd00: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
fd10: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  ist ){.        n
fd20: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
fd30: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 72 31 20  xpr;.        r1 
fd40: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
fd50: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45  Range(pParse, nE
fd60: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
fd70: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
fd80: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
fd90: 69 73 74 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  ist, r1, 1);.   
fda0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fdb0: 20 20 6e 45 78 70 72 20 3d 20 72 31 20 3d 20 30    nExpr = r1 = 0
fdc0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
fdd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
fde0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
fdf0: 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
fe00: 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
fe10: 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
fe20: 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
fe30: 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
fe40: 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
fe50: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
fe60: 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
fe70: 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
fe80: 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
fe90: 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
fea0: 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
feb0: 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
fec0: 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
fed0: 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
fee0: 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
fef0: 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
ff00: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
ff10: 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
ff20: 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
ff30: 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
ff40: 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
ff50: 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
ff60: 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
ff70: 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
ff80: 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
ff90: 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
ffa0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
ffb0: 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
ffc0: 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
ffd0: 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
ffe0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
fff0: 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
10000 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
10010 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
10020 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
10030 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
10040 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
10050 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
10060 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
10070 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
10080 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
10090 45 78 70 72 3e 3d 32 20 26 26 20 28 70 45 78 70  Expr>=2 && (pExp
100a0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
100b0 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
100c0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
100d0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
100e0 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
100f0 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61   nExpr, pList->a
10100 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
10110 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 45 78 70    }else if( nExp
10120 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  r>0 ){.        p
10130 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
10140 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
10150 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 45 78 70  n(db, pDef, nExp
10160 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r, pList->a[0].p
10170 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
10180 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28  endif.      for(
10190 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20  i=0; i<nExpr && 
101a0 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<32; i++){.    
101b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
101c0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c  xprIsConstant(pL
101d0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
101e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
101f0 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69  nstMask |= (1<<i
10200 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10210 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
10220 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
10230 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30  UNC_NEEDCOLL)!=0
10240 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
10250 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
10260 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
10270 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  eq(pParse, pList
10280 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
10290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
102a0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
102b0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
102c0 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
102d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
102e0 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
102f0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20  ->pDfltColl; .  
10300 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10310 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
10320 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20  llSeq, 0, 0, 0, 
10330 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
10340 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
10350 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10360 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
10370 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73  P_Function, cons
10380 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65  tMask, r1, targe
10390 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
103a0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
103b0 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44  *)pDef, P4_FUNCD
103c0 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EF);.      sqlit
103d0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
103e0 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , nExpr);.      
103f0 69 66 28 20 6e 45 78 70 72 20 29 7b 0a 20 20 20  if( nExpr ){.   
10400 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
10410 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
10420 72 73 65 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b  rse, r1, nExpr);
10430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
10440 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
10450 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
10460 61 72 73 65 2c 20 72 31 2c 20 6e 45 78 70 72 29  arse, r1, nExpr)
10470 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10480 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
10490 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
104a0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
104b0 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
104c0 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
104d0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
104e0 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
104f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
10500 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
10510 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
10520 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20  Column==0 ){.   
10530 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
10540 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
10550 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a  , pExpr, 0, 0);.
10560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
10570 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Reg = pExpr->iCo
10580 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 62 72 65 61  lumn;.      brea
10590 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
105a0 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
105b0 20 69 6e 74 20 72 4e 6f 74 46 6f 75 6e 64 20 3d   int rNotFound =
105c0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 4d   0;.      int rM
105d0 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
105e0 20 20 20 20 20 20 69 6e 74 20 6a 32 2c 20 6a 33        int j2, j3
105f0 2c 20 6a 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20  , j4, j5;.      
10600 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
10610 20 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a       int eType;.
10620 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  .      VdbeNoopC
10630 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
10640 6e 20 49 4e 20 65 78 70 72 20 72 25 64 22 2c 20  n IN expr r%d", 
10650 74 61 72 67 65 74 29 29 3b 0a 20 20 20 20 20 20  target));.      
10660 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
10670 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
10680 65 2c 20 70 45 78 70 72 2c 20 26 72 4d 61 79 48  e, pExpr, &rMayH
10690 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  aveNull);.      
106a0 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  if( rMayHaveNull
106b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 4e 6f 74   ){.        rNot
106c0 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65  Found = ++pParse
106d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->nMem;.      }.
106e0 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65  .      /* Figure
106f0 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74   out the affinit
10700 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61  y to use to crea
10710 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68  te a key from th
10720 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
10730 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ** of the expres
10740 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74  sion. affinitySt
10750 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69  r stores a stati
10760 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c  c string suitabl
10770 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50  e for.      ** P
10780 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4 of OP_MakeReco
10790 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rd..      */.   
107a0 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f     affinity = co
107b0 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
107c0 28 70 45 78 70 72 29 3b 0a 0a 0a 20 20 20 20 20  (pExpr);...     
107d0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78   /* Code the <ex
107e0 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
107f0 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20   IN (...)". The 
10800 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
10810 20 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e        ** pExpr->
10820 69 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20  iTable contains 
10830 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
10840 6d 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e  make up the (...
10850 29 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ) set..      */.
10860 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
10870 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b  sableColCache++;
10880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10890 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
108a0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
108b0 67 65 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  get);.      pPar
108c0 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
108d0 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 6a 32 20  che--;.      j2 
108e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
108f0 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
10900 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
10910 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
10920 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
10930 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74        j3 = sqlit
10940 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
10950 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 74 61  OP_MustBeInt, ta
10960 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a  rget);.        j
10970 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  4 = sqlite3VdbeA
10980 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
10990 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54  xists, pExpr->iT
109a0 61 62 6c 65 2c 20 30 2c 20 74 61 72 67 65 74 29  able, 0, target)
109b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
109c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
109d0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
109e0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a  rget);.        j
109f0 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  5 = sqlite3VdbeA
10a00 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
10a10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10a20 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10a30 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , j3);.        s
10a40 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10a50 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20  re(v, j4);.     
10a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10a70 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
10a80 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  er, 0, target);.
10a90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10aa0 20 20 20 20 20 72 32 20 3d 20 72 65 67 46 72 65       r2 = regFre
10ab0 65 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  e2 = sqlite3GetT
10ac0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
10ad0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61  .        /* Crea
10ae0 74 65 20 61 20 72 65 63 6f 72 64 20 61 6e 64 20  te a record and 
10af0 74 65 73 74 20 66 6f 72 20 73 65 74 20 6d 65 6d  test for set mem
10b00 62 65 72 73 68 69 70 2e 20 49 66 20 74 68 65 20  bership. If the 
10b10 73 65 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  set contains.   
10b20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
10b30 65 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  e, then jump to 
10b40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74  the end of the t
10b50 65 73 74 20 63 6f 64 65 2e 20 54 68 65 20 74 61  est code. The ta
10b60 72 67 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  rget.        ** 
10b70 72 65 67 69 73 74 65 72 20 73 74 69 6c 6c 20 63  register still c
10b80 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 72 75 65  ontains the true
10b90 20 28 31 29 20 76 61 6c 75 65 20 77 72 69 74 74   (1) value writt
10ba0 65 6e 20 74 6f 20 69 74 20 65 61 72 6c 69 65 72  en to it earlier
10bb0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
10bc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10bd0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
10be0 65 52 65 63 6f 72 64 2c 20 74 61 72 67 65 74 2c  eRecord, target,
10bf0 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74   1, r2, &affinit
10c00 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  y, 1);.        s
10c10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10c20 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10c30 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
10c40 20 20 20 20 6a 35 20 3d 20 73 71 6c 69 74 65 33      j5 = sqlite3
10c50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10c60 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
10c70 54 61 62 6c 65 2c 20 30 2c 20 72 32 29 3b 0a 0a  Table, 0, r2);..
10c80 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
10c90 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  e set membership
10ca0 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65   test fails, the
10cb0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
10cc0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
10cd0 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70  "x IN (...)" exp
10ce0 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
10cf0 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c  either 0 or NULL
10d00 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20  . If the set.   
10d10 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
10d20 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c   no NULL values,
10d30 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
10d40 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65   is 0. If the se
10d50 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  t .        ** co
10d60 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
10d70 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  re NULL values, 
10d80 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
10d90 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
10da0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  * expression is 
10db0 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  also NULL..     
10dc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
10dd0 28 20 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 20 29  ( rNotFound==0 )
10de0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
10df0 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
10e00 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61  if it is known a
10e10 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 28  t compile time (
10e20 6e 6f 77 29 20 74 68 61 74 20 0a 20 20 20 20 20  now) that .     
10e30 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 74 20       ** the set 
10e40 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
10e50 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61   values. This ha
10e60 70 70 65 6e 73 20 61 73 20 74 68 65 20 72 65 73  ppens as the res
10e70 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ult.          **
10e80 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22   of a "NOT NULL"
10e90 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74   constraint in t
10ea0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
10eb0 6d 61 2e 20 4e 6f 20 6e 65 65 64 0a 20 20 20 20  ma. No need.    
10ec0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
10ed0 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
10ee0 75 72 65 20 61 74 20 72 75 6e 74 69 6d 65 20 69  ure at runtime i
10ef0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
10f00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10f20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
10f30 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ger, 0, target);
10f40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
10f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
10f60 73 20 62 6c 6f 63 6b 20 70 6f 70 75 6c 61 74 65  s block populate
10f70 73 20 74 68 65 20 72 4e 6f 74 46 6f 75 6e 64 20  s the rNotFound 
10f80 72 65 67 69 73 74 65 72 20 77 69 74 68 20 65 69  register with ei
10f90 74 68 65 72 20 4e 55 4c 4c 0a 20 20 20 20 20 20  ther NULL.      
10fa0 20 20 20 20 2a 2a 20 6f 72 20 30 20 28 61 6e 20      ** or 0 (an 
10fb0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29 2e 20  integer value). 
10fc0 49 66 20 74 68 65 20 64 61 74 61 20 73 74 72 75  If the data stru
10fd0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6f  cture contains o
10fe0 6e 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ne.          ** 
10ff0 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 73 2c 20 74  or more NULLs, t
11000 68 65 6e 20 73 65 74 20 72 4e 6f 74 46 6f 75 6e  hen set rNotFoun
11010 64 20 74 6f 20 4e 55 4c 4c 2e 20 4f 74 68 65 72  d to NULL. Other
11020 77 69 73 65 2c 20 73 65 74 20 69 74 0a 20 20 20  wise, set it.   
11030 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 30 2e 20         ** to 0. 
11040 49 66 20 72 65 67 69 73 74 65 72 20 72 4d 61 79  If register rMay
11050 48 61 76 65 4e 75 6c 6c 20 69 73 20 61 6c 72 65  HaveNull is alre
11060 61 64 79 20 73 65 74 20 74 6f 20 73 6f 6d 65 20  ady set to some 
11070 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20 20  value.          
11080 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 4e 55  ** other than NU
11090 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 74 65 73  LL, then the tes
110a0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
110b0 65 6e 20 72 75 6e 20 61 6e 64 20 0a 20 20 20 20  en run and .    
110c0 20 20 20 20 20 20 2a 2a 20 72 4e 6f 74 46 6f 75        ** rNotFou
110d0 6e 64 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  nd is already po
110e0 70 75 6c 61 74 65 64 2e 0a 20 20 20 20 20 20 20  pulated..       
110f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
11100 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
11110 72 20 6e 75 6c 6c 52 65 63 6f 72 64 5b 5d 20 3d  r nullRecord[] =
11120 20 7b 20 30 78 30 32 2c 20 30 78 30 30 20 7d 3b   { 0x02, 0x00 };
11130 0a 20 20 20 20 20 20 20 20 20 20 6a 33 20 3d 20  .          j3 = 
11140 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11150 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
11160 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a   rMayHaveNull);.
11170 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11180 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11190 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4e 6f 74 46  P_Null, 0, rNotF
111a0 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ound);.         
111b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
111c0 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 32  p4(v, OP_Blob, 2
111d0 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20  , rMayHaveNull, 
111e0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11200 20 6e 75 6c 6c 52 65 63 6f 72 64 2c 20 50 34 5f   nullRecord, P4_
11210 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
11220 20 20 20 6a 34 20 3d 20 73 71 6c 69 74 65 33 56     j4 = sqlite3V
11230 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11240 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
11250 61 62 6c 65 2c 20 30 2c 20 72 4d 61 79 48 61 76  able, 0, rMayHav
11260 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  eNull);.        
11270 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11280 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
11290 72 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29  r, 0, rNotFound)
112a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
112b0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
112c0 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 20 20  v, j4);.        
112d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
112e0 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 0a 20  pHere(v, j3);.. 
112f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
11300 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 72 65   the value of re
11310 67 69 73 74 65 72 20 72 4e 6f 74 46 6f 75 6e 64  gister rNotFound
11320 20 28 77 68 69 63 68 20 69 73 20 65 69 74 68 65   (which is eithe
11330 72 20 4e 55 4c 4c 20 6f 72 20 30 29 0a 20 20 20  r NULL or 0).   
11340 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74         ** into t
11350 68 65 20 74 61 72 67 65 74 20 72 65 67 69 73 74  he target regist
11360 65 72 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65  er. This will be
11370 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
11380 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
11390 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 20 20  expression..    
113a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
113b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
113c0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
113d0 20 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 72 67   rNotFound, targ
113e0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
113f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
11400 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11410 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 20 20 73  (v, j2);.      s
11420 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
11430 72 65 28 76 2c 20 6a 35 29 3b 0a 20 20 20 20 20  re(v, j5);.     
11440 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11450 20 22 65 6e 64 20 49 4e 20 65 78 70 72 20 72 25   "end IN expr r%
11460 64 22 2c 20 74 61 72 67 65 74 29 29 3b 0a 20 20  d", target));.  
11470 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11480 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 0a 20  .#endif.    /*. 
11490 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45     **    x BETWE
114a0 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a  EN y AND z.    *
114b0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  *.    ** This is
114c0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
114d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
114e0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20  x>=y AND x<=z.  
114f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73    **.    ** X is
11500 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
11510 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
11520 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Y is stored in p
11530 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
11540 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20  ].pExpr..    ** 
11550 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Z is stored in p
11560 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
11570 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a  ].pExpr..    */.
11580 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
11590 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
115a0 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
115b0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73  ->pLeft;.      s
115c0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
115d0 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45  tem *pLItem = pE
115e0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20  xpr->pList->a;. 
115f0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
11600 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
11610 72 3b 0a 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  r;..      codeCo
11620 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50  mpareOperands(pP
11630 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 31  arse, pLeft, &r1
11640 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20  , &regFree1,.   
11650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11670 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67  Right, &r2, &reg
11680 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65  Free2);.      te
11690 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
116a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
116b0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
116c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d  =0 );.      r3 =
116d0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
116e0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
116f0 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65    r4 = sqlite3Ge
11700 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11710 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
11720 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
11730 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65  t, pRight, OP_Ge
11740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11750 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20      r1, r2, r3, 
11760 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
11770 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b  .      pLItem++;
11780 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
11790 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
117a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
117b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
117c0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
117d0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
117e0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
117f0 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65  rse, pRight, &re
11800 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74  gFree2);.      t
11810 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
11820 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  2==0 );.      co
11830 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
11840 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
11850 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20   OP_Le, r1, r2, 
11860 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r4, SQLITE_STORE
11870 50 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  P2);.      sqlit
11880 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11890 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20  OP_And, r3, r4, 
118a0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
118b0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
118c0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
118d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
118e0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
118f0 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20  arse, r4);.     
11900 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11910 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
11920 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
11930 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11940 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
11950 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
11960 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
11970 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
11980 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
11990 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
119a0 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
119b0 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
119c0 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
119d0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
119e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
119f0 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
11a00 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
11a10 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
11a20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
11a30 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
11a40 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
11a50 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
11a60 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
11a70 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
11a80 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
11a90 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
11aa0 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
11ab0 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
11ac0 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
11ad0 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
11ae0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
11af0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
11b00 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
11b10 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
11b20 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
11b30 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 52   is in pExpr->pR
11b40 69 67 68 74 2e 20 20 54 68 65 20 59 20 69 73 20  ight.  The Y is 
11b50 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  also optional.  
11b60 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20  If there is no. 
11b70 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75 73     ** ELSE claus
11b80 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 74  e and no other t
11b90 65 72 6d 20 6d 61 74 63 68 65 73 2c 20 74 68 65  erm matches, the
11ba0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
11bb0 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 73  the.    ** exprs
11bc0 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sion is NULL..  
11bd0 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
11be0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
11bf0 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
11c00 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
11c10 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
11c20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
11c30 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11c40 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
11c50 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
11c60 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
11c70 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
11c80 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
11c90 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
11ca0 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
11cb0 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
11cc0 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
11cd0 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b   case TK_CASE: {
11ce0 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61  .      int endLa
11cf0 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
11d00 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
11d10 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f   label for end o
11d20 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20  f CASE stmt */. 
11d30 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73       int nextCas
11d40 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
11d50 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
11d60 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48  abel for next WH
11d70 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  EN clause */.   
11d80 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20     int nExpr;   
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65       /* 2x numbe
11db0 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  r of WHEN terms 
11dc0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11df0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11e00 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
11e10 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
11e20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
11e30 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
11e40 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
11e50 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74  List_item *aList
11e60 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20  elem;  /* Array 
11e70 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
11e80 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f  .      Expr opCo
11e90 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20  mpare;          
11ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11eb0 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e  X==Ei expression
11ec0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 63   */.      Expr c
11ed0 61 63 68 65 58 3b 20 20 20 20 20 20 20 20 20 20  acheX;          
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
11ef0 61 63 68 65 64 20 65 78 70 72 65 73 73 69 6f 6e  ached expression
11f00 20 58 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72   X */.      Expr
11f10 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f30 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f   The X expressio
11f40 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
11f50 2a 70 54 65 73 74 3b 20 20 20 20 20 20 20 20 20  *pTest;         
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11f70 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f  X==Ei (form A) o
11f80 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20  r just Ei (form 
11f90 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  B) */..      ass
11fa0 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
11fb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11fc0 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e  (pExpr->pList->n
11fd0 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b  Expr % 2) == 0);
11fe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
11ff0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
12000 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
12010 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
12020 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74  ist;.      aList
12030 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61  elem = pEList->a
12040 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
12050 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
12060 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20       endLabel = 
12070 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
12080 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
12090 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e  f( (pX = pExpr->
120a0 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
120b0 20 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a 70       cacheX = *p
120c0 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  X;.        testc
120d0 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
120e0 43 4f 4c 55 4d 4e 20 7c 7c 20 70 58 2d 3e 6f 70  COLUMN || pX->op
120f0 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
12100 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e  .        cacheX.
12110 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  iTable = sqlite3
12120 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
12130 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65  rse, pX, &regFre
12140 65 31 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  e1);.        tes
12150 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
12160 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61  =0 );.        ca
12170 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47  cheX.op = TK_REG
12180 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20 20 6f  ISTER;.        o
12190 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b  pCompare.op = TK
121a0 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  _EQ;.        opC
121b0 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26  ompare.pLeft = &
121c0 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20 20 20  cacheX;.        
121d0 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61  pTest = &opCompa
121e0 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  re;.      }.    
121f0 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
12200 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20  eColCache++;.   
12210 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
12220 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  xpr; i=i+2){.   
12230 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20       if( pX ){. 
12240 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
12250 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
12260 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
12270 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
12280 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
12290 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
122a0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
122b0 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
122c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
122d0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
122e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
122f0 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  st->op==TK_COLUM
12300 4e 20 7c 7c 20 70 54 65 73 74 2d 3e 6f 70 3d 3d  N || pTest->op==
12310 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
12320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
12330 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
12340 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
12350 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
12360 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
12370 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
12380 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
12390 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
123a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
123b0 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
123c0 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52  .pExpr->op==TK_R
123d0 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
123e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
123f0 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
12400 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
12410 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
12420 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12430 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
12440 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  0, endLabel);.  
12450 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12460 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
12470 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20   nextCase);.    
12480 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
12490 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
124a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
124b0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
124c0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 74 61  Expr->pRight, ta
124d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  rget);.      }el
124e0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
124f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12500 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
12510 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
12520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
12530 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
12540 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
12550 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
12560 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e  disableColCache>
12570 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  0 );.      pPars
12580 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
12590 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61  he--;.      brea
125a0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
125b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
125c0 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
125d0 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
125e0 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69  if( !pParse->tri
125f0 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  gStack ){.      
12600 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12610 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12630 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
12640 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
12650 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
12660 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
12670 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
12680 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
12690 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67  ->iColumn!=OE_Ig
126a0 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
126b0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
126c0 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c  iColumn==OE_Roll
126d0 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20  back ||.        
126e0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
126f0 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62  iColumn == OE_Ab
12700 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ort ||.         
12710 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
12720 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69  Column == OE_Fai
12730 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  l );.         sq
12740 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
12750 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
12760 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12770 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61  eAddOp4(v, OP_Ha
12780 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
12790 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43  RAINT, pExpr->iC
127a0 6f 6c 75 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20  olumn, 0,.      
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127c0 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e    (char*)pExpr->
127d0 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
127e0 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
127f0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
12800 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
12810 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49  >iColumn == OE_I
12820 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20 20 20  gnore );.       
12830 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12840 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78  Op2(v, OP_Contex
12850 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tPop, 0, 0);.   
12860 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12870 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12880 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74  to, 0, pParse->t
12890 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65  rigStack->ignore
128a0 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Jump);.         
128b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
128c0 22 72 61 69 73 65 28 49 47 4e 4f 52 45 29 22 29  "raise(IGNORE)")
128d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
128e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
128f0 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
12900 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12910 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
12920 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
12930 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
12940 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
12950 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
12960 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
12970 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
12980 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
12990 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
129a0 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20  sults.** into a 
129b0 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72  register.  Retur
129c0 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  n the register n
129d0 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20  umber where the 
129e0 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73  results.** are s
129f0 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tored..**.** If 
12a00 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20  the register is 
12a10 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  a temporary regi
12a20 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65  ster that can be
12a30 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a   deallocated,.**
12a40 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20   then write its 
12a50 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65  number into *pRe
12a60 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  g.  If the resul
12a70 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  t register is no
12a80 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  t.** a temporary
12a90 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67  , then set *pReg
12aa0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74   to zero..*/.int
12ab0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12ac0 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72  Temp(Parse *pPar
12ad0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
12ae0 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69   int *pReg){.  i
12af0 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
12b00 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
12b10 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20 73 71  );.  int r2 = sq
12b20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
12b30 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
12b40 72 2c 20 72 31 29 3b 0a 20 20 69 66 28 20 72 32  r, r1);.  if( r2
12b50 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70 52 65  ==r1 ){.    *pRe
12b60 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b  g = r1;.  }else{
12b70 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
12b80 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
12b90 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70 52 65  e, r1);.    *pRe
12ba0 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  g = 0;.  }.  ret
12bb0 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn r2;.}../*.**
12bc0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12bd0 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
12be0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
12bf0 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
12c00 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
12c10 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
12c20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
12c30 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
12c40 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
12c50 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a  ster target..*/.
12c60 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
12c70 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
12c80 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
12c90 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
12ca0 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73  nt inReg;..  ass
12cb0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
12cc0 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
12cd0 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e 52 65 67  >nMem );.  inReg
12ce0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
12cf0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
12d00 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
12d10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
12d20 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50 61 72  e->pVdbe || pPar
12d30 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
12d40 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 69 6e  iled );.  if( in
12d50 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70  Reg!=target && p
12d60 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
12d70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12d80 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
12d90 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  dbe, OP_SCopy, i
12da0 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
12db0 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61 72 67   }.  return targ
12dc0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  et;.}../*.** Gen
12dd0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
12de0 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69 76  evalutes the giv
12df0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
12e00 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
12e10 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
12e20 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
12e30 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
12e40 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
12e50 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
12e60 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
12e70 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
12e80 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
12e90 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
12ea0 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
12eb0 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
12ec0 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
12ed0 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
12ee0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
12ef0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12f00 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
12f10 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
12f20 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
12f30 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
12f40 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
12f50 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
12f60 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
12f70 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
12f80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12f90 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
12fa0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12fb0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
12fc0 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
12fd0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
12fe0 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67  dbe;.  int inReg
12ff0 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  ;.  inReg = sqli
13000 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
13010 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
13020 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61  t);.  assert( ta
13030 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
13040 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
13050 47 49 53 54 45 52 20 29 7b 20 20 0a 20 20 20 20  GISTER ){  .    
13060 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20 69 4d  int iMem;.    iM
13070 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
13080 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
13090 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
130a0 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 69 4d  _Copy, inReg, iM
130b0 65 6d 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  em);.    pExpr->
130c0 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20  iTable = iMem;. 
130d0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
130e0 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a  K_REGISTER;.  }.
130f0 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
13100 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
13110 54 52 55 45 20 69 66 20 70 45 78 70 72 20 69 73  TRUE if pExpr is
13120 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20 65 78 70   an constant exp
13130 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
13140 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 66  appropriate.** f
13150 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74  or factoring out
13160 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20 41 70 70   of a loop.  App
13170 72 6f 70 72 69 61 74 65 20 65 78 70 72 65 73 73  ropriate express
13180 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ions are:.**.** 
13190 20 20 20 2a 20 20 41 6e 79 20 65 78 70 72 65 73     *  Any expres
131a0 73 69 6f 6e 20 74 68 61 74 20 65 76 61 6c 75 61  sion that evalua
131b0 74 65 73 20 74 6f 20 74 77 6f 20 6f 72 20 6d 6f  tes to two or mo
131c0 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a  re opcodes..**.*
131d0 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f 50 5f 49  *    *  Any OP_I
131e0 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65 61 6c 2c  nteger, OP_Real,
131f0 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f 50 5f 42   OP_String, OP_B
13200 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a  lob, OP_Null, .*
13210 2a 20 20 20 20 20 20 20 6f 72 20 4f 50 5f 56 61  *       or OP_Va
13220 72 69 61 62 6c 65 20 74 68 61 74 20 64 6f 65 73  riable that does
13230 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
13240 70 6c 61 63 65 64 20 69 6e 20 61 20 0a 2a 2a 20  placed in a .** 
13250 20 20 20 20 20 20 73 70 65 63 69 66 69 63 20 72        specific r
13260 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
13270 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
13280 20 69 6e 20 66 61 63 74 6f 72 69 6e 67 20 6f 75   in factoring ou
13290 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63  t single-instruc
132a0 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  tion constant.**
132b0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
132c0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61  t need to be pla
132d0 63 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75  ced in a particu
132e0 6c 61 72 20 72 65 67 69 73 74 65 72 2e 20 20 0a  lar register.  .
132f0 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66 61 63 74  ** We could fact
13300 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20 62 75 74  or them out, but
13310 20 74 68 65 6e 20 77 65 20 77 6f 75 6c 64 20 65   then we would e
13320 6e 64 20 75 70 20 61 64 64 69 6e 67 20 61 6e 0a  nd up adding an.
13330 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69 6e 73 74  ** OP_SCopy inst
13340 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ruction to move 
13350 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  the value into t
13360 68 65 20 63 6f 72 72 65 63 74 20 72 65 67 69 73  he correct regis
13370 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e 20 20 57  ter.** later.  W
13380 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20  e might as well 
13390 6a 75 73 74 20 75 73 65 20 74 68 65 20 6f 72 69  just use the ori
133a0 67 69 6e 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  ginal instructio
133b0 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69 64 20 74  n and.** avoid t
133c0 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a  he OP_SCopy..*/.
133d0 73 74 61 74 69 63 20 69 6e 74 20 69 73 41 70 70  static int isApp
133e0 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f  ropriateForFacto
133f0 72 69 6e 67 28 45 78 70 72 20 2a 70 29 7b 0a 20  ring(Expr *p){. 
13400 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
13410 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
13420 69 6e 28 70 29 20 29 7b 0a 20 20 20 20 72 65 74  in(p) ){.    ret
13430 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e 6c 79 20  urn 0;  /* Only 
13440 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
13450 69 6f 6e 73 20 61 72 65 20 61 70 70 72 6f 70 72  ions are appropr
13460 69 61 74 65 20 66 6f 72 20 66 61 63 74 6f 72 69  iate for factori
13470 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
13480 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46  (p->flags & EP_F
13490 69 78 65 64 44 65 73 74 29 3d 3d 30 20 29 7b 0a  ixedDest)==0 ){.
134a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f      return 1;  /
134b0 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e 74 20 77  * Any constant w
134c0 69 74 68 6f 75 74 20 61 20 66 69 78 65 64 20 64  ithout a fixed d
134d0 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 70  estination is ap
134e0 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 20 20 7d  propriate */.  }
134f0 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
13500 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 20 3d 20  =TK_UPLUS ) p = 
13510 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73 77 69 74  p->pLeft;.  swit
13520 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 23 69 66  ch( p->op ){.#if
13530 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13540 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
13550 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a    case TK_BLOB:.
13560 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
13570 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
13580 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
13590 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
135a0 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
135b0 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  _NULL:.    case 
135c0 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
135d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
135e0 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29 3b 0a 20  op==TK_BLOB );. 
135f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
13600 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
13610 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
13620 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ase( p->op==TK_I
13630 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
13640 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
13650 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a 20 20 20  =TK_FLOAT );.   
13660 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
13670 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 3b 0a 20  op==TK_NULL );. 
13680 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
13690 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
136a0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6e 67  );.      /* Sing
136b0 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  le-instruction c
136c0 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 61 20  onstants with a 
136d0 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f  fixed destinatio
136e0 6e 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 62  n are.      ** b
136f0 65 74 74 65 72 20 64 6f 6e 65 20 69 6e 2d 6c 69  etter done in-li
13700 6e 65 2e 20 20 49 66 20 77 65 20 66 61 63 74 6f  ne.  If we facto
13710 72 20 74 68 65 6d 2c 20 74 68 65 79 20 77 69 6c  r them, they wil
13720 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20 20 20 20  l just end.     
13730 20 2a 2a 20 75 70 20 67 65 6e 65 72 61 74 69 6e   ** up generatin
13740 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79 20 74 6f  g an OP_SCopy to
13750 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20   move the value 
13760 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  to the destinati
13770 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 69  on.      ** regi
13780 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 72  ster. */.      r
13790 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
137a0 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
137b0 53 3a 20 7b 0a 20 20 20 20 20 20 20 69 66 28 20  S: {.       if( 
137c0 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  p->pLeft->op==TK
137d0 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70 4c 65  _FLOAT || p->pLe
137e0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
137f0 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72  ER ){.         r
13800 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
13810 7d 0a 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }.       break;.
13820 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
13830 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  t: {.      break
13840 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
13850 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
13860 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
13870 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
13880 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
13890 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61  priate for.** fa
138a0 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61  ctoring out of a
138b0 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c   loop, then eval
138c0 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
138d0 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  ion.** into a re
138e0 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65  gister and conve
138f0 72 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  rt the expressio
13900 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49  n into a TK_REGI
13910 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69  STER.** expressi
13920 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
13930 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28  t evalConstExpr(
13940 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
13950 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
13960 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
13970 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
13980 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
13990 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
139a0 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
139b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
139c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
139d0 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
139e0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
139f0 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
13a00 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b  TK_CONST_FUNC: {
13a10 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72  .      /* The ar
13a20 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e  guments to a fun
13a30 63 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78  ction have a fix
13a40 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  ed destination..
13a50 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68        ** Mark th
13a60 65 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20 61  em this way to a
13a70 76 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20 75  void generated u
13a80 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79  nneeded OP_SCopy
13a90 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  .      ** instru
13aa0 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a  ctions. .      *
13ab0 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
13ac0 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
13ad0 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 66  >pList;.      if
13ae0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
13af0 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
13b00 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
13b10 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
13b20 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
13b30 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
13b40 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c   for(; i>0; i--,
13b50 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
13b60 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
13b70 70 45 78 70 72 20 29 20 70 49 74 65 6d 2d 3e 70  pExpr ) pItem->p
13b80 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Expr->flags |= E
13b90 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20  P_FixedDest;.   
13ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13bb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13bc0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70  }.  }.  if( isAp
13bd0 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74  propriateForFact
13be0 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a  oring(pExpr) ){.
13bf0 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70      int r1 = ++p
13c00 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
13c10 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20   int r2;.    r2 
13c20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
13c30 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
13c40 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
13c50 69 66 28 20 72 31 21 3d 72 32 20 29 20 73 71 6c  if( r1!=r2 ) sql
13c60 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13c70 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
13c80 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
13c90 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
13ca0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
13cb0 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   r2;.    return 
13cc0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
13cd0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
13ce0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  inue;.}../*.** P
13cf0 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74  reevaluate const
13d00 61 6e 74 20 73 75 62 65 78 70 72 65 73 73 69 6f  ant subexpressio
13d10 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70 72 20  ns within pExpr 
13d20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
13d30 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
13d40 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70  sters.  Modify p
13d50 45 78 70 72 20 73 6f 20 74 68 61 74 20 74 68 65  Expr so that the
13d60 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70   constant subexp
13d70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54  resions.** are T
13d80 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64  K_REGISTER opcod
13d90 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
13da0 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64   the precomputed
13db0 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64   values..*/.void
13dc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13dd0 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20  Constants(Parse 
13de0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
13df0 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
13e00 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
13e10 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74  back = evalConst
13e20 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Expr;.  w.xSelec
13e30 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tCallback = 0;. 
13e40 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
13e50 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
13e60 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
13e70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
13e80 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
13e90 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
13ea0 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
13eb0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
13ec0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
13ed0 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
13ee0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
13ef0 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
13f00 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
13f10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
13f20 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
13f30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13f40 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
13f50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13f60 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
13f70 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
13f80 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
13f90 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
13fa0 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
13fb0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
13fc0 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
13fd0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
13fe0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
13ff0 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20 20 2f  doHardCopy     /
14000 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20 63 6f  * Make a hard co
14010 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  py of every elem
14020 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ent */.){.  stru
14030 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
14040 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
14050 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
14060 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
14070 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
14080 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
14090 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
140a0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
140b0 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
140c0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  +){.    if( pIte
140d0 6d 2d 3e 69 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->iAlias ){.   
140e0 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20 63 6f     int iReg = co
140f0 64 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20  deAlias(pParse, 
14100 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 2c 20 70  pItem->iAlias, p
14110 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61 72  Item->pExpr, tar
14120 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  get+i);.      Vd
14130 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
14140 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14150 20 20 20 20 20 20 69 66 28 20 69 52 65 67 21 3d        if( iReg!=
14160 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
14170 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14180 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
14190 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74 2b  y, iReg, target+
141a0 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
141b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
141c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
141d0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
141e0 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
141f0 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 48 61    }.    if( doHa
14200 72 64 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20  rdCopy ){.      
14210 73 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43  sqlite3ExprHardC
14220 6f 70 79 28 70 50 61 72 73 65 2c 20 74 61 72 67  opy(pParse, targ
14230 65 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  et, n);.    }.  
14240 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
14250 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14260 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
14270 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
14280 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
14290 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
142a0 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
142b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
142c0 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
142d0 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
142e0 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
142f0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
14300 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
14310 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
14320 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
14330 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
14340 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
14350 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
14360 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
14370 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
14380 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
14390 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  LL..**.** This c
143a0 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
143b0 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
143c0 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
143d0 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
143e0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
143f0 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
14400 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
14410 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
14420 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
14430 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
14440 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
14450 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
14460 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
14470 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
14480 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
14490 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
144a0 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
144b0 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
144c0 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
144d0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
144e0 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
144f0 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
14500 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
14510 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
14520 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
14530 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
14540 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
14550 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
14560 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
14570 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
14580 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
14590 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
145a0 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
145b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
145c0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
145d0 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
145e0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  );.  if( v==0 ||
145f0 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
14600 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72  rn;.  op = pExpr
14610 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
14620 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
14630 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
14640 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
14650 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14660 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14670 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
14680 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14690 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
146a0 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a  eColCache==0 );.
146b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
146c0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
146d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
146e0 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  2,jumpIfNull^SQL
146f0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
14700 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
14710 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
14720 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14730 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
14740 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
14750 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
14760 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
14770 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
14780 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20  eColCache>0 );. 
14790 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
147a0 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  ableColCache--;.
147b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
147c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
147d0 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
147e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
147f0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
14800 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
14810 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
14820 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 72    testcase( pPar
14830 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
14840 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  che==0 );.      
14850 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
14860 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
14870 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
14880 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
14890 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
148a0 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20  ColCache++;.    
148b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
148c0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
148d0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
148e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
148f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
14900 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
14910 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70  che>0 );.      p
14920 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
14930 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20  lCache--;.      
14940 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14950 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
14960 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14970 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
14980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14990 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
149a0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
149b0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
149c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
149d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
149e0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
149f0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
14a00 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
14a10 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
14a20 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
14a30 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
14a40 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
14a50 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
14a60 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
14a70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14a80 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
14a90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14aa0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
14ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14ac0 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
14ad0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
14ae0 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
14af0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14b00 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_LT );.      t
14b10 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14b20 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
14b30 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20  case( op==TK_GT 
14b40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14b50 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  e( op==TK_GE );.
14b60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14b70 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
14b80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14b90 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
14ba0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
14bb0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
14bc0 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72   codeCompareOper
14bd0 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 45 78  ands(pParse, pEx
14be0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20  pr->pLeft, &r1, 
14bf0 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20  &regFree1,.     
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
14c20 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 32 2c  pr->pRight, &r2,
14c30 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
14c40 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
14c50 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14c60 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
14c70 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
14c80 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
14c90 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
14ca0 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ll);.      testc
14cb0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
14cc0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14cd0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
14ce0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14cf0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14d00 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
14d10 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
14d20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14d30 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
14d40 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
14d50 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
14d60 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
14d70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14d80 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
14d90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14da0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
14db0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
14dc0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14dd0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14de0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
14df0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14e00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
14e10 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
14e20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14e30 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14e40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14e50 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
14e60 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20  EN: {.      /*  
14e70 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
14e80 44 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  D z.      **.   
14e90 20 20 20 2a 2a 20 49 73 20 65 71 75 69 76 61 6c     ** Is equival
14ea0 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
14eb0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d  .      **    x>=
14ec0 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20  y AND x<=z.     
14ed0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64   **.      ** Cod
14ee0 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
14ef0 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
14f00 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
14f10 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a  pression.      *
14f20 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  * elementation o
14f30 66 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  f x..      */.  
14f40 20 20 20 20 45 78 70 72 20 65 78 70 72 41 6e 64      Expr exprAnd
14f50 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d  ;.      Expr com
14f60 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70  pLeft;.      Exp
14f70 72 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20  r compRight;.   
14f80 20 20 20 45 78 70 72 20 65 78 70 72 58 3b 0a 0a     Expr exprX;..
14f90 20 20 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70        exprX = *p
14fa0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
14fb0 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20     exprAnd.op = 
14fc0 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78  TK_AND;.      ex
14fd0 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
14fe0 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ompLeft;.      e
14ff0 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
15000 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20  &compRight;.    
15010 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20    compLeft.op = 
15020 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d  TK_GE;.      com
15030 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
15040 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
15050 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
15060 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
15070 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 63 6f  .pExpr;.      co
15080 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
15090 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  LE;.      compRi
150a0 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
150b0 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  rX;.      compRi
150c0 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
150d0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
150e0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70  pExpr;.      exp
150f0 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  rX.iTable = sqli
15100 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15110 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
15120 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
15130 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15140 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
15150 20 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52   exprX.op = TK_R
15160 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 74  EGISTER;.      t
15170 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
15180 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
15190 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
151a0 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
151b0 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
151c0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
151d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
151e0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
151f0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
15200 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15210 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
15220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15230 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15240 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  _If, r1, dest, j
15250 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
15260 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15270 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
15280 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
15290 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
152a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
152b0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
152c0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
152d0 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
152e0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
152f0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15300 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a   regFree2);  .}.
15310 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15320 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
15330 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
15340 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
15350 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
15360 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
15370 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15380 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65  is false but exe
15390 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
153a0 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
153b0 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
153c0 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  ion is true..**.
153d0 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
153e0 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
153f0 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
15400 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20  true nor false) 
15410 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20  then.** jump if 
15420 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51  jumpIfNull is SQ
15430 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
15440 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
15450 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a  if jumpIfNull.**
15460 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73   is 0..*/.void s
15470 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
15480 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
15490 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
154a0 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
154b0 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
154c0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
154d0 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
154e0 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
154f0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
15500 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
15510 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
15520 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
15530 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
15540 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
15550 30 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  0 );.  if( v==0 
15560 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  || pExpr==0 ) re
15570 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  turn;..  /* The 
15580 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e  value of pExpr->
15590 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65  op and op are re
155a0 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
155b0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
155c0 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
155d0 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20         op.  **  
155e0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20       ---------  
155f0 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
15600 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  --.  **       TK
15610 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  _ISNULL         
15620 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a   OP_NotNull.  **
15630 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c         TK_NOTNUL
15640 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e  L         OP_IsN
15650 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
15660 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20  K_NE            
15670 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20    OP_Eq.  **    
15680 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20     TK_EQ        
15690 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a        OP_Ne.  **
156a0 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20         TK_GT    
156b0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a            OP_Le.
156c0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45    **       TK_LE
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
156e0 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Gt.  **       T
156f0 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20  K_GE            
15700 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20    OP_Lt.  **    
15710 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20     TK_LT        
15720 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a        OP_Ge.  **
15730 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20  .  ** For other 
15740 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d  values of pExpr-
15750 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66  >op, op is undef
15760 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e  ined and unused.
15770 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
15780 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
15790 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72  onstants are arr
157a0 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20  anged such that 
157b0 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70  we.  ** can comp
157c0 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ute the mapping 
157d0 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20  above using the 
157e0 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
157f0 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72  sion..  ** Asser
15800 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74  t()s verify that
15810 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
15820 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
15830 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72  /.  op = ((pExpr
15840 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26  ->op+(TK_ISNULL&
15850 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c  1))^1)-(TK_ISNUL
15860 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  L&1);..  /* Veri
15870 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e  fy correct align
15880 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20  ment of TK_ and 
15890 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20  OP_ constants.  
158a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
158b0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  pr->op!=TK_ISNUL
158c0 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e  L || op==OP_NotN
158d0 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
158e0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
158f0 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  OTNULL || op==OP
15900 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  _IsNull );.  ass
15910 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
15920 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_NE || op==OP_
15930 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Eq );.  assert( 
15940 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
15950 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b   || op==OP_Ne );
15960 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
15970 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f  ->op!=TK_LT || o
15980 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73  p==OP_Ge );.  as
15990 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
159a0 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LE || op==OP
159b0 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
159c0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
159d0 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  T || op==OP_Le )
159e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
159f0 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  r->op!=TK_GE || 
15a00 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20  op==OP_Lt );..  
15a10 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
15a20 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
15a30 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65  _AND: {.      te
15a40 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
15a50 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  ll==0 );.      t
15a60 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d  estcase( pParse-
15a70 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
15a80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
15a90 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
15aa0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15ab0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
15ac0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70  IfNull);.      p
15ad0 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
15ae0 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20  lCache++;.      
15af0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
15b00 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
15b10 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
15b20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
15b30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
15b40 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
15b50 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50  he>0 );.      pP
15b60 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
15b70 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62  Cache--;.      b
15b80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15b90 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
15ba0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
15bb0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15bc0 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
15bd0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
15be0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
15bf0 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
15c00 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d  isableColCache==
15c10 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
15c20 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
15c30 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15c40 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c  t, d2, jumpIfNul
15c50 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
15c60 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ULL);.      pPar
15c70 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
15c80 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  che++;.      sql
15c90 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
15ca0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15cb0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
15cc0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
15cd0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
15ce0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e  disableColCache>
15cf0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  0 );.      pPars
15d00 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
15d10 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71 6c 69  he--;.      sqli
15d20 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15d30 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
15d40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15d50 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
15d60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
15d70 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
15d80 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15d90 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
15da0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15db0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
15dc0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
15dd0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
15de0 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
15df0 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
15e00 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
15e10 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_EQ: {.      te
15e20 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
15e30 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
15e40 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
15e50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15e60 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
15e70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15e80 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
15e90 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15ea0 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
15eb0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15ec0 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  NE );.      test
15ed0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
15ee0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
15ef0 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73  eCompareOperands
15f00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15f10 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67  pLeft, &r1, &reg
15f20 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20  Free1,.         
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
15f50 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65  pRight, &r2, &re
15f60 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
15f70 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
15f80 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
15f90 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
15fa0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
15fb0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
15fc0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
15fd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15fe0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
15ff0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16000 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
16010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16020 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
16030 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
16040 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
16050 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
16060 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
16070 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
16080 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
16090 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
160a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
160b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
160c0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
160d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
160e0 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
160f0 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
16100 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
16110 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
16120 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16130 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
16140 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20  : {.      /*    
16150 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
16160 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  z.      **.     
16170 20 2a 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e   ** Is equivalen
16180 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20  t to .      **. 
16190 20 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20       **    x>=y 
161a0 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a  AND x<=z.      *
161b0 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20  *.      ** Code 
161c0 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69  it as such, taki
161d0 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68  ng care to do th
161e0 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72  e common subexpr
161f0 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ession.      ** 
16200 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  elementation of 
16210 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  x..      */.    
16220 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a    Expr exprAnd;.
16230 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c        Expr compL
16240 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
16250 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20  compRight;.     
16260 20 45 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20   Expr exprX;..  
16270 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78      exprX = *pEx
16280 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
16290 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
162a0 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72  _AND;.      expr
162b0 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
162c0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70  pLeft;.      exp
162d0 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
162e0 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ompRight;.      
162f0 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
16300 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  _GE;.      compL
16310 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
16320 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  rX;.      compLe
16330 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
16340 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
16350 45 78 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70  Expr;.      comp
16360 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45  Right.op = TK_LE
16370 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68  ;.      compRigh
16380 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
16390 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68  ;.      compRigh
163a0 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
163b0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
163c0 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58  xpr;.      exprX
163d0 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  .iTable = sqlite
163e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
163f0 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
16400 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
16410 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
16420 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  e1==0 );.      e
16430 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47  xprX.op = TK_REG
16440 49 53 54 45 52 3b 0a 20 20 20 20 20 20 74 65 73  ISTER;.      tes
16450 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
16460 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
16470 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
16480 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
16490 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
164a0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
164b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
164c0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31  ault: {.      r1
164d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
164e0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
164f0 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
16500 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16510 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16520 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
16530 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
16540 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16550 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16560 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16570 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
16580 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16590 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
165a0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
165b0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
165c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
165d0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
165e0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
165f0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
16600 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
16610 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
16620 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ees.  Return TRU
16630 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20  E (non-zero).** 
16640 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
16650 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e  tical and return
16660 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64   FALSE if they d
16670 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
16680 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  ..**.** Sometime
16690 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
166a0 69 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ill return FALSE
166b0 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f   even if the two
166c0 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
166d0 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76  really are equiv
166e0 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61  alent.  If we ca
166f0 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20  nnot prove that 
16700 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
16710 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  are.** identical
16720 2c 20 77 65 20 72 65 74 75 72 6e 20 46 41 4c 53  , we return FALS
16730 45 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  E just to be saf
16740 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
16750 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
16760 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f  s false, then yo
16770 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
16780 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
16790 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
167a0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
167b0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
167c0 20 79 6f 75 20 67 65 74 20 61 20 54 52 55 45 20   you get a TRUE 
167d0 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
167e0 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
167f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
16800 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
16810 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
16820 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
16830 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
16840 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
16850 67 65 74 20 61 6e 20 65 78 74 72 61 20 46 41 4c  get an extra FAL
16860 53 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73  SE - that.** jus
16870 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
16880 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
16890 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
168a0 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
168b0 6e 20 69 6e 63 6f 72 72 65 63 74 20 54 52 55 45  n incorrect TRUE
168c0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
168d0 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f   malfunction..*/
168e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
168f0 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
16900 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69  , Expr *pB){.  i
16910 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
16920 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  0||pB==0 ){.    
16930 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20  return pB==pA;. 
16940 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
16950 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e  =pB->op ) return
16960 20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66   0;.  if( (pA->f
16970 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
16980 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
16990 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
169a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
169b0 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
169c0 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
169d0 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  pB->pLeft) ) ret
169e0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
169f0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
16a00 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d  (pA->pRight, pB-
16a10 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72  >pRight) ) retur
16a20 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70  n 0;.  if( pA->p
16a30 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
16a40 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72  pB->pList==0 ) r
16a50 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
16a60 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70   pA->pList->nExp
16a70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45  r!=pB->pList->nE
16a80 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  xpr ) return 0;.
16a90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
16aa0 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  A->pList->nExpr;
16ab0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
16ac0 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
16ad0 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e  pare(pA->pList->
16ae0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e  a[i].pExpr, pB->
16af0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
16b00 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
16b10 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
16b20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
16b30 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pB->pList ){. 
16b40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
16b50 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65  .  if( pA->pSele
16b60 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63  ct || pB->pSelec
16b70 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  t ) return 0;.  
16b80 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
16b90 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41  pB->iTable || pA
16ba0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
16bb0 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
16bc0 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21  0;.  if( pA->op!
16bd0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
16be0 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20  ->token.z ){.   
16bf0 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a   if( pB->token.z
16c00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
16c10 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
16c20 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e  n.n!=pA->token.n
16c30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
16c40 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
16c50 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41 2d 3e  ICmp((char*)pA->
16c60 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70  token.z,(char*)p
16c70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74  B->token.z,pB->t
16c80 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20  oken.n)!=0 ){.  
16c90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16ca0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
16cb0 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64   1;.}.../*.** Ad
16cc0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
16cd0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
16ce0 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
16cf0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
16d00 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
16d10 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
16d20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
16d30 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
16d40 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
16d50 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
16d60 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
16d70 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
16d80 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
16d90 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
16da0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
16db0 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
16dc0 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
16dd0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
16de0 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
16df0 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70      3,.       &p
16e00 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
16e10 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
16e20 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20  olumnAlloc,.    
16e30 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
16e40 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
16e50 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
16e60 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
16e70 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61  gInfo->aFunc[] a
16e80 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
16e90 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
16ea0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
16eb0 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
16ec0 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
16ed0 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
16ee0 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
16ef0 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a  foFunc(sqlite3 *
16f00 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
16f10 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
16f20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73  pInfo->aFunc = s
16f30 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
16f40 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20  ate(.       db, 
16f50 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
16f60 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a  Func,.       siz
16f70 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  eof(pInfo->aFunc
16f80 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
16f90 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
16fa0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49  Func,.       &pI
16fb0 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c  nfo->nFuncAlloc,
16fc0 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
16fd0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
16fe0 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
16ff0 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61   the xExprCallba
17000 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61  ck for a tree wa
17010 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65  lker.  It is use
17020 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  d to.** implemen
17030 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
17040 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
17050 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
17060 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
17070 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
17080 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
17090 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
170a0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
170b0 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  e(Walker *pWalke
170c0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
170d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
170e0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
170f0 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
17100 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
17110 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
17120 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
17130 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
17140 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
17150 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41  ggInfo = pNC->pA
17160 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63  ggInfo;..  switc
17170 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
17180 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
17190 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
171a0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
171b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
171c0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
171d0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
171e0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
171f0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
17200 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ;.      /* Check
17210 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
17220 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
17230 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
17240 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
17250 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
17260 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
17270 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53   */.      if( pS
17280 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  rcList ){.      
17290 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
172a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
172b0 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
172c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
172d0 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
172e0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
172f0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
17300 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
17310 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17320 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
17330 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
17340 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
17350 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
17360 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
17370 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
17380 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
17390 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
173a0 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
173b0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
173c0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
173d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
173e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
173f0 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
17400 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
17410 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
17420 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
17430 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
17440 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
17450 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
17460 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
17470 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
17480 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
17490 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
174a0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
174b0 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
174c0 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
174d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
174e0 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
174f0 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
17500 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
17510 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
17520 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
17530 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
17540 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
17550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
17560 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
17570 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
17580 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
17590 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
175a0 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
175b0 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
175c0 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
175d0 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
175e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
175f0 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
17600 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
17610 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
17620 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
17630 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
17640 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
17650 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
17660 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17670 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
17680 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
176a0 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
176b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
176c0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
176d0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
176e0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
176f0 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
17700 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
17710 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
17720 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
17740 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
17750 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
17760 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
17770 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
17780 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
17790 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
177a0 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
177b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
177c0 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
177d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
177e0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
177f0 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
17800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17810 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
17820 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
17830 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
17840 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
17850 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
17860 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
17870 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
17880 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
17890 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
178a0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
178b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
178c0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
178d0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
178e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17900 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
17910 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
17920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
17930 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
17940 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
17950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17960 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
17970 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
17980 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
17990 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
179a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
179b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
179c0 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
179d0 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
179e0 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
179f0 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
17a00 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
17a10 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
17a20 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
17a30 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
17a40 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
17a50 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
17a60 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
17a70 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
17a80 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
17a90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
17aa0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
17ab0 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
17ac0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
17ad0 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
17ae0 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
17af0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
17b00 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
17b10 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
17b20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 6b 3b  pExpr->iAgg = k;
17b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
17b40 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
17b50 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
17b60 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
17b70 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
17b80 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
17b90 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
17ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
17bb0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
17bc0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17bd0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
17be0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
17bf0 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74  pNC->nDepth==0 t
17c00 65 73 74 20 63 61 75 73 65 73 20 61 67 67 72 65  est causes aggre
17c10 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  gate functions i
17c20 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 20  n subqueries.   
17c30 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f     ** to be igno
17c40 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  red */.      if(
17c50 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20   pNC->nDepth==0 
17c60 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
17c70 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
17c80 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
17c90 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
17ca0 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
17cb0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
17cc0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
17cd0 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
17ce0 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
17cf0 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
17d00 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
17d10 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
17d20 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
17d30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
17d40 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
17d50 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
17d60 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
17d70 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
17d80 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29  m->pExpr, pExpr)
17d90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17da0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
17db0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17dc0 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
17dd0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
17de0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
17df0 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
17e00 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
17e10 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
17e20 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
17e30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
17e40 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
17e50 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
17e60 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
17e70 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
17e80 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
17e90 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
17ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
17eb0 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
17ec0 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
17ed0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
17ee0 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
17ef0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
17f00 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
17f10 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
17f20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
17f30 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
17f40 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
17f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17f60 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72      (char*)pExpr
17f70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
17f80 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20  ->token.n,.     
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
17fa0 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78  xpr->pList ? pEx
17fb0 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
17fc0 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
17fd0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
17fe0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
17ff0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
18000 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
18010 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
18020 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
18030 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
18040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
18050 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
18060 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
18070 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
18080 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18090 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
180a0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
180b0 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
180c0 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
180d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
180e0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
180f0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  = i;.        pEx
18100 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
18110 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
18120 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
18130 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
18140 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
18150 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
18160 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
18170 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
18180 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ct(Walker *pWalk
18190 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
181a0 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74  ect){.  NameCont
181b0 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b  ext *pNC = pWalk
181c0 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69 66 28  er->u.pNC;.  if(
181d0 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20   pNC->nDepth==0 
181e0 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70  ){.    pNC->nDep
181f0 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  th++;.    sqlite
18200 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
18210 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  ker, pSelect);. 
18220 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d     pNC->nDepth--
18230 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
18240 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b  _Prune;.  }else{
18250 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
18260 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
18270 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
18280 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
18290 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ion looking for 
182a0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
182b0 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76  ons and.** for v
182c0 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65  ariables that ne
182d0 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ed to be added t
182e0 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
182f0 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d  gg[] array..** M
18300 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ake additional e
18310 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50  ntries to the pP
18320 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
18330 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ay as necessary.
18340 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18350 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
18360 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
18370 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
18380 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
18390 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65  zed by sqlite3Re
183a0 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
183b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
183c0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
183d0 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65  egates(NameConte
183e0 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70  xt *pNC, Expr *p
183f0 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
18400 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
18410 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
18420 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65  gregate;.  w.xSe
18430 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61  lectCallback = a
18440 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
18450 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e  InSelect;.  w.u.
18460 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 73 71 6c  pNC = pNC;.  sql
18470 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
18480 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
18490 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
184a0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
184b0 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
184c0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
184d0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
184e0 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
184f0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
18500 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
18510 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
18520 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
18530 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69  ut short..*/.voi
18540 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
18550 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
18560 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
18570 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
18580 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
18590 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
185a0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
185b0 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
185c0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
185d0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
185e0 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
185f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18600 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
18610 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
18620 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
18630 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
18640 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63  ocate or dealloc
18650 61 74 65 20 74 65 6d 70 6f 72 61 72 79 20 75 73  ate temporary us
18660 65 20 72 65 67 69 73 74 65 72 73 20 64 75 72 69  e registers duri
18670 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ng code generati
18680 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
18690 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72  e3GetTempReg(Par
186a0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
186b0 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
186c0 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Reg==0 ){.    re
186d0 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
186e0 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Mem;.  }.  retur
186f0 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  n pParse->aTempR
18700 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65  eg[--pParse->nTe
18710 6d 70 52 65 67 5d 3b 0a 7d 0a 76 6f 69 64 20 73  mpReg];.}.void s
18720 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18730 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
18740 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  se, int iReg){. 
18750 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61   if( iReg && pPa
18760 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
18770 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
18780 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20  aTempReg) ){.   
18790 20 73 71 6c 69 74 65 33 45 78 70 72 57 72 69 74   sqlite3ExprWrit
187a0 61 62 6c 65 52 65 67 69 73 74 65 72 28 70 50 61  ableRegister(pPa
187b0 72 73 65 2c 20 69 52 65 67 2c 20 69 52 65 67 29  rse, iReg, iReg)
187c0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  ;.    pParse->aT
187d0 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
187e0 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
187f0 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
18800 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
18810 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
18820 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
18830 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a  ve registers.*/.
18840 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
18850 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
18860 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
18870 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
18880 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
18890 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
188a0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
188b0 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 26 26    if( nReg<=n &&
188c0 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
188d0 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
188e0 2b 6e 2d 31 29 20 29 7b 0a 20 20 20 20 70 50 61  +n-1) ){.    pPa
188f0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
18900 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
18910 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
18920 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
18930 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
18940 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
18950 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
18960 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
18970 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
18980 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
18990 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
189a0 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
189b0 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg){.  if( nReg>
189c0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
189d0 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
189e0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
189f0 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
18a00 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
18a10 0a 20 20 7d 0a 7d 0a                             .  }.}.