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

Artifact 614a60615fd4bd186459c0c1fa87fdefedb76c26:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 34 32 32 20 32 30 30 39 2f 30 33 2f 32 34 20  .422 2009/03/24 
0220: 31 35 3a 30 38 3a 31 30 20 64 72 68 20 45 78 70  15:08:10 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
0250: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 27  .** Return the '
0260: 61 66 66 69 6e 69 74 79 27 20 6f 66 20 74 68 65  affinity' of the
0270: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0280: 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  r if any..**.** 
0290: 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
02a0: 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72 65 6e 63  lumn, a referenc
02b0: 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 76 69  e to a column vi
02c0: 61 20 61 6e 20 27 41 53 27 20 61 6c 69 61 73 2c  a an 'AS' alias,
02d0: 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d 73 65 6c  .** or a sub-sel
02e0: 65 63 74 20 77 69 74 68 20 61 20 63 6f 6c 75 6d  ect with a colum
02f0: 6e 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 20  n as the return 
0300: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
0310: 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 6f 66 20  .** affinity of 
0320: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73 20 72  that column is r
0330: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
0340: 73 65 2c 20 30 78 30 30 20 69 73 20 72 65 74 75  se, 0x00 is retu
0350: 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  rned,.** indicat
0360: 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69 74 79 20  ing no affinity 
0370: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
0380: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 2e 20 74  on..**.** i.e. t
0390: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
03a0: 65 78 70 72 65 73 73 73 69 6f 6e 73 20 69 6e 20  expresssions in 
03b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
03c0: 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a 2a 2a 20  atements all.** 
03d0: 68 61 76 65 20 61 6e 20 61 66 66 69 6e 69 74 79  have an affinity
03e0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
03f0: 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a 2a 20 53  ABLE t1(a);.** S
0400: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0410: 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53 45 4c 45  WHERE a;.** SELE
0420: 43 54 20 61 20 41 53 20 62 20 46 52 4f 4d 20 74  CT a AS b FROM t
0430: 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a 20 53 45  1 WHERE b;.** SE
0440: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
0450: 48 45 52 45 20 28 73 65 6c 65 63 74 20 61 20 66  HERE (select a f
0460: 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63 68 61 72  rom t1);.*/.char
0470: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
0480: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
0490: 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 70 45  ){.  int op = pE
04a0: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
04b0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
04c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
04d0: 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53  r->flags&EP_xIsS
04e0: 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74  elect );.    ret
04f0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0500: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78  ffinity(pExpr->x
0510: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
0520: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
0530: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
0540: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 69 66  E_OMIT_CAST.  if
0550: 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b  ( op==TK_CAST ){
0560: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0570: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0580: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
0590: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
05a0: 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c   (op==TK_AGG_COL
05b0: 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f  UMN || op==TK_CO
05c0: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52  LUMN || op==TK_R
05d0: 45 47 49 53 54 45 52 29 20 0a 20 20 20 26 26 20  EGISTER) .   && 
05e0: 70 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 0a 20  pExpr->pTab!=0. 
05f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 70 3d 3d 54   ){.    /* op==T
0600: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 45  K_REGISTER && pE
0610: 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 68 61 70  xpr->pTab!=0 hap
0620: 70 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20  pens when pExpr 
0630: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
0640: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
0650: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
0660: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
0670: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
0680: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69  egister */.    i
0690: 6e 74 20 6a 20 3d 20 70 45 78 70 72 2d 3e 69 43  nt j = pExpr->iC
06a0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6a  olumn;.    if( j
06b0: 3c 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <0 ) return SQLI
06c0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
06d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
06e0: 72 2d 3e 70 54 61 62 20 26 26 20 6a 3c 70 45 78  r->pTab && j<pEx
06f0: 70 72 2d 3e 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  pr->pTab->nCol )
0700: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 45 78  ;.    return pEx
0710: 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pr->pTab->aCol[j
0720: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 7d 0a  ].affinity;.  }.
0730: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
0740: 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a  affinity;.}../*.
0750: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
0760: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
0770: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  r expression pEx
0780: 70 72 20 74 6f 20 62 65 20 74 68 65 20 63 6f 6c  pr to be the col
0790: 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
07a0: 63 65 20 6e 61 6d 65 64 20 62 79 20 70 54 6f 6b  ce named by pTok
07b0: 65 6e 2e 20 20 20 52 65 74 75 72 6e 20 61 20 70  en.   Return a p
07c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65  ointer to the re
07d0: 76 69 73 65 64 20 65 78 70 72 65 73 73 69 6f 6e  vised expression
07e0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  ..** The collati
07f0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 6d  ng sequence is m
0800: 61 72 6b 65 64 20 61 73 20 22 65 78 70 6c 69 63  arked as "explic
0810: 69 74 22 20 75 73 69 6e 67 20 74 68 65 20 45 50  it" using the EP
0820: 5f 45 78 70 43 6f 6c 6c 61 74 65 0a 2a 2a 20 66  _ExpCollate.** f
0830: 6c 61 67 2e 20 20 41 6e 20 65 78 70 6c 69 63 69  lag.  An explici
0840: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
0850: 65 6e 63 65 20 77 69 6c 6c 20 6f 76 65 72 72 69  ence will overri
0860: 64 65 20 69 6d 70 6c 69 63 69 74 0a 2a 2a 20 63  de implicit.** c
0870: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0880: 65 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  es..*/.Expr *sql
0890: 69 74 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28  ite3ExprSetColl(
08a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
08b0: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
08c0: 6e 20 2a 70 43 6f 6c 6c 4e 61 6d 65 29 7b 0a 20  n *pCollName){. 
08d0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30   char *zColl = 0
08e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
08f0: 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66  Dequoted name of
0900: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0910: 6e 63 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  nce */.  CollSeq
0920: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74   *pColl;.  sqlit
0930: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0940: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
0950: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
0960: 6b 65 6e 28 64 62 2c 20 70 43 6f 6c 6c 4e 61 6d  ken(db, pCollNam
0970: 65 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20  e);.  if( pExpr 
0980: 26 26 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  && zColl ){.    
0990: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
09a0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
09b0: 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b  rse, zColl, -1);
09c0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
09d0: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  {.      pExpr->p
09e0: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  Coll = pColl;.  
09f0: 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73      pExpr->flags
0a00: 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
0a10: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  e;.    }.  }.  s
0a20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
0a30: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74 75 72   zColl);.  retur
0a40: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pExpr;.}../*.*
0a50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  * Return the def
0a60: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
0a70: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
0a80: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0a90: 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73  . If.** there is
0aa0: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
0ab0: 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74 75  ation type, retu
0ac0: 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  rn 0..*/.CollSeq
0ad0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
0ae0: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
0af0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
0b00: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
0b10: 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a  ll = 0;.  Expr *
0b20: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69  p = pExpr;.  whi
0b30: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  le( p ){.    int
0b40: 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d   op;.    pColl =
0b50: 20 70 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69   p->pColl;.    i
0b60: 66 28 20 70 43 6f 6c 6c 20 29 20 62 72 65 61 6b  f( pColl ) break
0b70: 3b 0a 20 20 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ;.    op = p->op
0b80: 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54  ;.    if( (op==T
0b90: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  K_AGG_COLUMN || 
0ba0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
0bb0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
0bc0: 29 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20  ) && p->pTab!=0 
0bd0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d  ){.      /* op==
0be0: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
0bf0: 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  ->pTab!=0 happen
0c00: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
0c10: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
0c20: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
0c30: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
0c40: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
0c50: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
0c60: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
0c70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
0c80: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  l;.      int j =
0c90: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
0ca0: 20 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20     if( j>=0 ){. 
0cb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a         sqlite3 *
0cc0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0cd0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  .        zColl =
0ce0: 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a   p->pTab->aCol[j
0cf0: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
0d00: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
0d10: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
0d20: 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
0d30: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  -1, 0);.        
0d40: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pExpr->pColl = p
0d50: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
0d60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0d70: 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  .    if( op!=TK_
0d80: 43 41 53 54 20 26 26 20 6f 70 21 3d 54 4b 5f 55  CAST && op!=TK_U
0d90: 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 62 72  PLUS ){.      br
0da0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
0db0: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d   = p->pLeft;.  }
0dc0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
0dd0: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
0de0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
0df0: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
0e00: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
0e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
0e20: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
0e30: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
0e40: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
0e50: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
0e60: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
0e70: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
0e80: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
0e90: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
0ea0: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
0eb0: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
0ec0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
0ed0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
0ee0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
0ef0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
0f00: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
0f10: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
0f20: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
0f30: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
0f40: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
0f50: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
0f60: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
0f70: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
0f80: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
0f90: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
0fa0: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
0fb0: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
0fc0: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
0fd0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0fe0: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
0ff0: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
1000: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1010: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
1020: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1030: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
1040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1060: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
1070: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1080: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1090: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
10a0: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
10b0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
10c0: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
10d0: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
10e0: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
10f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1100: 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NONE;.  }else{.
1110: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
1120: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
1130: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
1140: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
1150: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
1160: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1170: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1180: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1190: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
11a0: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
11b0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
11c0: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
11d0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
11e0: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
11f0: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1200: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1210: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1220: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1230: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1240: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1250: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1260: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1270: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1280: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1290: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
12a0: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
12b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
12c0: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
12d0: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
12e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
12f0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1300: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ->op==TK_NE );. 
1310: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1320: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
1330: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1340: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
1350: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
1360: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
1370: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
1380: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1390: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
13a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70  .  }else if( Exp
13b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
13c0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
13d0: 29 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  ) ){.    aff = s
13e0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
13f0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70  inity(pExpr->x.p
1400: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
1410: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29  a[0].pExpr, aff)
1420: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  ;.  }else if( !a
1430: 66 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ff ){.    aff = 
1440: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1450: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
1460: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  f;.}../*.** pExp
1470: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
1480: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67  n expression, eg
1490: 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e  . '=', '<', IN(.
14a0: 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f  ..) etc..** idx_
14b0: 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20  affinity is the 
14c0: 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69  affinity of an i
14d0: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52  ndexed column. R
14e0: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
14f0: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
1500: 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66  affinity idx_aff
1510: 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65  inity may be use
1520: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
1530: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
1540: 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e   in pExpr..*/.in
1550: 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  t sqlite3IndexAf
1560: 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70  finityOk(Expr *p
1570: 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61  Expr, char idx_a
1580: 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72  ffinity){.  char
1590: 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f   aff = compariso
15a0: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
15b0: 3b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20  ;.  switch( aff 
15c0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
15d0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20  TE_AFF_NONE:.   
15e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
15f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1600: 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74  _TEXT:.      ret
1610: 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79  urn idx_affinity
1620: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
1630: 54 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  T;.    default:.
1640: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1650: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1660: 69 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69  inity(idx_affini
1670: 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ty);.  }.}../*.*
1680: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20  * Return the P5 
1690: 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c  value that shoul
16a0: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20  d be used for a 
16b0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
16c0: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f  n.** opcode (OP_
16d0: 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20  Eq, OP_Ge etc.) 
16e0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
16f0: 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72  pExpr1 and pExpr
1700: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  2..*/.static u8 
1710: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28  binaryCompareP5(
1720: 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78  Expr *pExpr1, Ex
1730: 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20  pr *pExpr2, int 
1740: 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75  jumpIfNull){.  u
1750: 38 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71  8 aff = (char)sq
1760: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1770: 79 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66  y(pExpr2);.  aff
1780: 20 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f   = (u8)sqlite3Co
1790: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
17a0: 78 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38  xpr1, aff) | (u8
17b0: 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72  )jumpIfNull;.  r
17c0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
17d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
17e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
17f0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
1800: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1810: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
1820: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
1830: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
1840: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1850: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
1860: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
1870: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
1880: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
1890: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
18a0: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
18b0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
18c0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
18d0: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
18e0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
18f0: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
1900: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
1910: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1920: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
1930: 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41  ** type..**.** A
1940: 72 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28  rgument pRight (
1950: 62 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d  but not pLeft) m
1960: 61 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69  ay be a null poi
1970: 6e 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61  nter. In this ca
1980: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  se,.** it is not
1990: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
19a0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
19b0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
19c0: 6c 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70  lSeq(.  Parse *p
19d0: 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a  Parse, .  Expr *
19e0: 70 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a  pLeft, .  Expr *
19f0: 70 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c  pRight.){.  Coll
1a00: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73  Seq *pColl;.  as
1a10: 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
1a20: 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67   if( pLeft->flag
1a30: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
1a40: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1a50: 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b   pLeft->pColl );
1a60: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65  .    pColl = pLe
1a70: 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c  ft->pColl;.  }el
1a80: 73 65 20 69 66 28 20 70 52 69 67 68 74 20 26 26  se if( pRight &&
1a90: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
1aa0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
1ab0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  {.    assert( pR
1ac0: 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  ight->pColl );. 
1ad0: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68     pColl = pRigh
1ae0: 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73  t->pColl;.  }els
1af0: 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  e{.    pColl = s
1b00: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1b10: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
1b20: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
1b30: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
1b40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1b50: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
1b60: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
1b70: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
1b80: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b90: 65 20 74 68 65 20 6f 70 65 72 61 6e 64 73 20 66  e the operands f
1ba0: 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  or a comparison 
1bb0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 65 66 6f  operation.  Befo
1bc0: 72 65 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67  re.** generating
1bd0: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 65 61   the code for ea
1be0: 63 68 20 6f 70 65 72 61 6e 64 2c 20 73 65 74 20  ch operand, set 
1bf0: 74 68 65 20 45 50 5f 41 6e 79 41 66 66 0a 2a 2a  the EP_AnyAff.**
1c00: 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 65 78 70   flag on the exp
1c10: 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20  ression so that 
1c20: 69 74 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  it will be able 
1c30: 74 6f 20 75 73 65 64 20 61 0a 2a 2a 20 63 61 63  to used a.** cac
1c40: 68 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  hed column value
1c50: 20 74 68 61 74 20 68 61 73 20 70 72 65 76 69 6f   that has previo
1c60: 75 73 6c 79 20 75 6e 64 65 72 67 6f 6e 65 20 61  usly undergone a
1c70: 6e 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 63 68  n.** affinity ch
1c80: 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ange..*/.static 
1c90: 76 6f 69 64 20 63 6f 64 65 43 6f 6d 70 61 72 65  void codeCompare
1ca0: 4f 70 65 72 61 6e 64 73 28 0a 20 20 50 61 72 73  Operands(.  Pars
1cb0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1cc0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1cd0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1ce0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1cf0: 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54  pLeft,      /* T
1d00: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
1d10: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 4c 65  */.  int *pRegLe
1d20: 66 74 2c 20 20 20 20 2f 2a 20 52 65 67 69 73 74  ft,    /* Regist
1d30: 65 72 20 77 68 65 72 65 20 6c 65 66 74 20 6f 70  er where left op
1d40: 65 72 61 6e 64 20 69 73 20 73 74 6f 72 65 64 20  erand is stored 
1d50: 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 72 65 65 4c  */.  int *pFreeL
1d60: 65 66 74 2c 20 20 20 2f 2a 20 46 72 65 65 20 74  eft,   /* Free t
1d70: 68 69 73 20 72 65 67 69 73 74 65 72 20 77 68 65  his register whe
1d80: 6e 20 64 6f 6e 65 20 2a 2f 0a 20 20 45 78 70 72  n done */.  Expr
1d90: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a   *pRight,     /*
1da0: 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   The right opera
1db0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
1dc0: 67 52 69 67 68 74 2c 20 20 20 2f 2a 20 52 65 67  gRight,   /* Reg
1dd0: 69 73 74 65 72 20 77 68 65 72 65 20 72 69 67 68  ister where righ
1de0: 74 20 6f 70 65 72 61 6e 64 20 69 73 20 73 74 6f  t operand is sto
1df0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46  red */.  int *pF
1e00: 72 65 65 52 69 67 68 74 20 20 20 2f 2a 20 57 72  reeRight   /* Wr
1e10: 69 74 65 20 74 65 6d 70 20 72 65 67 69 73 74 65  ite temp registe
1e20: 72 20 66 6f 72 20 72 69 67 68 74 20 6f 70 65 72  r for right oper
1e30: 61 6e 64 20 74 68 65 72 65 20 2a 2f 0a 29 7b 0a  and there */.){.
1e40: 20 20 77 68 69 6c 65 28 20 70 4c 65 66 74 2d 3e    while( pLeft->
1e50: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70  op==TK_UPLUS ) p
1e60: 4c 65 66 74 20 3d 20 70 4c 65 66 74 2d 3e 70 4c  Left = pLeft->pL
1e70: 65 66 74 3b 0a 20 20 70 4c 65 66 74 2d 3e 66 6c  eft;.  pLeft->fl
1e80: 61 67 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66 66  ags |= EP_AnyAff
1e90: 3b 0a 20 20 2a 70 52 65 67 4c 65 66 74 20 3d 20  ;.  *pRegLeft = 
1ea0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1eb0: 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66  emp(pParse, pLef
1ec0: 74 2c 20 70 46 72 65 65 4c 65 66 74 29 3b 0a 20  t, pFreeLeft);. 
1ed0: 20 77 68 69 6c 65 28 20 70 52 69 67 68 74 2d 3e   while( pRight->
1ee0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70  op==TK_UPLUS ) p
1ef0: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 2d 3e  Right = pRight->
1f00: 70 4c 65 66 74 3b 0a 20 20 70 52 69 67 68 74 2d  pLeft;.  pRight-
1f10: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 41 6e 79  >flags |= EP_Any
1f20: 41 66 66 3b 0a 20 20 2a 70 52 65 67 52 69 67 68  Aff;.  *pRegRigh
1f30: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
1f40: 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1f50: 70 52 69 67 68 74 2c 20 70 46 72 65 65 52 69 67  pRight, pFreeRig
1f60: 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ht);.}../*.** Ge
1f70: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1f80: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1f90: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
1fa0: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
1fb0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1fc0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
1fd0: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1fe0: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1ff0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
2000: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
2010: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
2020: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2030: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2040: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
2050: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
2060: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
2070: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
2080: 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c  nt in1, int in2,
2090: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
20a0: 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f  ding operands */
20b0: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
20c0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
20d0: 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20  e if true.  */. 
20e0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
20f0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a     /* If true, j
2100: 75 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70  ump if either op
2110: 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f  erand is NULL */
2120: 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20  .){.  int p5;.  
2130: 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c  int addr;.  Coll
2140: 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d  Seq *p4;..  p4 =
2150: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
2160: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
2170: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
2180: 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61  ht);.  p5 = bina
2190: 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66  ryCompareP5(pLef
21a0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
21b0: 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d  fNull);.  addr =
21c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21d0: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
21e0: 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64  , opcode, in2, d
21f0: 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20  est, in1,.      
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20       (void*)p4, 
2220: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73  P4_COLLSEQ);.  s
2230: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2240: 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  P5(pParse->pVdbe
2250: 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 69 66 28  , (u8)p5);.  if(
2260: 20 28 70 35 20 26 20 53 51 4c 49 54 45 5f 41 46   (p5 & SQLITE_AF
2270: 46 5f 4d 41 53 4b 29 21 3d 53 51 4c 49 54 45 5f  F_MASK)!=SQLITE_
2280: 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
2290: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
22a0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
22b0: 50 61 72 73 65 2c 20 69 6e 31 2c 20 31 29 3b 0a  Parse, in1, 1);.
22c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
22d0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
22e0: 67 65 28 70 50 61 72 73 65 2c 20 69 6e 32 2c 20  ge(pParse, in2, 
22f0: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
2300: 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51   addr;.}..#if SQ
2310: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
2320: 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63  PTH>0./*.** Chec
2330: 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20  k that argument 
2340: 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73 20  nHeight is less 
2350: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
2360: 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20   the maximum.** 
2370: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
2380: 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20   allowed. If it 
2390: 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e  is not, leave an
23a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
23b0: 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  n.** pParse..*/.
23c0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
23d0: 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73 65  heckHeight(Parse
23e0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48   *pParse, int nH
23f0: 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63  eight){.  int rc
2400: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2410: 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70  int mxHeight = p
2420: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
2430: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
2440: 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66  XPR_DEPTH];.  if
2450: 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67  ( nHeight>mxHeig
2460: 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
2470: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2480: 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72 65  , .       "Expre
2490: 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f  ssion tree is to
24a0: 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d  o large (maximum
24b0: 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48   depth %d)", mxH
24c0: 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20  eight.    );.   
24d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
24e0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
24f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66   rc;.}../* The f
2500: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66  ollowing three f
2510: 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74  unctions, height
2520: 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68 74  OfExpr(), height
2530: 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20  OfExprList().** 
2540: 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65  and heightOfSele
2550: 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20 74  ct(), are used t
2560: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
2570: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a  maximum height.*
2580: 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73  * of any express
2590: 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e  ion tree referen
25a0: 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75 63  ced by the struc
25b0: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74  ture passed as t
25c0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75  he.** first argu
25d0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ment..**.** If t
25e0: 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  his maximum heig
25f0: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
2600: 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  an the current v
2610: 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  alue pointed.** 
2620: 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20  to by pnHeight, 
2630: 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
2640: 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a  eter, then set *
2650: 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61 74  pnHeight to that
2660: 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  .** value..*/.st
2670: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
2680: 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  OfExpr(Expr *p, 
2690: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
26a0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
26b0: 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70  f( p->nHeight>*p
26c0: 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20  nHeight ){.     
26d0: 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e   *pnHeight = p->
26e0: 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20  nHeight;.    }. 
26f0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
2700: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2710: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  t(ExprList *p, i
2720: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
2730: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
2740: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
2750: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
2760: 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74  +){.      height
2770: 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70  OfExpr(p->a[i].p
2780: 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b  Expr, pnHeight);
2790: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
27a0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
27b0: 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a  fSelect(Select *
27c0: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
27d0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
27e0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
27f0: 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67  ->pWhere, pnHeig
2800: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2810: 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  fExpr(p->pHaving
2820: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2830: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2840: 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68  >pLimit, pnHeigh
2850: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
2860: 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c  Expr(p->pOffset,
2870: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2880: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2890: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65  (p->pEList, pnHe
28a0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
28b0: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
28c0: 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68  GroupBy, pnHeigh
28d0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
28e0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
28f0: 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  erBy, pnHeight);
2900: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
2910: 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70  ect(p->pPrior, p
2920: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a  nHeight);.  }.}.
2930: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
2940: 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69  xpr.nHeight vari
2950: 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75  able in the stru
2960: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
2970: 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  an .** argument.
2980: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77   An expression w
2990: 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c  ith no children,
29a0: 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a   Expr.pList or .
29b0: 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20  ** Expr.pSelect 
29c0: 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65 69  member has a hei
29d0: 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74  ght of 1. Any ot
29e0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  her expression.*
29f0: 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20 65  * has a height e
2a00: 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69  qual to the maxi
2a10: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
2a20: 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65  y other .** refe
2a30: 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73  renced Expr plus
2a40: 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   one..*/.static 
2a50: 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67  void exprSetHeig
2a60: 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ht(Expr *p){.  i
2a70: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
2a80: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2a90: 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68  ->pLeft, &nHeigh
2aa0: 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78  t);.  heightOfEx
2ab0: 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e  pr(p->pRight, &n
2ac0: 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45  Height);.  if( E
2ad0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2ae0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2af0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  ){.    heightOfS
2b00: 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65  elect(p->x.pSele
2b10: 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ct, &nHeight);. 
2b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 65 69 67   }else{.    heig
2b30: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
2b40: 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68  x.pList, &nHeigh
2b50: 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65  t);.  }.  p->nHe
2b60: 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b  ight = nHeight +
2b70: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   1;.}../*.** Set
2b80: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
2b90: 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67  t variable using
2ba0: 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69 67   the exprSetHeig
2bb0: 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49  ht() function. I
2bc0: 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20  f.** the height 
2bd0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2be0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  the maximum allo
2bf0: 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64  wed expression d
2c00: 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61  epth,.** leave a
2c10: 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
2c20: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2c30: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28  e3ExprSetHeight(
2c40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
2c50: 78 70 72 20 2a 70 29 7b 0a 20 20 65 78 70 72 53  xpr *p){.  exprS
2c60: 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73  etHeight(p);.  s
2c70: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
2c80: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
2c90: 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a  >nHeight);.}../*
2ca0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
2cb0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66  aximum height of
2cc0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
2cd0: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a  tree referenced.
2ce0: 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63 74  ** by the select
2cf0: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
2d00: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
2d10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d20: 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
2d30: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69  (Select *p){.  i
2d40: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
2d50: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2d60: 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  (p, &nHeight);. 
2d70: 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b   return nHeight;
2d80: 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69  .}.#else.  #defi
2d90: 6e 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  ne exprSetHeight
2da0: 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  (y).#endif /* SQ
2db0: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
2dc0: 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PTH>0 */../*.** 
2dd0: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
2de0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
2df0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
2e00: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d  nter to it.  Mem
2e10: 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  ory.** for this 
2e20: 6e 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64  node is obtained
2e30: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
2e40: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
2e50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
2e60: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2e70: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2e80: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
2e90: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
2ea0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2eb0: 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
2ec0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
2ed0: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71  /* Handle for sq
2ee0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
2ef0: 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c  o() (may be null
2f00: 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  ) */.  int op,  
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f20: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
2f30: 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ode */.  Expr *p
2f40: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2f50: 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64   /* Left operand
2f60: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
2f70: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
2f80: 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   Right operand *
2f90: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
2fa0: 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41  *pToken     /* A
2fb0: 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f  rgument token */
2fc0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
2fd0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
2fe0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
2ff0: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  b, sizeof(Expr))
3000: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
3010: 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d  ){.    /* When m
3020: 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c  alloc fails, del
3030: 65 74 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ete pLeft and pR
3040: 69 67 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e  ight. Expression
3050: 73 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20  s passed to .   
3060: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
3070: 6e 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  n must always be
3080: 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20   allocated with 
3090: 73 71 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f  sqlite3Expr() fo
30a0: 72 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72  r this .    ** r
30b0: 65 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20  eason. .    */. 
30c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
30d0: 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b  lete(db, pLeft);
30e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
30f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68  Delete(db, pRigh
3100: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
3110: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70  ;.  }.  pNew->op
3120: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4e 65   = (u8)op;.  pNe
3130: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  w->pLeft = pLeft
3140: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
3150: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 70 4e 65   = pRight;.  pNe
3160: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
3170: 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 28  pNew->span.z = (
3180: 75 38 2a 29 22 22 3b 0a 20 20 69 66 28 20 70 54  u8*)"";.  if( pT
3190: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  oken ){.    int 
31a0: 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
31b0: 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b  Token->dyn==0 );
31c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20  .    pNew->span 
31d0: 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 0a 20 20 20  = *pToken;. .   
31e0: 20 2f 2a 20 54 68 65 20 70 54 6f 6b 65 6e 2d 3e   /* The pToken->
31f0: 7a 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 73 74  z value is const
3200: 61 6e 74 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74  ant and must not
3210: 20 63 68 61 6e 67 65 2e 20 20 42 75 74 0a 20 20   change.  But.  
3220: 20 20 2a 2a 20 74 68 69 73 20 65 78 70 72 65 73    ** this expres
3230: 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 70 61  sion might be pa
3240: 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 44  ssed to sqlite3D
3250: 65 71 75 6f 74 65 45 78 70 72 28 29 20 77 68 69  equoteExpr() whi
3260: 63 68 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 61  ch.    ** will a
3270: 74 74 65 6d 70 74 20 74 6f 20 6d 6f 64 69 66 79  ttempt to modify
3280: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 2e 20   pNew->token.z. 
3290: 20 48 65 6e 63 65 2c 20 69 66 20 74 68 65 20 74   Hence, if the t
32a0: 6f 6b 65 6e 0a 20 20 20 20 2a 2a 20 69 73 20 71  oken.    ** is q
32b0: 75 6f 74 65 64 2c 20 6d 61 6b 65 20 61 20 63 6f  uoted, make a co
32c0: 70 79 20 6e 6f 77 20 73 6f 20 74 68 61 74 20 44  py now so that D
32d0: 65 71 75 6f 74 65 45 78 70 72 28 29 20 77 69 6c  equoteExpr() wil
32e0: 6c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20  l change.    ** 
32f0: 74 68 65 20 63 6f 70 79 20 72 61 74 68 65 72 20  the copy rather 
3300: 74 68 61 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  than the origina
3310: 6c 20 28 72 65 61 64 2d 6f 6e 6c 79 29 20 74 65  l (read-only) te
3320: 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  xt..    */.    i
3330: 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 32 20  f( pToken->n>=2 
3340: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 63  .         && ((c
3350: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29   = pToken->z[0])
3360: 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27  =='\'' || c=='"'
3370: 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d   || c=='[' || c=
3380: 3d 27 60 27 29 20 29 7b 0a 20 20 20 20 20 20 73  ='`') ){.      s
3390: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
33a0: 64 62 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e  db, &pNew->token
33b0: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  , pToken);.    }
33c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
33d0: 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65  ->token = *pToke
33e0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  n;.    }.  }else
33f0: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
3400: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
3410: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
3420: 2d 3e 73 70 61 6e 2e 64 79 6e 3d 3d 30 20 26 26  ->span.dyn==0 &&
3430: 20 70 4c 65 66 74 2d 3e 73 70 61 6e 2e 64 79 6e   pLeft->span.dyn
3440: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
3450: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 70  qlite3ExprSpan(p
3460: 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61  New, &pLeft->spa
3470: 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70 61 6e  n, &pRight->span
3480: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3490: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 6c 61   if( pRight->fla
34a0: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
34b0: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  te ){.        pN
34c0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
34d0: 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ExpCollate;.    
34e0: 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20      pNew->pColl 
34f0: 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b  = pRight->pColl;
3500: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3510: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c     if( pLeft->fl
3520: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
3530: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ate ){.      pNe
3540: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  w->flags |= EP_E
3550: 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20  xpCollate;.     
3560: 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70   pNew->pColl = p
3570: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Left->pColl;.   
3580: 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 72 53 65   }.  }..  exprSe
3590: 74 48 65 69 67 68 74 28 70 4e 65 77 29 3b 0a 20  tHeight(pNew);. 
35a0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
35b0: 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b  ./*.** Works lik
35c0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 28 29 20  e sqlite3Expr() 
35d0: 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 74  except that it t
35e0: 61 6b 65 73 20 61 6e 20 65 78 74 72 61 20 50 61  akes an extra Pa
35f0: 72 73 65 2a 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rse*.** argument
3600: 20 61 6e 64 20 6e 6f 74 69 66 69 65 73 20 74 68   and notifies th
3610: 65 20 61 73 73 6f 63 69 61 74 65 64 20 63 6f 6e  e associated con
3620: 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69  nection object i
3630: 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
3640: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3650: 50 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  PExpr(.  Parse *
3660: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3670: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
3680: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
36b0: 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20  pcode */.  Expr 
36c0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  *pLeft,         
36d0: 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61     /* Left opera
36e0: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
36f0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
3700: 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64  /* Right operand
3710: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65   */.  const Toke
3720: 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a  n *pToken     /*
3730: 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20   Argument token 
3740: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 20  */.){.  Expr *p 
3750: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50  = sqlite3Expr(pP
3760: 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 4c  arse->db, op, pL
3770: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 70 54 6f  eft, pRight, pTo
3780: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  ken);.  if( p ){
3790: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
37a0: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
37b0: 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b  se, p->nHeight);
37c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
37d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  .}../*.** When d
37e0: 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61  oing a nested pa
37f0: 72 73 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63  rse, you can inc
3800: 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  lude terms in an
3810: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
3820: 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68  hat look like th
3830: 69 73 3a 20 20 20 23 31 20 23 32 20 2e 2e 2e 20  is:   #1 #2 ... 
3840: 20 54 68 65 73 65 20 74 65 72 6d 73 20 72 65 66   These terms ref
3850: 65 72 20 74 6f 20 72 65 67 69 73 74 65 72 73 0a  er to registers.
3860: 2a 2a 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  ** in the virtua
3870: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 23 4e 20 69  l machine.  #N i
3880: 73 20 74 68 65 20 4e 2d 74 68 20 72 65 67 69 73  s the N-th regis
3890: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
38a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
38b0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
38c0: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6f 6e 20  to deal with on 
38d0: 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a  of those terms..
38e0: 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61 74 65 6c  ** It immediatel
38f0: 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  y generates code
3900: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76 61   to store the va
3910: 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  lue in a memory 
3920: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  location..** The
3930: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78 70 72   returns an expr
3940: 65 73 73 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  ession that will
3950: 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74   code to extract
3960: 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a   the value from.
3970: 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c  ** that memory l
3980: 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65 65 64 65  ocation as neede
3990: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
39a0: 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28  te3RegisterExpr(
39b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
39c0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
39d0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
39e0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72  e->pVdbe;.  Expr
39f0: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73   *p;.  if( pPars
3a00: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a  e->nested==0 ){.
3a10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3a20: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61  Msg(pParse, "nea
3a30: 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78  r \"%T\": syntax
3a40: 20 65 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29   error", pToken)
3a50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
3a60: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
3a70: 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c  , TK_NULL, 0, 0,
3a80: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76   0);.  }.  if( v
3a90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3aa0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 50 45 78    p = sqlite3PEx
3ab0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 52 45  pr(pParse, TK_RE
3ac0: 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20 70 54  GISTER, 0, 0, pT
3ad0: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d  oken);.  if( p==
3ae0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3af0: 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61  0;  /* Malloc fa
3b00: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d  iled */.  }.  p-
3b10: 3e 69 54 61 62 6c 65 20 3d 20 61 74 6f 69 28 28  >iTable = atoi((
3b20: 63 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a  char*)&pToken->z
3b30: 5b 31 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  [1]);.  return p
3b40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
3b50: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
3b60: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
3b70: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
3b80: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
3b90: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
3ba0: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
3bb0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
3bc0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3bd0: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
3be0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
3bf0: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
3c00: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
3c10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
3c20: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
3c30: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
3c40: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
3c50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
3c60: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
3c70: 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 70 4c 65  (db, TK_AND, pLe
3c80: 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
3c90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
3ca0: 20 74 68 65 20 45 78 70 72 2e 73 70 61 6e 20 66   the Expr.span f
3cb0: 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65  ield of the give
3cc0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
3cd0: 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74  span all.** text
3ce0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
3cf0: 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 20 20   given tokens.  
3d00: 42 6f 74 68 20 74 6f 6b 65 6e 73 20 6d 75 73 74  Both tokens must
3d10: 20 62 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20   be pointing.** 
3d20: 61 74 20 74 68 65 20 73 61 6d 65 20 73 74 72 69  at the same stri
3d30: 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ng..*/.void sqli
3d40: 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72  te3ExprSpan(Expr
3d50: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
3d60: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
3d70: 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28  ight){.  assert(
3d80: 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
3d90: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
3da0: 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
3db0: 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 73 70  ){.    pExpr->sp
3dc0: 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b  an.z = pLeft->z;
3dd0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
3de0: 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20 6d  owing assert() m
3df0: 61 79 20 66 61 69 6c 20 77 68 65 6e 20 74 68 69  ay fail when thi
3e00: 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 20 20 20  s is called .   
3e10: 20 2a 2a 20 76 69 61 20 73 71 6c 69 74 65 33 50   ** via sqlite3P
3e20: 45 78 70 72 28 29 2f 73 71 6c 69 74 65 33 45 78  Expr()/sqlite3Ex
3e30: 70 72 28 29 20 66 72 6f 6d 20 61 64 64 57 68 65  pr() from addWhe
3e40: 72 65 54 65 72 6d 28 29 2e 20 2a 2f 0a 20 20 20  reTerm(). */.   
3e50: 20 2f 2a 20 61 73 73 65 72 74 28 70 52 69 67 68   /* assert(pRigh
3e60: 74 2d 3e 7a 20 3e 3d 20 70 4c 65 66 74 2d 3e 7a  t->z >= pLeft->z
3e70: 29 3b 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d  ); */.    pExpr-
3e80: 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74  >span.n = pRight
3e90: 2d 3e 6e 20 2b 20 28 75 6e 73 69 67 6e 65 64 29  ->n + (unsigned)
3ea0: 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65  (pRight->z - pLe
3eb0: 66 74 2d 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ft->z);.  }.}../
3ec0: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
3ed0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
3ee0: 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74  node for a funct
3ef0: 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c  ion with multipl
3f00: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a  e.** arguments..
3f10: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3f20: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72  ExprFunction(Par
3f30: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
3f40: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
3f50: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
3f60: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c  xpr *pNew;.  sql
3f70: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
3f80: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
3f90: 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65   pToken );.  pNe
3fa0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
3fb0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
3fc0: 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66  of(Expr) );.  if
3fd0: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
3fe0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3ff0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
4000: 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f  ); /* Avoid memo
4010: 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c  ry leak when mal
4020: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
4030: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4040: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
4050: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
4060: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
4070: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
4080: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
4090: 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
40a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
40b0: 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a  oken->dyn==0 );.
40c0: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 2a    pNew->span = *
40d0: 70 54 6f 6b 65 6e 3b 0a 20 20 73 71 6c 69 74 65  pToken;.  sqlite
40e0: 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
40f0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2c 20 70 54 6f  pNew->token, pTo
4100: 6b 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ken);.  sqlite3E
4110: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61  xprSetHeight(pPa
4120: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  rse, pNew);.  re
4130: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4140: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
4150: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
4160: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
4170: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
4180: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
4190: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
41a0: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
41b0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
41c0: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
41d0: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
41e0: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
41f0: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
4200: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
4210: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
4220: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
4230: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
4240: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
4250: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
4260: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
4270: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
4280: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
4290: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
42a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
42b0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
42c0: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
42d0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
42e0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
42f0: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
4300: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
4310: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
4320: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
4330: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
4340: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
4350: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
4360: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
4370: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
4380: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
4390: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
43a0: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
43b0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
43c0: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
43d0: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
43e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
43f0: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ){.  Token *pTok
4400: 65 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  en;.  sqlite3 *d
4410: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4420: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
4430: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b  ) return;.  pTok
4440: 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b  en = &pExpr->tok
4450: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  en;.  assert( pT
4460: 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20  oken->n>=1 );.  
4470: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
4480: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
4490: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d  ( pToken->z[0]!=
44a0: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
44b0: 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  n->n==1 ){.    /
44c0: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
44d0: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
44e0: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
44f0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
4500: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
4510: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
4520: 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ar;.  }else if( 
4530: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f  pToken->z[0]=='?
4540: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
4550: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
4560: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
4570: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
4580: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
4590: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
45a0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
45b0: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
45c0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
45d0: 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a   i = atoi((char*
45e0: 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b  )&pToken->z[1]);
45f0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
4600: 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
4610: 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20  ase( i==1 );.   
4620: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
4630: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
4640: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
4650: 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20  UMBER]-1 );.    
4660: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
4670: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4680: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4690: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 69 66 28  MBER] );.    if(
46a0: 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c   i<1 || i>db->aL
46b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
46c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
46d0: 52 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  R] ){.      sqli
46e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
46f0: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
4700: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
4710: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
4720: 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ,.          db->
4730: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4740: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
4750: 42 45 52 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  BER]);.    }.   
4760: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
4770: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Var ){.      pPa
4780: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20  rse->nVar = i;. 
4790: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
47a0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f    /* Wildcards o
47b0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
47c0: 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65  " or "$aaa".  Re
47d0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
47e0: 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  iable.    ** num
47f0: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
4800: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
4810: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
4820: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
4830: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
4840: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
4850: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
4860: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
4870: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a    */.    int i;.
4880: 20 20 20 20 75 33 32 20 6e 3b 0a 20 20 20 20 6e      u32 n;.    n
4890: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20   = pToken->n;.  
48a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
48b0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69  rse->nVarExpr; i
48c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
48d0: 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28  *pE;.      if( (
48e0: 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56  pE = pParse->apV
48f0: 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20  arExpr[i])!=0.  
4900: 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74          && pE->t
4910: 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20  oken.n==n.      
4920: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45      && memcmp(pE
4930: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65  ->token.z, pToke
4940: 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  n->z, n)==0 ){. 
4950: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
4960: 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c  able = pE->iTabl
4970: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
4980: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4990: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
49a0: 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20  e->nVarExpr ){. 
49b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
49c0: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
49d0: 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Var;.      if( p
49e0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e  Parse->nVarExpr>
49f0: 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  =pParse->nVarExp
4a00: 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20  rAlloc-1 ){.    
4a10: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
4a20: 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61  ExprAlloc += pPa
4a30: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
4a40: 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  oc + 10;.       
4a50: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
4a60: 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  pr =.           
4a70: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
4a80: 63 4f 72 46 72 65 65 28 0a 20 20 20 20 20 20 20  cOrFree(.       
4a90: 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
4aa0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
4ab0: 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20 20  >apVarExpr,.    
4ac0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
4ad0: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a  ->nVarExprAlloc*
4ae0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
4af0: 70 56 61 72 45 78 70 72 5b 30 5d 29 0a 20 20 20  pVarExpr[0]).   
4b00: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
4b10: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 64    }.      if( !d
4b20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4b30: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
4b40: 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72  t( pParse->apVar
4b50: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
4b60: 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72     pParse->apVar
4b70: 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61  Expr[pParse->nVa
4b80: 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72  rExpr++] = pExpr
4b90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4ba0: 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72    } .  if( !pPar
4bb0: 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72  se->nErr && pPar
4bc0: 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69  se->nVar>db->aLi
4bd0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
4be0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4bf0: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
4c00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4c10: 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76   "too many SQL v
4c20: 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a  ariables");.  }.
4c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
4c40: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72  n expression str
4c50: 75 63 74 75 72 65 20 77 69 74 68 6f 75 74 20 64  ucture without d
4c60: 65 6c 65 74 69 6e 67 20 74 68 65 20 73 74 72 75  eleting the stru
4c70: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2a  cture itself..**
4c80: 20 53 75 62 73 74 72 75 63 74 75 72 65 20 69 73   Substructure is
4c90: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 76 6f 69   deleted..*/.voi
4ca0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65  d sqlite3ExprCle
4cb0: 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
4cc0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
4cd0: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73  p->token.dyn ) s
4ce0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4cf0: 20 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e   (char*)p->token
4d00: 2e 7a 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72  .z);.  if( !Expr
4d10: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
4d20: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
4d30: 50 5f 53 70 61 6e 4f 6e 6c 79 29 20 29 7b 0a 20  P_SpanOnly) ){. 
4d40: 20 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64     if( p->span.d
4d50: 79 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  yn ) sqlite3DbFr
4d60: 65 65 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d  ee(db, (char*)p-
4d70: 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 69 66  >span.z);.    if
4d80: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
4d90: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
4da0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
4db0: 3e 70 4c 65 66 74 20 29 20 73 71 6c 69 74 65 33  >pLeft ) sqlite3
4dc0: 45 78 70 72 43 6c 65 61 72 28 64 62 2c 20 70 2d  ExprClear(db, p-
4dd0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 69  >pLeft);.      i
4de0: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 20 73  f( p->pRight ) s
4df0: 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 28  qlite3ExprClear(
4e00: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  db, p->pRight);.
4e10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4e20: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4e30: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29  te(db, p->pLeft)
4e40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
4e50: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
4e60: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  >pRight);.    }.
4e70: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
4e80: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
4e90: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
4ea0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
4eb0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
4ec0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c  Select);.    }el
4ed0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
4ee0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
4ef0: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  db, p->x.pList);
4f00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4f10: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
4f20: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
4f30: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f  sion tree..*/.vo
4f40: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
4f50: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
4f60: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
4f70: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
4f80: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c  .  sqlite3ExprCl
4f90: 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
4fa0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4fb0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  p);.}../*.** The
4fc0: 20 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c   Expr.token fiel
4fd0: 64 20 6d 69 67 68 74 20 62 65 20 61 20 73 74 72  d might be a str
4fe0: 69 6e 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ing literal that
4ff0: 20 69 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49   is quoted..** I
5000: 66 20 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65  f so, remove the
5010: 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73   quotation marks
5020: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5030: 33 44 65 71 75 6f 74 65 45 78 70 72 28 73 71 6c  3DequoteExpr(sql
5040: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
5050: 70 29 7b 0a 20 20 69 66 28 20 21 45 78 70 72 48  p){.  if( !ExprH
5060: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c  asAnyProperty(p,
5070: 20 45 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b   EP_Dequoted) ){
5080: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
5090: 65 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f  erty(p, EP_Dequo
50a0: 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ted);.    sqlite
50b0: 33 44 65 71 75 6f 74 65 28 28 63 68 61 72 2a 29  3Dequote((char*)
50c0: 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d  p->token.z);.  }
50d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
50e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
50f0: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
5100: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
5110: 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  n structure .** 
5120: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5130: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
5140: 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  is is always one
5150: 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   of EXPR_FULLSIZ
5160: 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43  E,.** EXPR_REDUC
5170: 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54  EDSIZE or EXPR_T
5180: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f  OKENONLYSIZE..*/
5190: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
51a0: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
51b0: 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48  *p){.  if( ExprH
51c0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
51d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65  _TokenOnly) ) re
51e0: 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  turn EXPR_TOKENO
51f0: 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45  NLYSIZE;.  if( E
5200: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5210: 2c 20 45 50 5f 53 70 61 6e 4f 6e 6c 79 29 20 29  , EP_SpanOnly) )
5220: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 53 50 41   return EXPR_SPA
5230: 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28  NONLYSIZE;.  if(
5240: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
5250: 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20  (p, EP_Reduced) 
5260: 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45  ) return EXPR_RE
5270: 44 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74  DUCEDSIZE;.  ret
5280: 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  urn EXPR_FULLSIZ
5290: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  E;.}../*.** sqli
52a0: 74 65 33 45 78 70 72 44 75 70 28 29 20 68 61 73  te3ExprDup() has
52b0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
52c0: 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
52d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 77 69   expression p wi
52e0: 74 68 0a 2a 2a 20 74 68 65 20 45 58 50 52 44 55  th.** the EXPRDU
52f0: 50 5f 58 58 58 20 66 6c 61 67 73 20 70 61 73 73  P_XXX flags pass
5300: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
5310: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20   argument. This 
5320: 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 72 65 74  function .** ret
5330: 75 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 72  urns the space r
5340: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20  equired for the 
5350: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
5360: 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 2e   structure only.
5370: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6c 77 61  .** This is alwa
5380: 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46  ys one of EXPR_F
5390: 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45  ULLSIZE, EXPR_RE
53a0: 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50  DUCEDSIZE or EXP
53b0: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
53c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
53d0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
53e0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
53f0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53  flags){.  int nS
5400: 69 7a 65 3b 0a 20 20 69 66 28 20 30 3d 3d 28 66  ize;.  if( 0==(f
5410: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
5420: 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a  UCE) ){.    nSiz
5430: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
5440: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  E;.  }else if( p
5450: 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 70 52  ->pLeft || p->pR
5460: 69 67 68 74 20 7c 7c 20 70 2d 3e 70 43 6f 6c 6c  ight || p->pColl
5470: 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   || p->x.pList )
5480: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58  {.    nSize = EX
5490: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
54a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
54b0: 73 26 28 45 58 50 52 44 55 50 5f 53 50 41 4e 7c  s&(EXPRDUP_SPAN|
54c0: 45 58 50 52 44 55 50 5f 44 49 53 54 49 4e 43 54  EXPRDUP_DISTINCT
54d0: 53 50 41 4e 29 20 29 7b 0a 20 20 20 20 6e 53 69  SPAN) ){.    nSi
54e0: 7a 65 20 3d 20 45 58 50 52 5f 53 50 41 4e 4f 4e  ze = EXPR_SPANON
54f0: 4c 59 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b  LYSIZE;.  }else{
5500: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50  .    nSize = EXP
5510: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b  R_TOKENONLYSIZE;
5520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53  .  }.  return nS
5530: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71  ize;.}../*.** sq
5540: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 20 68  lite3ExprDup() h
5550: 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
5560: 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  o create a copy 
5570: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  of expression p 
5580: 77 69 74 68 0a 2a 2a 20 74 68 65 20 45 58 50 52  with.** the EXPR
5590: 44 55 50 5f 58 58 58 20 70 61 73 73 65 64 20 61  DUP_XXX passed a
55a0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
55b0: 75 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63  ument. This func
55c0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20  tion returns.** 
55d0: 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74  the space in byt
55e0: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  es required to s
55f0: 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 66  tore the copy of
5600: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
5610: 75 72 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  ure.** and the c
5620: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 45 78 70  opies of the Exp
5630: 72 2e 74 6f 6b 65 6e 2e 7a 20 61 6e 64 20 45 78  r.token.z and Ex
5640: 70 72 2e 73 70 61 6e 2e 7a 20 28 69 66 20 61 70  pr.span.z (if ap
5650: 70 6c 69 63 61 62 6c 65 29 0a 2a 2a 20 73 74 72  plicable).** str
5660: 69 6e 67 20 62 75 66 66 65 72 73 2e 0a 2a 2f 0a  ing buffers..*/.
5670: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
5680: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
5690: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
56a0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
56b0: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
56c0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 2b 20  ize(p, flags) + 
56d0: 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 3f 20 70 2d  (p->token.z ? p-
56e0: 3e 74 6f 6b 65 6e 2e 6e 20 2b 20 31 20 3a 20 30  >token.n + 1 : 0
56f0: 29 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26  );.  if( (flags&
5700: 45 58 50 52 44 55 50 5f 44 49 53 54 49 4e 43 54  EXPRDUP_DISTINCT
5710: 53 50 41 4e 29 0a 20 20 20 7c 7c 20 28 66 6c 61  SPAN).   || (fla
5720: 67 73 26 45 58 50 52 44 55 50 5f 53 50 41 4e 20  gs&EXPRDUP_SPAN 
5730: 26 26 20 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d  && (p->token.z!=
5740: 70 2d 3e 73 70 61 6e 2e 7a 20 7c 7c 20 70 2d 3e  p->span.z || p->
5750: 74 6f 6b 65 6e 2e 6e 21 3d 70 2d 3e 73 70 61 6e  token.n!=p->span
5760: 2e 6e 29 29 20 0a 20 20 29 7b 0a 20 20 20 20 6e  .n)) .  ){.    n
5770: 42 79 74 65 20 2b 3d 20 70 2d 3e 73 70 61 6e 2e  Byte += p->span.
5780: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
5790: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d  ROUND8(nByte);.}
57a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
57b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
57c0: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  es required to c
57d0: 72 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74  reate a duplicat
57e0: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70  e of the .** exp
57f0: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
5800: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
5810: 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64  ment. The second
5820: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a   argument is a.*
5830: 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e  * mask containin
5840: 67 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c  g EXPRDUP_XXX fl
5850: 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ags..**.** The v
5860: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e  alue returned in
5870: 63 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20  cludes space to 
5880: 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
5890: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
58a0: 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74  .** itself and t
58b0: 68 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72  he buffer referr
58c0: 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e 74 6f  ed to by Expr.to
58d0: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 20 49 66 20  ken, if any. If 
58e0: 74 68 65 20 0a 2a 2a 20 45 58 50 52 44 55 50 5f  the .** EXPRDUP_
58f0: 53 50 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74  SPAN flag is set
5900: 2c 20 74 68 65 6e 20 73 70 61 63 65 20 74 6f 20  , then space to 
5910: 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
5920: 20 74 68 65 20 62 75 66 66 65 72 0a 2a 2a 20 72   the buffer.** r
5930: 65 66 65 72 65 64 20 74 6f 20 62 79 20 45 78 70  efered to by Exp
5940: 72 2e 73 70 61 6e 20 69 73 20 61 6c 73 6f 20 69  r.span is also i
5950: 6e 63 6c 75 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ncluded..**.** I
5960: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
5970: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
5980: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
5990: 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73  n value includes
59a0: 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75   .** space to du
59b0: 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72  plicate all Expr
59c0: 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72   nodes in the tr
59d0: 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70  ee formed by Exp
59e0: 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20  r.pLeft .** and 
59f0: 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69  Expr.pRight vari
5a00: 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66  ables (but not f
5a10: 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65  or any structure
5a20: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20  s pointed to or 
5a30: 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72  .** descended fr
5a40: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
5a50: 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53  ist or Expr.x.pS
5a60: 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29  elect variables)
5a70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5a80: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78  dupedExprSize(Ex
5a90: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
5aa0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
5ab0: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
5ac0: 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64     nByte = duped
5ad0: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
5ae0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
5af0: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
5b00: 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  DUCE ){.      in
5b10: 74 20 66 20 3d 20 66 6c 61 67 73 26 28 7e 28 45  t f = flags&(~(E
5b20: 58 50 52 44 55 50 5f 53 50 41 4e 7c 45 58 50 52  XPRDUP_SPAN|EXPR
5b30: 44 55 50 5f 44 49 53 54 49 4e 43 54 53 50 41 4e  DUP_DISTINCTSPAN
5b40: 29 29 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  ));.      nByte 
5b50: 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  += dupedExprSize
5b60: 28 70 2d 3e 70 4c 65 66 74 2c 20 66 29 20 2b 20  (p->pLeft, f) + 
5b70: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d  dupedExprSize(p-
5b80: 3e 70 52 69 67 68 74 2c 20 66 29 3b 0a 20 20 20  >pRight, f);.   
5b90: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5ba0: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
5bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5bc0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
5bd0: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
5be0: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
5bf0: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
5c00: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
5c10: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
5c20: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
5c30: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
5c40: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
5c50: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
5c60: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
5c70: 69 65 73 20 6f 66 20 70 2d 3e 74 6f 6b 65 6e 20  ies of p->token 
5c80: 61 6e 64 20 70 2d 3e 73 70 61 6e 20 0a 2a 2a 20  and p->span .** 
5c90: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
5ca0: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
5cb0: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
5cc0: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
5cd0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
5ce0: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
5cf0: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
5d00: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
5d10: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65  first byte passe
5d20: 64 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  d the.** portion
5d30: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
5d40: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
5d50: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
5d60: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
5d70: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
5d80: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
5d90: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
5da0: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
5db0: 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5dd0: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
5de0: 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  */.  if( p ){.  
5df0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
5e00: 71 75 69 72 65 44 69 73 74 69 6e 63 74 53 70 61  quireDistinctSpa
5e10: 6e 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52 44  n = (flags&EXPRD
5e20: 55 50 5f 44 49 53 54 49 4e 43 54 53 50 41 4e 29  UP_DISTINCTSPAN)
5e30: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
5e40: 69 73 52 65 71 75 69 72 65 53 70 61 6e 20 3d 20  isRequireSpan = 
5e50: 28 66 6c 61 67 73 26 28 45 58 50 52 44 55 50 5f  (flags&(EXPRDUP_
5e60: 53 50 41 4e 7c 45 58 50 52 44 55 50 5f 44 49 53  SPAN|EXPRDUP_DIS
5e70: 54 49 4e 43 54 53 50 41 4e 29 29 3b 0a 20 20 20  TINCTSPAN));.   
5e80: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64   const int isRed
5e90: 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58  uced = (flags&EX
5ea0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
5eb0: 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 0a     u8 *zAlloc;..
5ec0: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42 75      assert( pzBu
5ed0: 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64  ffer==0 || isRed
5ee0: 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  uced );..    /* 
5ef0: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
5f00: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
5f10: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
5f20: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a 42  . */.    if( pzB
5f30: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 7a  uffer ){.      z
5f40: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
5f50: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
5f60: 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c      zAlloc = sql
5f70: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
5f80: 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a  db, dupedExprSiz
5f90: 65 28 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20  e(p, flags));.  
5fa0: 20 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28    }.    pNew = (
5fb0: 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a  Expr *)zAlloc;..
5fc0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
5fd0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65        /* Set nNe
5fe0: 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  wSize to the siz
5ff0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
6000: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  the structure po
6010: 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a  inted to.      *
6020: 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20  * by pNew. This 
6030: 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46  is either EXPR_F
6040: 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45  ULLSIZE, EXPR_RE
6050: 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20  DUCEDSIZE or.   
6060: 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e     ** EXPR_TOKEN
6070: 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e  ONLYSIZE. nToken
6080: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
6090: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63  umber of bytes c
60a0: 6f 6e 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a  onsumed.      **
60b0: 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20   by the copy of 
60c0: 74 68 65 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 73  the p->token.z s
60d0: 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a  tring (if any)..
60e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
60f0: 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a  onst int nNewSiz
6100: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
6110: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6120: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
6130: 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 28 70 2d 3e  nt nToken = (p->
6140: 74 6f 6b 65 6e 2e 7a 20 3f 20 70 2d 3e 74 6f 6b  token.z ? p->tok
6150: 65 6e 2e 6e 20 2b 20 31 20 3a 20 30 29 3b 0a 20  en.n + 1 : 0);. 
6160: 20 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63       if( isReduc
6170: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ed ){.        as
6180: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
6190: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
61a0: 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ced)==0 );.     
61b0: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
61c0: 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a  , p, nNewSize);.
61d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
61e0: 20 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d       int nSize =
61f0: 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28   exprStructSize(
6200: 70 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  p);.        memc
6210: 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53  py(zAlloc, p, nS
6220: 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ize);.        me
6230: 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69  mset(&zAlloc[nSi
6240: 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c  ze], 0, EXPR_FUL
6250: 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20  LSIZE-nSize);.  
6260: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
6270: 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63  Set the EP_Reduc
6280: 65 64 20 61 6e 64 20 45 50 5f 54 6f 6b 65 6e 4f  ed and EP_TokenO
6290: 6e 6c 79 20 66 6c 61 67 73 20 61 70 70 72 6f 70  nly flags approp
62a0: 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20  riately. */.    
62b0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d    pNew->flags &=
62c0: 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50   ~(EP_Reduced|EP
62d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 70  _TokenOnly|EP_Sp
62e0: 61 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 73  anOnly);.      s
62f0: 77 69 74 63 68 28 20 6e 4e 65 77 53 69 7a 65 20  witch( nNewSize 
6300: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
6310: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6320: 3a 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20  :   pNew->flags 
6330: 7c 3d 20 45 50 5f 52 65 64 75 63 65 64 3b 20 62  |= EP_Reduced; b
6340: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
6350: 73 65 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  se EXPR_TOKENONL
6360: 59 53 49 5a 45 3a 20 70 4e 65 77 2d 3e 66 6c 61  YSIZE: pNew->fla
6370: 67 73 20 7c 3d 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs |= EP_TokenOn
6380: 6c 79 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ly; break;.     
6390: 20 20 20 63 61 73 65 20 45 58 50 52 5f 53 50 41     case EXPR_SPA
63a0: 4e 4f 4e 4c 59 53 49 5a 45 3a 20 20 70 4e 65 77  NONLYSIZE:  pNew
63b0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 53 70  ->flags |= EP_Sp
63c0: 61 6e 4f 6e 6c 79 3b 20 62 72 65 61 6b 3b 0a 20  anOnly; break;. 
63d0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
63e0: 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 74 6f 6b   Copy the p->tok
63f0: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
6400: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  y. */.      if( 
6410: 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  nToken ){.      
6420: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6430: 2a 7a 54 6f 6b 65 6e 20 3d 20 26 7a 41 6c 6c 6f  *zToken = &zAllo
6440: 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20  c[nNewSize];.   
6450: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b       memcpy(zTok
6460: 65 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  en, p->token.z, 
6470: 6e 54 6f 6b 65 6e 2d 31 29 3b 0a 20 20 20 20 20  nToken-1);.     
6480: 20 20 20 7a 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e     zToken[nToken
6490: 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  -1] = '\0';.    
64a0: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
64b0: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
64c0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d   pNew->token.z =
64d0: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d   zToken;.      }
64e0: 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
64f0: 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e  (p->flags|pNew->
6500: 66 6c 61 67 73 29 20 26 20 45 50 5f 54 6f 6b 65  flags) & EP_Toke
6510: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
6520: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
6530: 20 70 4e 65 77 2d 3e 73 70 61 6e 20 74 6f 6b 65   pNew->span toke
6540: 6e 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  n, if required. 
6550: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
6560: 73 52 65 71 75 69 72 65 53 70 61 6e 20 29 7b 0a  sRequireSpan ){.
6570: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
6580: 52 65 71 75 69 72 65 44 69 73 74 69 6e 63 74 53  RequireDistinctS
6590: 70 61 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20  pan .           
65a0: 7c 7c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 70  || p->token.z!=p
65b0: 2d 3e 73 70 61 6e 2e 7a 20 7c 7c 20 70 2d 3e 74  ->span.z || p->t
65c0: 6f 6b 65 6e 2e 6e 21 3d 70 2d 3e 73 70 61 6e 2e  oken.n!=p->span.
65d0: 6e 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  n.          ){. 
65e0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
65f0: 3e 73 70 61 6e 2e 7a 20 3d 20 26 7a 41 6c 6c 6f  >span.z = &zAllo
6600: 63 5b 6e 4e 65 77 53 69 7a 65 2b 6e 54 6f 6b 65  c[nNewSize+nToke
6610: 6e 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n];.            
6620: 6d 65 6d 63 70 79 28 28 63 68 61 72 20 2a 29 70  memcpy((char *)p
6630: 4e 65 77 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  New->span.z, p->
6640: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
6650: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
6660: 70 4e 65 77 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d  pNew->span.dyn =
6670: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
6680: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
6690: 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20   pNew->span.z = 
66a0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20  pNew->token.z;. 
66b0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
66c0: 3e 73 70 61 6e 2e 6e 20 3d 20 70 4e 65 77 2d 3e  >span.n = pNew->
66d0: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 20  token.n;.       
66e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
66f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
6700: 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a  ew->span.z = 0;.
6710: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6720: 73 70 61 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  span.n = 0;.    
6730: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
6740: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
6750: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
6760: 67 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e 4f  gs) & (EP_TokenO
6770: 6e 6c 79 7c 45 50 5f 53 70 61 6e 4f 6e 6c 79 29  nly|EP_SpanOnly)
6780: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
6790: 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77  Fill in the pNew
67a0: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70  ->x.pSelect or p
67b0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d  New->x.pList mem
67c0: 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ber. */.        
67d0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
67e0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
67f0: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
6800: 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63    pNew->x.pSelec
6810: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
6820: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53  tDup(db, p->x.pS
6830: 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63 65 64  elect, isReduced
6840: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
6850: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
6860: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69  ->x.pList = sqli
6870: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
6880: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  b, p->x.pList, i
6890: 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20  sReduced);.     
68a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
68b0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70      /* Fill in p
68c0: 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  New->pLeft and p
68d0: 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a  New->pRight. */.
68e0: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
68f0: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 4e 65  sAnyProperty(pNe
6900: 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  w, EP_Reduced|EP
6910: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 70  _TokenOnly|EP_Sp
6920: 61 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  anOnly) ){.     
6930: 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70     zAlloc += dup
6940: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70  edExprNodeSize(p
6950: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  , flags);.      
6960: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
6970: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
6980: 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20  educed) ){.     
6990: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
69a0: 20 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   = exprDup(db, p
69b0: 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50  ->pLeft, EXPRDUP
69c0: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
69d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  );.          pNe
69e0: 77 2d 3e 70 52 69 67 68 74 20 3d 20 65 78 70 72  w->pRight = expr
69f0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
6a00: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
6a10: 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20  E, &zAlloc);.   
6a20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
6a30: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
6a40: 20 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66           *pzBuff
6a50: 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20  er = zAlloc;.   
6a60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6a70: 73 65 20 69 66 28 20 21 45 78 70 72 48 61 73 41  se if( !ExprHasA
6a80: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
6a90: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 70  _TokenOnly|EP_Sp
6aa0: 61 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  anOnly) ){.     
6ab0: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
6ac0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
6ad0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29  db, p->pLeft, 0)
6ae0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
6af0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
6b00: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
6b10: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
6b20: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
6b30: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
6b40: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
6b50: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
6b60: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
6b70: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
6b80: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
6b90: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
6ba0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
6bb0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
6bc0: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
6bd0: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
6be0: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
6bf0: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
6c00: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
6c10: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
6c20: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
6c30: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
6c40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
6c50: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
6c60: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
6c70: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
6c80: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
6c90: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
6ca0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
6cb0: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
6cc0: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
6cd0: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
6ce0: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
6cf0: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
6d00: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
6d10: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
6d20: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
6d30: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
6d40: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
6d50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
6d60: 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
6d70: 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  ains a combinati
6d80: 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55  on of the EXPRDU
6d90: 50 5f 58 58 58 20 66 6c 61 67 73 2e 20 49 66 0a  P_XXX flags. If.
6da0: 2a 2a 20 74 68 65 20 45 58 50 52 44 55 50 5f 53  ** the EXPRDUP_S
6db0: 50 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74 20  PAN flag is set 
6dc0: 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
6dd0: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20  parameter, then 
6de0: 74 68 65 20 0a 2a 2a 20 45 78 70 72 2e 73 70 61  the .** Expr.spa
6df0: 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  n field of the i
6e00: 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20  nput expression 
6e10: 69 73 20 63 6f 70 69 65 64 2e 20 49 66 20 45 58  is copied. If EX
6e20: 50 52 44 55 50 5f 53 50 41 4e 20 69 73 0a 2a 2a  PRDUP_SPAN is.**
6e30: 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65   clear, then the
6e40: 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64   Expr.span field
6e50: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
6e60: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
6e70: 63 74 75 72 65 0a 2a 2a 20 69 73 20 7a 65 72 6f  cture.** is zero
6e80: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
6e90: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
6ea0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
6eb0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
6ec0: 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a  returned is a.**
6ed0: 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73 69   truncated versi
6ee0: 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20  on of the usual 
6ef0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 74  Expr structure t
6f00: 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  hat will be stor
6f10: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
6f20: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
6f30: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
6f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
6f50: 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  hema..*/.Expr *s
6f60: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73 71  qlite3ExprDup(sq
6f70: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
6f80: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
6f90: 20 20 72 65 74 75 72 6e 20 65 78 70 72 44 75 70    return exprDup
6fa0: 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30  (db, p, flags, 0
6fb0: 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
6fc0: 33 54 6f 6b 65 6e 43 6f 70 79 28 73 71 6c 69 74  3TokenCopy(sqlit
6fd0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
6fe0: 54 6f 2c 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  To, const Token 
6ff0: 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
7000: 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74 65  To->dyn ) sqlite
7010: 33 44 62 46 72 65 65 28 64 62 2c 20 28 63 68 61  3DbFree(db, (cha
7020: 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66  r*)pTo->z);.  if
7030: 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20  ( pFrom->z ){.  
7040: 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d    pTo->n = pFrom
7050: 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20  ->n;.    pTo->z 
7060: 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 44 62  = (u8*)sqlite3Db
7070: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
7080: 72 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72  r*)pFrom->z, pFr
7090: 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d  om->n);.    pTo-
70a0: 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  >dyn = 1;.  }els
70b0: 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20  e{.    pTo->z = 
70c0: 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73  0;.  }.}.ExprLis
70d0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
70e0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
70f0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  b, ExprList *p, 
7100: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78  int flags){.  Ex
7110: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
7120: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
7130: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
7140: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
7150: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
7160: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
7170: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7180: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
7190: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
71a0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
71b0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72  0;.  pNew->iECur
71c0: 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  sor = 0;.  pNew-
71d0: 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e  >nExpr = pNew->n
71e0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72  Alloc = p->nExpr
71f0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49  ;.  pNew->a = pI
7200: 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tem = sqlite3DbM
7210: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20 70 2d  allocRaw(db,  p-
7220: 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d  >nExpr*sizeof(p-
7230: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
7240: 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pItem==0 ){.    
7250: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7260: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  , pNew);.    ret
7270: 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f  urn 0;.  } .  pO
7280: 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20  ldItem = p->a;. 
7290: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
72a0: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
72b0: 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b  ++, pOldItem++){
72c0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
72d0: 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
72e0: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
72f0: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70  em->pExpr;.    p
7300: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e  Item->pExpr = pN
7310: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
7320: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
7330: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
7340: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
7350: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7360: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7370: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
7380: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
7390: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
73a0: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
73b0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
73c0: 6d 2d 3e 69 43 6f 6c 20 3d 20 70 4f 6c 64 49 74  m->iCol = pOldIt
73d0: 65 6d 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 70 49  em->iCol;.    pI
73e0: 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 70 4f  tem->iAlias = pO
73f0: 6c 64 49 74 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a  ldItem->iAlias;.
7400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
7410: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
7420: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
7430: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
7440: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
7450: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
7460: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
7470: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
7480: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
7490: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
74a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
74b0: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
74c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
74d0: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
74e0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
74f0: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
7500: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
7510: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
7520: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
7530: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
7540: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
7550: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
7560: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
7570: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
7580: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
7590: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
75a0: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
75b0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
75c0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
75d0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
75e0: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
75f0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
7600: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
7610: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
7620: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
7630: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
7640: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
7650: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
7660: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7670: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
7680: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
7690: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
76a0: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
76b0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
76c0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
76d0: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
76e0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
76f0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
7700: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
7710: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
7720: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
7730: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
7740: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7750: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
7760: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
7770: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
7780: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7790: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
77a0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
77b0: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
77c0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
77d0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
77e0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
77f0: 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64  >jointype = pOld
7800: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
7810: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
7820: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
7830: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
7840: 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  NewItem->isPopul
7850: 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ated = pOldItem-
7860: 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20  >isPopulated;.  
7870: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64    pNewItem->zInd
7880: 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ex = sqlite3DbSt
7890: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
78a0: 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20  m->zIndex);.    
78b0: 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  pNewItem->notInd
78c0: 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  exed = pOldItem-
78d0: 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20  >notIndexed;.   
78e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65   pNewItem->pInde
78f0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49  x = pOldItem->pI
7900: 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d  ndex;.    pTab =
7910: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
7920: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
7930: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
7940: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
7950: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
7960: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
7970: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
7980: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
7990: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
79a0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
79b0: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
79c0: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
79d0: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
79e0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
79f0: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
7a00: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
7a10: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
7a20: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
7a30: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
7a40: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
7a50: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7a60: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
7a70: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
7a80: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
7a90: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
7aa0: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  w;.  int i;.  if
7ab0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7ac0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
7ad0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7ae0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
7af0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7b00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7b10: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77  pNew->nId = pNew
7b20: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49  ->nAlloc = p->nI
7b30: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
7b40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7b50: 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a  w(db, p->nId*siz
7b60: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
7b70: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
7b80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
7b90: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
7ba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7bb0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
7bc0: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
7bd0: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
7be0: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
7bf0: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
7c00: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
7c10: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
7c20: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
7c30: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
7c40: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7c50: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7c60: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
7c70: 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49  tem->idx = pOldI
7c80: 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20  tem->idx;.  }.  
7c90: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53  return pNew;.}.S
7ca0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
7cb0: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
7cc0: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
7cd0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65  int flags){.  Se
7ce0: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66  lect *pNew;.  if
7cf0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7d00: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
7d10: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7d20: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  b, sizeof(*p) );
7d30: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
7d40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2f 2a 20   return 0;.  /* 
7d50: 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f  Always make a co
7d60: 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66  py of the span f
7d70: 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70  or top-level exp
7d80: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a  ressions in the.
7d90: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
7da0: 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67 69 63  list.  The logic
7db0: 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f 63 65   in SELECT proce
7dc0: 73 73 69 6e 67 20 74 68 61 74 20 64 65 74 65 72  ssing that deter
7dd0: 6d 69 6e 65 73 0a 20 20 2a 2a 20 74 68 65 20 6e  mines.  ** the n
7de0: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  ames of columns 
7df0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7e00: 74 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66  t needs this inf
7e10: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 70 4e  ormation */.  pN
7e20: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
7e30: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
7e40: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66  db, p->pEList, f
7e50: 6c 61 67 73 7c 45 58 50 52 44 55 50 5f 53 50 41  lags|EXPRDUP_SPA
7e60: 4e 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  N);.  pNew->pSrc
7e70: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
7e80: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
7e90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7ea0: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
7eb0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
7ec0: 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b  >pWhere, flags);
7ed0: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
7ee0: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
7ef0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47  istDup(db, p->pG
7f00: 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a  roupBy, flags);.
7f10: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
7f20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7f30: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
7f40: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7f50: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
7f60: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
7f70: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
7f80: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
7f90: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
7fa0: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c  ew->pPrior = sql
7fb0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
7fc0: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61  , p->pPrior, fla
7fd0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  gs);.  pNew->pLi
7fe0: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mit = sqlite3Exp
7ff0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  rDup(db, p->pLim
8000: 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  it, flags);.  pN
8010: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71  ew->pOffset = sq
8020: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
8030: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61   p->pOffset, fla
8040: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  gs);.  pNew->iLi
8050: 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
8060: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >iOffset = 0;.  
8070: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
8080: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e   p->selFlags & ~
8090: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
80a0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
80b0: 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  most = 0;.  pNew
80c0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
80d0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
80e0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
80f0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
8100: 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
8110: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  -1;.  return pNe
8120: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
8130: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
8140: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
8150: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
8160: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
8170: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
8180: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
8190: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
81a0: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
81b0: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
81c0: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
81d0: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
81e0: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
81f0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
8200: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
8210: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
8220: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
8230: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8240: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
8250: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
8260: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
8270: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
8280: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
8290: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
82a0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
82b0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
82c0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
82d0: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
82e0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
82f0: 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
8300: 41 53 20 6b 65 79 77 6f 72 64 20 66 6f 72 20 74  AS keyword for t
8310: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  he expression */
8320: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
8330: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8340: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
8350: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
8360: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
8370: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  o(db, sizeof(Exp
8380: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
8390: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
83a0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
83b0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
83c0: 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  t( pList->nAlloc
83d0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ==0 );.  }.  if(
83e0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d   pList->nAlloc<=
83f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  pList->nExpr ){.
8400: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
8410: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
8420: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e   int n = pList->
8430: 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20  nAlloc*2 + 4;.  
8440: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
8450: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74  ealloc(db, pList
8460: 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c  ->a, n*sizeof(pL
8470: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
8480: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
8490: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
84a0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
84b0: 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73  >a = a;.    pLis
84c0: 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  t->nAlloc = sqli
84d0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
84e0: 64 62 2c 20 61 29 2f 73 69 7a 65 6f 66 28 61 5b  db, a)/sizeof(a[
84f0: 30 5d 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  0]);.  }.  asser
8500: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29  t( pList->a!=0 )
8510: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c  ;.  if( pExpr ||
8520: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74   pName ){.    st
8530: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8540: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
8550: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
8560: 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  pr++];.    memse
8570: 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  t(pItem, 0, size
8580: 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20  of(*pItem));.   
8590: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
85a0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
85b0: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
85c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
85d0: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70  r = pExpr;.    p
85e0: 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30  Item->iAlias = 0
85f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8600: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
8610: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
8620: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
8630: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
8640: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
8650: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
8660: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
8670: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
8680: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
8690: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
86a0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
86b0: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
86c0: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
86d0: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
86e0: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
86f0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
8700: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
8710: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
8720: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
8730: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
8740: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
8750: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
8760: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
8770: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
8780: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8790: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74  MIT_COLUMN];.  t
87a0: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
87b0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
87c0: 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61  ==mx );.  testca
87d0: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
87e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b  List->nExpr==mx+
87f0: 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  1 );.  if( pELis
8800: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
8810: 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c  pr>mx ){.    sql
8820: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8830: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
8840: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
8850: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
8860: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
8870: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
8880: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  n list..*/.void 
8890: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
88a0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
88b0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
88c0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
88d0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
88e0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
88f0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
8900: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
8910: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28  pList->a!=0 || (
8920: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20  pList->nExpr==0 
8930: 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  && pList->nAlloc
8940: 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
8950: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d  ( pList->nExpr<=
8960: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b  pList->nAlloc );
8970: 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
8980: 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
8990: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
89a0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
89b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
89c0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  (db, pItem->pExp
89d0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  r);.    sqlite3D
89e0: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
89f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  >zName);.  }.  s
8a00: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8a10: 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71   pList->a);.  sq
8a20: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8a30: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
8a40: 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
8a50: 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  are Walker callb
8a60: 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75 2e  acks.  Walker.u.
8a70: 70 69 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a  pi is a pointer.
8a80: 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ** to an integer
8a90: 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
8aa0: 73 20 61 72 65 20 63 68 65 63 6b 69 6e 67 20 61  s are checking a
8ab0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
8ac0: 73 65 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  see.** if it is 
8ad0: 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 74  a constant.  Set
8ae0: 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74 6f   *Walker.u.pi to
8af0: 20 30 20 69 66 20 74 68 65 20 65 78 70 72 65 73   0 if the expres
8b00: 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 63  sion is.** not c
8b10: 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  onstant..**.** T
8b20: 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f  hese callback ro
8b30: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
8b40: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
8b50: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
8b60: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
8b70: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a 2a  rIsConstant().**
8b80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8b90: 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
8ba0: 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  n().**     sqlit
8bb0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
8bc0: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a 0a  OrFunction().**.
8bd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
8be0: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
8bf0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
8c00: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
8c10: 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72  .  /* If pWalker
8c20: 2d 3e 75 2e 69 20 69 73 20 33 20 74 68 65 6e 20  ->u.i is 3 then 
8c30: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
8c40: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
8c50: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
8c60: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
8c70: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69  clauses of a joi
8c80: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
8c90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
8ca0: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
8cb0: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
8cc0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
8cd0: 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20 45  ker->u.i==3 && E
8ce0: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
8cf0: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
8d00: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61  Join) ){.    pWa
8d10: 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20  lker->u.i = 0;. 
8d20: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
8d30: 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  ort;.  }..  swit
8d40: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
8d50: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  .    /* Consider
8d60: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
8d70: 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c   constant if all
8d80: 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73   their arguments
8d90: 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20   are constant.  
8da0: 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b 65 72    ** and pWalker
8db0: 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20 20  ->u.i==2 */.    
8dc0: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
8dd0: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
8de0: 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20 72 65  ker->u.i==2 ) re
8df0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a  turn 0;.      /*
8e00: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
8e10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
8e20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
8e30: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
8e40: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
8e50: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
8e60: 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53  OLUMN:.#ifndef S
8e70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
8e80: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
8e90: 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65  SELECT:.    case
8ea0: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
8eb0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
8ec0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
8ed0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8ee0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
8ef0: 4b 5f 45 58 49 53 54 53 20 29 3b 0a 23 65 6e 64  K_EXISTS );.#end
8f00: 69 66 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  if.      testcas
8f10: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
8f20: 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _ID );.      tes
8f30: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
8f40: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
8f50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8f60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
8f70: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
8f80: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
8f90: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
8fa0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70  OLUMN );.      p
8fb0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b  Walker->u.i = 0;
8fc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
8fd0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 64 65 66  C_Abort;.    def
8fe0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
8ff0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
9000: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e  .  }.}.static in
9010: 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  t selectNodeIsCo
9020: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
9030: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
9040: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
9050: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
9060: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
9070: 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74  ->u.i = 0;.  ret
9080: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d  urn WRC_Abort;.}
9090: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
90a0: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
90b0: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a   int initFlag){.
90c0: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
90d0: 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  u.i = initFlag;.
90e0: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
90f0: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
9100: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
9110: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
9120: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
9130: 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  nt;.  sqlite3Wal
9140: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
9150: 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a  return w.u.i;.}.
9160: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
9170: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9180: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
9190: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
91a0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
91b0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
91c0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
91d0: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
91e0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
91f0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
9200: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
9210: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
9220: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
9230: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
9240: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
9250: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
9260: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
9270: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
9280: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
9290: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
92a0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
92b0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b  prIsConst(p, 1);
92c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
92d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
92e0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
92f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9300: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
9310: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
9320: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
9330: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9340: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
9350: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
9360: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
9370: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
9380: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
9390: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
93a0: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
93b0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
93c0: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
93d0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
93e0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
93f0: 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 3);.}../*.** W
9400: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9410: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9420: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9430: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9440: 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
9450: 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
9460: 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
9470: 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
9480: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
9490: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
94a0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
94b0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
94c0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
94d0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
94e0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
94f0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
9500: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
9510: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
9520: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
9530: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
9540: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
9550: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9560: 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ion(Expr *p){.  
9570: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
9580: 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 2);.}../*.
9590: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
95a0: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
95b0: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
95c0: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
95d0: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
95e0: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
95f0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
9600: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
9610: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
9620: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
9630: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9640: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
9650: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
9660: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
9670: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
9680: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
9690: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
96a0: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
96b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
96c0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
96d0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
96e0: 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
96f0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  0;.  if( p->flag
9700: 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
9710: 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d  ){.    *pValue =
9720: 20 70 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20   p->iTable;.    
9730: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
9740: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
9750: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
9760: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63  EGER: {.      rc
9770: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74   = sqlite3GetInt
9780: 33 32 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b  32((char*)p->tok
9790: 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 3b 0a 20  en.z, pValue);. 
97a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
97b0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
97c0: 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  LUS: {.      rc 
97d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  = sqlite3ExprIsI
97e0: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
97f0: 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   pValue);.      
9800: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9810: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
9820: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
9830: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9840: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
9850: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
9860: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
9870: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
9880: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9890: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
98a0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
98b0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  eak;.  }.  if( r
98c0: 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  c ){.    p->op =
98d0: 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20   TK_INTEGER;.   
98e0: 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   p->flags |= EP_
98f0: 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 70 2d  IntValue;.    p-
9900: 3e 69 54 61 62 6c 65 20 3d 20 2a 70 56 61 6c 75  >iTable = *pValu
9910: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
9920: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
9930: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
9940: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
9950: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
9960: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
9970: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
9980: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
9990: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
99a0: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
99b0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
99c0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
99d0: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
99e0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
99f0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
9a00: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
9a10: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
9a20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9a30: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
9a40: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
9a50: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
9a60: 65 6e 61 62 6c 65 64 20 61 6e 64 0a 2a 2a 20 74  enabled and.** t
9a70: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9a80: 65 6e 74 20 70 20 65 78 69 73 74 73 20 61 6e 64  ent p exists and
9a90: 20 69 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73 69   is of the.** si
9aa0: 6d 70 6c 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  mple form:.**.**
9ab0: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
9ac0: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
9ad0: 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  >.**.** If this 
9ae0: 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
9af0: 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20  may be possible 
9b00: 74 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74 69  to use an existi
9b10: 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 6f 72 20 69  ng table.** or i
9b20: 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
9b30: 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70  generating an ep
9b40: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
9b50: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
9b60: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
9b70: 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64  tatic int isCand
9b80: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65  idateForInOpt(Se
9b90: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
9ba0: 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
9bb0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
9bc0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
9bd0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
9be0: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
9bf0: 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d         /* right-
9c00: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20  hand side of IN 
9c10: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  is SELECT */.  i
9c20: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
9c30: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
9c40: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
9c50: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
9c60: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
9c70: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
9c80: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
9c90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9ca0: 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e   0; /* No DISTIN
9cb0: 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e  CT keyword and n
9cc0: 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
9cd0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 69  tions */.  }.  i
9ce0: 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  f( p->pGroupBy )
9cf0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
9d00: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
9d10: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
9d20: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  */.  if( p->pLim
9d30: 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
9d50: 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75  as no LIMIT clau
9d60: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
9d70: 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
9d80: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  0;.  if( p->pWhe
9d90: 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
9db0: 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
9dc0: 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70  se */.  pSrc = p
9dd0: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
9de0: 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69  ( pSrc!=0 );.  i
9df0: 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  f( pSrc->nSrc!=1
9e00: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
9e10: 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20        /* Single 
9e20: 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61  term in FROM cla
9e30: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  use */.  if( pSr
9e40: 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  c->a[0].pSelect 
9e50: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
9e60: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  /* FROM clause i
9e70: 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  s not a subquery
9e80: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72   */.  pTab = pSr
9e90: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
9ea0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
9eb0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54  turn 0;.  if( pT
9ec0: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65  ab->pSelect ) re
9ed0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
9ee0: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
9ef0: 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f  is not a view */
9f00: 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
9f10: 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
9f20: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f  0;        /* FRO
9f30: 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76  M clause not a v
9f40: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
9f50: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
9f60: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
9f70: 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
9f80: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f  eturn 0;       /
9f90: 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  * One column in 
9fa0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
9fb0: 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  /.  if( pEList->
9fc0: 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d  a[0].pExpr->op!=
9fd0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
9fe0: 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20  rn 0; /* Result 
9ff0: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  is a column */. 
a000: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
a010: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
a020: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
a030: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
a040: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
a050: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
a060: 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e  n of the IN (...
a070: 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49  ) operator..** I
a080: 74 27 73 20 6a 6f 62 20 69 73 20 74 6f 20 66 69  t's job is to fi
a090: 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
a0a0: 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
a0b0: 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64  that may be used
a0c0: 0a 2a 2a 20 65 69 74 68 65 72 20 74 6f 20 74 65  .** either to te
a0d0: 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
a0e0: 70 20 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20 73  p of the (...) s
a0f0: 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65  et or to iterate
a100: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73 20   through.** its 
a110: 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e  members, skippin
a120: 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
a130: 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f  .** The cursor o
a140: 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 73 74 72  pened on the str
a150: 75 63 74 75 72 65 20 28 64 61 74 61 62 61 73 65  ucture (database
a160: 20 74 61 62 6c 65 2c 20 64 61 74 61 62 61 73 65   table, database
a170: 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 72 20 65 70   index .** or ep
a180: 68 65 72 6d 61 6c 20 74 61 62 6c 65 29 20 69 73  hermal table) is
a190: 20 73 74 6f 72 65 64 20 69 6e 20 70 58 2d 3e 69   stored in pX->i
a1a0: 54 61 62 6c 65 20 62 65 66 6f 72 65 20 74 68 69  Table before thi
a1b0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
a1c0: 6e 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ns..** The retur
a1d0: 6e 65 64 20 76 61 6c 75 65 20 69 6e 64 69 63 61  ned value indica
a1e0: 74 65 73 20 74 68 65 20 73 74 72 75 63 74 75 72  tes the structur
a1f0: 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
a200: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
a210: 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68 65  NDEX_ROWID - The
a220: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
a230: 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
a240: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
a250: 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54 68  INDEX_INDEX - Th
a260: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
a270: 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
a280: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  e index..**   IN
a290: 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20 54  _INDEX_EPH -   T
a2a0: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
a2b0: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
a2c0: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
a2d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
a2e0: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
a2f0: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
a300: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
a310: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6d 61 79  ng structure may
a320: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66   only be used if
a330: 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
a340: 66 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20  f the simple.** 
a350: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
a360: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
a370: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
a380: 2a 2a 20 49 66 20 70 72 4e 6f 74 46 6f 75 6e 64  ** If prNotFound
a390: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
a3a0: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
a3b0: 75 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ure will be used
a3c0: 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74   to iterate.** t
a3d0: 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d  hrough the set m
a3e0: 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67  embers, skipping
a3f0: 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e   any duplicates.
a400: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   In this case an
a410: 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61  .** epheremal ta
a420: 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64  ble must be used
a430: 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65   unless the sele
a440: 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  cted <column> is
a450: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
a460: 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69  o be unique - ei
a470: 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20  ther because it 
a480: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
a490: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a  IMARY KEY or it.
a4a0: 2a 2a 20 69 73 20 75 6e 69 71 75 65 20 62 79 20  ** is unique by 
a4b0: 76 69 72 74 75 65 20 6f 66 20 61 20 63 6f 6e 73  virtue of a cons
a4c0: 74 72 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63  traint or implic
a4d0: 69 74 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  it index..**.** 
a4e0: 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e  If the prNotFoun
a4f0: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  d parameter is n
a500: 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20 73  ot 0, then the s
a510: 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 62 65  tructure will be
a520: 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
a530: 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
a540: 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73  p tests. In this
a550: 20 63 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d   case an epherem
a560: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a  al table must .*
a570: 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  * be used unless
a580: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20   <column> is an 
a590: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
a5a0: 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  KEY or an index 
a5b0: 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64  can .** be found
a5c0: 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61   with <column> a
a5d0: 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20  s its left-most 
a5e0: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  column..**.** Wh
a5f0: 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  en the structure
a600: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66   is being used f
a610: 6f 72 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  or set membershi
a620: 70 20 74 65 73 74 73 2c 20 74 68 65 20 75 73 65  p tests, the use
a630: 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e  r.** needs to kn
a640: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
a650: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
a660: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c 20  contains an SQL 
a670: 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69  NULL .** value i
a680: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 72 72 65  n order to corre
a690: 63 74 6c 79 20 65 76 61 6c 75 61 74 65 20 65 78  ctly evaluate ex
a6a0: 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22  pressions like "
a6b0: 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a  X IN (Y, Z)"..**
a6c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 63   If there is a c
a6d0: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 73  hance that the s
a6e0: 74 72 75 63 74 75 72 65 20 6d 61 79 20 63 6f 6e  tructure may con
a6f0: 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75  tain a NULL valu
a700: 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c  e at.** runtime,
a710: 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72   then a register
a720: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
a730: 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  d the register n
a740: 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a  umber written.**
a750: 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e   to *prNotFound.
a760: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
a770: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
a780: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
a790: 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  ns a.** NULL val
a7a0: 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46  ue, then *prNotF
a7b0: 6f 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63  ound is left unc
a7c0: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
a7d0: 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
a7e0: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73  llocated and its
a7f0: 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64   location stored
a800: 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c   in *prNotFound,
a810: 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69   then.** its ini
a820: 74 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55  tial value is NU
a830: 4c 4c 2e 20 49 66 20 74 68 65 20 73 74 72 75 63  LL. If the struc
a840: 74 75 72 65 20 64 6f 65 73 20 6e 6f 74 20 72 65  ture does not re
a850: 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  main constant.**
a860: 20 66 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f   for the duratio
a870: 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 28  n of the query (
a880: 69 2e 65 2e 20 74 68 65 20 73 65 74 20 69 73 20  i.e. the set is 
a890: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
a8a0: 2d 73 65 6c 65 63 74 29 2c 20 0a 2a 2a 20 74 68  -select), .** th
a8b0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61  e value of the a
a8c0: 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74 65  llocated registe
a8d0: 72 20 69 73 20 72 65 73 65 74 20 74 6f 20 4e 55  r is reset to NU
a8e0: 4c 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68 65  LL each time the
a8f0: 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69   .** structure i
a900: 73 20 72 65 70 6f 70 75 6c 61 74 65 64 2e 20 54  s repopulated. T
a910: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  his allows the c
a920: 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64 62  aller to use vdb
a930: 65 20 63 6f 64 65 20 0a 2a 2a 20 65 71 75 69 76  e code .** equiv
a940: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c  alent to the fol
a950: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
a960: 69 66 28 20 72 65 67 69 73 74 65 72 3d 3d 4e 55  if( register==NU
a970: 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61 73  LL ){.**     has
a980: 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69 66  _null = <test if
a990: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
a9a0: 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a  contains null>.*
a9b0: 2a 20 20 20 20 20 72 65 67 69 73 74 65 72 20 3d  *     register =
a9c0: 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20   1.**   }.**.** 
a9d0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
a9e0: 64 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c 74  d running the <t
a9f0: 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75  est if data stru
aa00: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e  cture contains n
aa10: 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f 72  ull>.** test mor
aa20: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 69 73 20  e often than is 
aa30: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23 69  necessary..*/.#i
aa40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
aa50: 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
aa60: 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
aa70: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
aa80: 20 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 2a   Expr *pX, int *
aa90: 70 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 53  prNotFound){.  S
aaa0: 65 6c 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20  elect *p;.  int 
aab0: 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  eType = 0;.  int
aac0: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
aad0: 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 6d 75  nTab++;.  int mu
aae0: 73 74 42 65 55 6e 69 71 75 65 20 3d 20 21 70 72  stBeUnique = !pr
aaf0: 4e 6f 74 46 6f 75 6e 64 3b 0a 0a 20 20 2f 2a 20  NotFound;..  /* 
ab00: 54 68 65 20 66 6f 6c 6c 77 69 6e 67 20 69 66 28  The follwing if(
ab10: 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 20  ...) expression 
ab20: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 53  is true if the S
ab30: 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
ab40: 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 66 6f 72  .  ** simple for
ab50: 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
ab60: 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e   SELECT <column>
ab70: 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 20 20   FROM <table>.  
ab80: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
ab90: 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
aba0: 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20  may be possible 
abb0: 74 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74 69  to use an existi
abc0: 6e 67 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72  ng table.  ** or
abd0: 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f   index instead o
abe0: 66 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20  f generating an 
abf0: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
ac00: 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70  .  */.  p = (Exp
ac10: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
ac20: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f   EP_xIsSelect) ?
ac30: 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a   pX->x.pSelect :
ac40: 20 30 29 3b 0a 20 20 69 66 28 20 69 73 43 61 6e   0);.  if( isCan
ac50: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
ac60: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
ac70: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
ac80: 62 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  b;.    Index *pI
ac90: 64 78 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  dx;.    Expr *pE
aca0: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
acb0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
acc0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
acd0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
ace0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
acf0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ad00: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66  ;..    /* This f
ad10: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
ad20: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20  called from two 
ad30: 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20  places. In both 
ad40: 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20  cases the vdbe. 
ad50: 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
ad60: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
ad70: 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69  . So assume sqli
ad80: 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20  te3GetVdbe() is 
ad90: 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75  always.    ** su
ada0: 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20  ccessful here.. 
adb0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
adc0: 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  (v);.    if( iCo
add0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l<0 ){.      int
ade0: 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
adf0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e  ->nMem;.      in
ae00: 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20 54  t iAddr;.      T
ae10: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e  able *pTab = p->
ae20: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
ae30: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
ae40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
ae50: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
ae60: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
ae70: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
ae80: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20  tree(v, iDb);.. 
ae90: 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c       iAddr = sql
aea0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
aeb0: 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a  , OP_If, iMem);.
aec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aed0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
aee0: 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b  teger, 1, iMem);
aef0: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ..      sqlite3O
af00: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
af10: 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
af20: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
af30: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
af40: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20  _INDEX_ROWID;.. 
af50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
af60: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
af70: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
af80: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
af90: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
afa0: 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
afb0: 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
afc0: 65 78 20 69 73 20 74 6f 20 0a 20 20 20 20 20 20  ex is to .      
afd0: 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  ** be used in pl
afe0: 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61  ace of a temp-ta
aff0: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
b000: 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e  ordered accordin
b010: 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  g.      ** to th
b020: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
b030: 75 65 6e 63 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  uence..      */.
b040: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
b050: 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
b060: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
b070: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
b080: 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  eft, pExpr);..  
b090: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
b0a0: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
b0b0: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
b0c0: 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20   to perform the 
b0d0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
b0e0: 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
b0f0: 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
b100: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
b110: 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  If.      ** it i
b120: 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  s not, it is not
b130: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
b140: 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20   any index..    
b150: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
b160: 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63   *pTab = p->pSrc
b170: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[0].pTab;.   
b180: 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f     char aff = co
b190: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
b1a0: 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (pX);.      int 
b1b0: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70  affinity_ok = (p
b1c0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
b1d0: 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61  affinity==aff||a
b1e0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
b1f0: 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  ONE);..      for
b200: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
b210: 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
b220: 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
b230: 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
b240: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
b250: 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c  if( (pIdx->aiCol
b260: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20  umn[0]==iCol).  
b270: 20 20 20 20 20 20 20 26 26 20 28 70 52 65 71 3d         && (pReq=
b280: 3d 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c  =sqlite3FindColl
b290: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
b2a0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
b2b0: 2c 20 2d 31 2c 20 30 29 29 0a 20 20 20 20 20 20  , -1, 0)).      
b2c0: 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e     && (!mustBeUn
b2d0: 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e  ique || (pIdx->n
b2e0: 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64  Column==1 && pId
b2f0: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
b300: 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b  one)).        ){
b310: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
b320: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  Db;.          in
b330: 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
b340: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
b350: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20     int iAddr;.  
b360: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4b          char *pK
b370: 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  ey;.  .         
b380: 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29   pKey = (char *)
b390: 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
b3a0: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
b3b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 44 62  );.          iDb
b3c0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
b3d0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78  ToIndex(db, pIdx
b3e0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
b3f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b400: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
b410: 62 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69  b);..          i
b420: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
b430: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
b440: 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  f, iMem);.      
b450: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b460: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
b470: 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20  ger, 1, iMem);. 
b480: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
b490: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
b4a0: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
b4b0: 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ab, pIdx->tnum, 
b4c0: 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59 49      pKey,P4_KEYI
b4f0: 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
b500: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
b510: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
b520: 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
b530: 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
b540: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a 0a  N_INDEX_INDEX;..
b550: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b560: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b570: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20   iAddr);.       
b580: 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e     if( prNotFoun
b590: 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c  d && !pTab->aCol
b5a0: 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29  [iCol].notNull )
b5b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
b5c0: 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50  rNotFound = ++pP
b5d0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
b5e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b5f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
b600: 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
b610: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ==0 ){.    int r
b620: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b  MayHaveNull = 0;
b630: 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
b640: 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69  INDEX_EPH;.    i
b650: 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29 7b  f( prNotFound ){
b660: 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75  .      *prNotFou
b670: 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c  nd = rMayHaveNul
b680: 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
b690: 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  em;.    }else if
b6a0: 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  ( pX->pLeft->iCo
b6b0: 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48  lumn<0 && !ExprH
b6c0: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 58  asAnyProperty(pX
b6d0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
b6e0: 29 7b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  ){.      eType =
b6f0: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
b700: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b710: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
b720: 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79  pParse, pX, rMay
b730: 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d  HaveNull, eType=
b740: 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29  =IN_INDEX_ROWID)
b750: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b760: 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  X->iTable = iTab
b770: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  ;.  }.  return e
b780: 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Type;.}.#endif..
b790: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
b7a0: 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
b7b0: 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
b7c0: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  s an expression.
b7d0: 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74  ** and IN operat
b7e0: 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
b7f0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
b800: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
b810: 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
b820: 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
b830: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
b840: 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
b850: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
b860: 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
b870: 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
b880: 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
b890: 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
b8a0: 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
b8b0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
b8c0: 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
b8d0: 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
b8e0: 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
b8f0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
b900: 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
b910: 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
b920: 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
b930: 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
b940: 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
b950: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
b960: 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e  ter isRowid is n
b970: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78  on-zero, then ex
b980: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
b990: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
b9a0: 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  to be of the for
b9b0: 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f  m "<rowid> IN (?
b9c0: 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20  , ?, ?)", where 
b9d0: 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66  <rowid> is a ref
b9e0: 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d  erence.** to som
b9f0: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f  e integer key co
ba00: 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20  lumn of a table 
ba10: 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
ba20: 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20  case, use an.** 
ba30: 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f  intkey B-Tree to
ba40: 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
ba50: 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73  f IN(...) values
ba60: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
ba70: 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72  usual.** (slower
ba80: 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  ) variable lengt
ba90: 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a  h keys B-Tree..*
baa0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
bab0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 76  _OMIT_SUBQUERY.v
bac0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 53  oid sqlite3CodeS
bad0: 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73  ubselect(.  Pars
bae0: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78  e *pParse, .  Ex
baf0: 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 69 6e  pr *pExpr, .  in
bb00: 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 0a  t rMayHaveNull,.
bb10: 20 20 69 6e 74 20 69 73 52 6f 77 69 64 0a 29 7b    int isRowid.){
bb20: 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20  .  int testAddr 
bb30: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
bb40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
bb50: 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
bb60: 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ess */.  Vdbe *v
bb70: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
bb80: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
bb90: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
bba0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
bbb0: 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20   must be run in 
bbc0: 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65  its entirety eve
bbd0: 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  ry time it is en
bbe0: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69  countered.  ** i
bbf0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
bc00: 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a  lowing is true:.
bc10: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20    **.  **    *  
bc20: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
bc30: 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ide is a correla
bc40: 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a  ted subquery.  *
bc50: 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
bc60: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
bc70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
bc80: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72  t containing var
bc90: 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a  iables.  **    *
bca0: 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20    We are inside 
bcb0: 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20  a trigger.  **. 
bcc0: 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   ** If all of th
bcd0: 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73  e above are fals
bce0: 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  e, then we can r
bcf0: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73  un this code jus
bd00: 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65  t once.  ** save
bd10: 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e   the results, an
bd20: 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  d reuse the same
bd30: 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
bd40: 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
bd50: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45  s..  */.  if( !E
bd60: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
bd70: 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
bd80: 65 6c 65 63 74 29 20 26 26 20 21 70 50 61 72 73  elect) && !pPars
bd90: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a  e->trigStack ){.
bda0: 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b      int mem = ++
bdb0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
bdc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bdd0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65  Op1(v, OP_If, me
bde0: 6d 29 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72  m);.    testAddr
bdf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
be00: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
be10: 65 72 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20  er, 1, mem);.   
be20: 20 61 73 73 65 72 74 28 20 74 65 73 74 41 64 64   assert( testAdd
be30: 72 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  r>0 || pParse->d
be40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
be50: 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  );.  }..  switch
be60: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
be70: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
be80: 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
be90: 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49  nity;.      KeyI
bea0: 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20  nfo keyInfo;.   
beb0: 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20     int addr;    
bec0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
bed0: 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  f OP_OpenEphemer
bee0: 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
bef0: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
bf00: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
bf10: 66 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72  ft;..      if( r
bf20: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20  MayHaveNull ){. 
bf30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bf40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
bf50: 75 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65  ull, 0, rMayHave
bf60: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Null);.      }..
bf70: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
bf80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
bf90: 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20  nity(pLeft);..  
bfa0: 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74      /* Whether t
bfb0: 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28  his is an 'x IN(
bfc0: 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61  SELECT...)' or a
bfd0: 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73  n 'x IN(<exprlis
bfe0: 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78  t>)'.      ** ex
bff0: 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68  pression it is h
c000: 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20  andled the same 
c010: 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20 74  way. A virtual t
c020: 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
c030: 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69  * filled with si
c040: 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78  ngle-field index
c050: 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69   keys representi
c060: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  ng the results. 
c070: 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
c080: 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c   SELECT or the <
c090: 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20  exprlist>..     
c0a0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
c0b0: 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69  the 'x' expressi
c0c0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
c0d0: 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c  alue, or the SEL
c0e0: 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  ECT....      ** 
c0f0: 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
c100: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
c110: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
c120: 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20  ity of that.    
c130: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75    ** column is u
c140: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
c150: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
c160: 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
c170: 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
c180: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
c190: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
c1a0: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
c1b0: 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a   is used.      *
c1c0: 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75  * if either colu
c1d0: 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f  mn has NUMERIC o
c1e0: 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69  r INTEGER affini
c1f0: 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20  ty. If neither. 
c200: 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20       ** 'x' nor 
c210: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  the SELECT... st
c220: 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
c230: 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
c240: 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20  c affinity.     
c250: 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20   ** is used..   
c260: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
c270: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
c280: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
c290: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
c2a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c2b0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
c2c0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21  pExpr->iTable, !
c2d0: 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  isRowid);.      
c2e0: 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c  memset(&keyInfo,
c2f0: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e   0, sizeof(keyIn
c300: 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49  fo));.      keyI
c310: 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a  nfo.nField = 1;.
c320: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
c330: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
c340: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
c350: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
c360: 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
c370: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
c380: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
c390: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
c3a0: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
c3b0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
c3c0: 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
c3d0: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
c3e0: 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
c3f0: 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
c400: 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
c410: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44  .        SelectD
c420: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
c430: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
c440: 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73  st;..        ass
c450: 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b  ert( !isRowid );
c460: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c470: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
c480: 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70  dest, SRT_Set, p
c490: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
c4a0: 20 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 69         dest.affi
c4b0: 6e 69 74 79 20 3d 20 28 75 38 29 61 66 66 69 6e  nity = (u8)affin
c4c0: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ity;.        ass
c4d0: 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
c4e0: 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
c4f0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
c500: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
c510: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c520: 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  se, pExpr->x.pSe
c530: 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a  lect, &dest) ){.
c540: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
c550: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c560: 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
c570: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
c580: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  EList;.        i
c590: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
c5a0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20  ist->nExpr>0 ){ 
c5b0: 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49 6e  .          keyIn
c5c0: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  fo.aColl[0] = sq
c5d0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
c5e0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
c5f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a  , pExpr->pLeft,.
c600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
c610: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
c620: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c630: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
c640: 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20  pr->x.pList ){. 
c650: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32         /* Case 2
c660: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65  :     expr IN (e
c670: 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20  xprlist).       
c680: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46   **.        ** F
c690: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
c6a0: 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64  on, build an ind
c6b0: 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20  ex key from the 
c6c0: 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20  evaluation and. 
c6d0: 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20         ** store 
c6e0: 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  it in the tempor
c6f0: 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65  ary table. If <e
c700: 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  xpr> is a column
c710: 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20  , then use.     
c720: 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d     ** that colum
c730: 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e  ns affinity when
c740: 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20   building index 
c750: 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20  keys. If <expr> 
c760: 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  is not.        *
c770: 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
c780: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
c790: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
c7a0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
c7b0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
c7c0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
c7d0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74  List;.        st
c7e0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
c7f0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
c800: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
c810: 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  3;..        if( 
c820: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
c830: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
c840: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
c850: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
c860: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
c870: 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[0] = sqlite3E
c880: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
c890: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
c8a0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;..        /* Lo
c8b0: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
c8c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
c8d0: 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
c8e0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
c8f0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
c900: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  se);.        r2 
c910: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
c920: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
c930: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c940: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
c950: 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20  l, 0, r2);.     
c960: 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e     for(i=pList->
c970: 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69  nExpr, pItem=pLi
c980: 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  st->a; i>0; i--,
c990: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
c9a0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
c9b0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a   pItem->pExpr;..
c9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
c9d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
c9e0: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
c9f0: 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
ca00: 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
ca10: 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
ca20: 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
ca30: 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
ca40: 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
ca50: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
ca60: 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
ca70: 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
ca80: 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
ca90: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
caa0: 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
cab0: 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
cac0: 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
cad0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
cae0: 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41         if( testA
caf0: 64 64 72 20 26 26 20 21 73 71 6c 69 74 65 33 45  ddr && !sqlite3E
cb00: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
cb10: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
cb20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
cb30: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73  ngeToNoop(v, tes
cb40: 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20 20  tAddr-1, 2);.   
cb50: 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64           testAdd
cb60: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  r = 0;.         
cb70: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
cb80: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
cb90: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
cba0: 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
cbb0: 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
cbc0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
cbd0: 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b  disableColCache+
cbe0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 33 20  +;.          r3 
cbf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
cc00: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
cc10: 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  pE2, r1);.      
cc20: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
cc30: 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
cc40: 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  che>0 );.       
cc50: 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
cc60: 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 0a 20  leColCache--;.. 
cc70: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
cc80: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
cc90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cca0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
ccb0: 42 65 49 6e 74 2c 20 72 33 2c 20 73 71 6c 69 74  BeInt, r3, sqlit
ccc0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
ccd0: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
cce0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ccf0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
cd00: 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
cd10: 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20  le, r2, r3);.   
cd20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
cd30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cd40: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
cd50: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
cd60: 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
cd70: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
cd80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
cd90: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
cda0: 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
cdb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
cdc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cdd0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
cde0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
cdf0: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r2);.          
ce00: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
ce10: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ce20: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
ce30: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
ce40: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ce50: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
ce60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ce70: 69 66 28 20 21 69 73 52 6f 77 69 64 20 29 7b 0a  if( !isRowid ){.
ce80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ce90: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
cea0: 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65  ddr, (void *)&ke
ceb0: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
cec0: 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
ced0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
cee0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
cef0: 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
cf00: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
cf10: 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62  /* This has to b
cf20: 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43  e a scalar SELEC
cf30: 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64  T.  Generate cod
cf40: 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20  e to put the.   
cf50: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
cf60: 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20  his select in a 
cf70: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
cf80: 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  record the numbe
cf90: 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  r.      ** of th
cfa0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  e memory cell in
cfb0: 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20   iColumn..      
cfc0: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
cfd0: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20  const Token one 
cfe0: 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c 20 30 2c  = { (u8*)"1", 0,
cff0: 20 31 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65   1 };.      Sele
d000: 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20  ct *pSel;.      
d010: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
d020: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
d030: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
d040: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
d050: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53  ect) );.      pS
d060: 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
d070: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c  elect;.      sql
d080: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
d090: 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70  it(&dest, 0, ++p
d0a0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
d0b0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
d0c0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
d0d0: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
d0e0: 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
d0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d100: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
d110: 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72  ll, 0, dest.iPar
d120: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
d130: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
d140: 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
d150: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t"));.      }els
d160: 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  e{.        dest.
d170: 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73  eDest = SRT_Exis
d180: 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
d190: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d1a0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
d1b0: 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20  dest.iParm);.   
d1c0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d1d0: 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54  ((v, "Init EXIST
d1e0: 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  S result"));.   
d1f0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
d200: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
d210: 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70  rse->db, pSel->p
d220: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
d230: 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
d240: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
d250: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c  , TK_INTEGER, 0,
d260: 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20   0, &one);.     
d270: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
d280: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
d290: 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
d2a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
d2b0: 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e   }.      pExpr->
d2c0: 69 43 6f 6c 75 6d 6e 20 3d 20 64 65 73 74 2e 69  iColumn = dest.i
d2d0: 50 61 72 6d 3b 0a 20 20 20 20 20 20 62 72 65 61  Parm;.      brea
d2e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
d2f0: 69 66 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a  if( testAddr ){.
d300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
d310: 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41  umpHere(v, testA
d320: 64 64 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72  ddr-1);.  }..  r
d330: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
d340: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
d350: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
d360: 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38  * Duplicate an 8
d370: 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73  -byte value.*/.s
d380: 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70 38  tatic char *dup8
d390: 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63  bytes(Vdbe *v, c
d3a0: 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a  onst char *in){.
d3b0: 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71    char *out = sq
d3c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
d3d0: 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
d3e0: 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74  ), 8);.  if( out
d3f0: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f   ){.    memcpy(o
d400: 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a  ut, in, 8);.  }.
d410: 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a    return out;.}.
d420: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
d430: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
d440: 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
d450: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
d460: 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
d470: 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
d480: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
d490: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
d4a0: 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
d4b0: 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
d4c0: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
d4d0: 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
d4e0: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
d4f0: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
d500: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
d510: 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
d520: 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
d530: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
d540: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
d550: 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
d560: 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
d570: 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 6e  *z, int n, int n
d580: 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69  egateFlag, int i
d590: 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Mem){.  assert( 
d5a0: 7a 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c  z || v==0 || sql
d5b0: 69 74 65 33 56 64 62 65 44 62 28 76 29 2d 3e 6d  ite3VdbeDb(v)->m
d5c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
d5d0: 20 61 73 73 65 72 74 28 20 21 7a 20 7c 7c 20 21   assert( !z || !
d5e0: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
d5f0: 5b 6e 5d 29 20 29 3b 0a 20 20 55 4e 55 53 45 44  [n]) );.  UNUSED
d600: 5f 50 41 52 41 4d 45 54 45 52 28 6e 29 3b 0a 20  _PARAMETER(n);. 
d610: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 64 6f   if( z ){.    do
d620: 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20  uble value;.    
d630: 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71  char *zV;.    sq
d640: 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61  lite3AtoF(z, &va
d650: 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71  lue);.    if( sq
d660: 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
d670: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
d680: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d690: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Null, 0, iMem
d6a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d6b0: 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c      if( negateFl
d6c0: 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61  ag ) value = -va
d6d0: 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20  lue;.      zV = 
d6e0: 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68  dup8bytes(v, (ch
d6f0: 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20  ar*)&value);.   
d700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d710: 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  dOp4(v, OP_Real,
d720: 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
d730: 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 20 20 7d   P4_REAL);.    }
d740: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
d750: 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
d760: 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
d770: 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
d780: 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
d790: 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
d7a0: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
d7b0: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
d7c0: 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
d7d0: 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
d7e0: 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
d7f0: 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
d800: 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
d810: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
d820: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
d830: 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
d840: 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
d850: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
d860: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
d870: 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64  d codeInteger(Vd
d880: 62 65 20 2a 76 2c 20 45 78 70 72 20 2a 70 45 78  be *v, Expr *pEx
d890: 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c  pr, int negFlag,
d8a0: 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 63 6f   int iMem){.  co
d8b0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
d8c0: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
d8d0: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
d8e0: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78  .    int i = pEx
d8f0: 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
d900: 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
d910: 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -i;.    sqlite
d920: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d930: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d  P_Integer, i, iM
d940: 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  em);.  }else if(
d950: 20 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 45 78   (z = (char*)pEx
d960: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 21 3d 30 20  pr->token.z)!=0 
d970: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
d980: 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d    int n = pExpr-
d990: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 61 73  >token.n;.    as
d9a0: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
d9b0: 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20  digit(z[n]) );. 
d9c0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
d9d0: 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b  tInt32(z, &i) ){
d9e0: 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
d9f0: 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
da00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
da10: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
da20: 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
da30: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
da40: 74 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28  te3FitsIn64Bits(
da50: 7a 2c 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20  z, negFlag) ){. 
da60: 20 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a       i64 value;.
da70: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a        char *zV;.
da80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f        sqlite3Ato
da90: 69 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a  i64(z, &value);.
daa0: 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61        if( negFla
dab0: 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
dac0: 75 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64  ue;.      zV = d
dad0: 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61  up8bytes(v, (cha
dae0: 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  r*)&value);.    
daf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
db00: 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c  Op4(v, OP_Int64,
db10: 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
db20: 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20   P4_INT64);.    
db30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64  }else{.      cod
db40: 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e  eReal(v, z, n, n
db50: 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20  egFlag, iMem);. 
db60: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
db70: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
db80: 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
db90: 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
dba0: 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
dbb0: 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
dbc0: 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
dbd0: 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
dbe0: 73 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74  ster.  An effort
dbf0: 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73  .** is made to s
dc00: 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
dc10: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
dc20: 72 20 69 52 65 67 2c 20 62 75 74 20 74 68 69 73  r iReg, but this
dc30: 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61   is.** not guara
dc40: 6e 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61  nteed.  The loca
dc50: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75  tion of the colu
dc60: 6d 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  mn value is retu
dc70: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rned..**.** Ther
dc80: 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
dc90: 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
dca0: 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
dcb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
dcc0: 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
dcd0: 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
dce0: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
dcf0: 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
dd00: 65 20 72 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  e rowid..**.** T
dd10: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
dd20: 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 75  t attempt to reu
dd30: 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  se the value of 
dd40: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a  the column that.
dd50: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
dd60: 65 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  een loaded into 
dd70: 61 20 72 65 67 69 73 74 65 72 2e 20 20 54 68 65  a register.  The
dd80: 20 76 61 6c 75 65 20 77 69 6c 6c 20 61 6c 77 61   value will alwa
dd90: 79 73 0a 2a 2a 20 62 65 20 75 73 65 64 20 69 66  ys.** be used if
dda0: 20 69 74 20 68 61 73 20 6e 6f 74 20 75 6e 64 65   it has not unde
ddb0: 72 67 6f 6e 65 20 61 6e 79 20 61 66 66 69 6e 69  rgone any affini
ddc0: 74 79 20 63 68 61 6e 67 65 73 2e 20 20 42 75 74  ty changes.  But
ddd0: 20 69 66 0a 2a 2a 20 61 6e 20 61 66 66 69 6e 69   if.** an affini
dde0: 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
ddf0: 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
de00: 20 63 61 63 68 65 64 20 76 61 6c 75 65 20 77 69   cached value wi
de10: 6c 6c 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75 73  ll only be.** us
de20: 65 64 20 69 66 20 61 6c 6c 6f 77 41 66 66 43 68  ed if allowAffCh
de30: 6e 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 69  ng is true..*/.i
de40: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
de50: 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50  deGetColumn(.  P
de60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
de70: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
de80: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
de90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
dea0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
deb0: 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
dec0: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
ded0: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
dee0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
def0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
df00: 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
df10: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
df20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
df30: 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
df40: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
df50: 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20  nt iReg,        
df60: 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
df70: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 61   here */.  int a
df80: 6c 6c 6f 77 41 66 66 43 68 6e 67 20 2f 2a 20 54  llowAffChng /* T
df90: 72 75 65 20 69 66 20 70 72 69 6f 72 20 61 66 66  rue if prior aff
dfa0: 69 6e 69 74 79 20 63 68 61 6e 67 65 73 20 61 72  inity changes ar
dfb0: 65 20 4f 4b 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  e OK */.){.  Vdb
dfc0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
dfd0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
dfe0: 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
dff0: 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  e *p;..  for(i=0
e000: 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
e010: 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d  Cache; i<pParse-
e020: 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c  >nColCache; i++,
e030: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
e040: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
e050: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
e060: 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20  iColumn.        
e070: 20 20 20 26 26 20 28 21 70 2d 3e 61 66 66 43 68     && (!p->affCh
e080: 61 6e 67 65 20 7c 7c 20 61 6c 6c 6f 77 41 66 66  ange || allowAff
e090: 43 68 6e 67 29 20 29 7b 0a 23 69 66 20 30 0a 20  Chng) ){.#if 0. 
e0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e0b0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f  AddOp0(v, OP_Noo
e0c0: 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
e0d0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 50 54 3a 20  mment((v, "OPT: 
e0e0: 74 61 62 25 64 2e 63 6f 6c 25 64 20 2d 3e 20 72  tab%d.col%d -> r
e0f0: 25 64 22 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  %d", iTable, iCo
e100: 6c 75 6d 6e 2c 20 70 2d 3e 69 52 65 67 29 29 3b  lumn, p->iReg));
e110: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
e120: 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
e130: 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
e140: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66  rt( v!=0 );.  if
e150: 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ( iColumn<0 ){. 
e160: 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 54 61     int op = (pTa
e170: 62 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  b && IsVirtual(p
e180: 54 61 62 29 29 20 3f 20 4f 50 5f 56 52 6f 77 69  Tab)) ? OP_VRowi
e190: 64 20 3a 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20  d : OP_Rowid;.  
e1a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e1b0: 4f 70 32 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c  Op2(v, op, iTabl
e1c0: 65 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73  e, iReg);.  }els
e1d0: 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b  e if( pTab==0 ){
e1e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e1f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
e200: 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  umn, iTable, iCo
e210: 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d  lumn, iReg);.  }
e220: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
e230: 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
e240: 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
e250: 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
e260: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e270: 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65  p3(v, op, iTable
e280: 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
e290: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  ;.    sqlite3Col
e2a0: 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
e2b0: 61 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69  ab, iColumn);.#i
e2c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e2d0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
e2e0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61  .    if( pTab->a
e2f0: 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  Col[iColumn].aff
e300: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
e310: 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20 20 20  F_REAL ){.      
e320: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e330: 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
e340: 6e 69 74 79 2c 20 69 52 65 67 29 3b 0a 20 20 20  nity, iReg);.   
e350: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
e360: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  if( pParse->disa
e370: 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29  bleColCache==0 )
e380: 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
e390: 2d 3e 69 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20  ->iColCache;.   
e3a0: 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
e3b0: 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20  olCache[i];.    
e3c0: 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  p->iTable = iTab
e3d0: 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75  le;.    p->iColu
e3e0: 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20  mn = iColumn;.  
e3f0: 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
e400: 3b 0a 20 20 20 20 70 2d 3e 61 66 66 43 68 61 6e  ;.    p->affChan
e410: 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  ge = 0;.    i++;
e420: 0a 20 20 20 20 69 66 28 20 69 3e 3d 41 72 72 61  .    if( i>=Arra
e430: 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 43  ySize(pParse->aC
e440: 6f 6c 43 61 63 68 65 29 20 29 20 69 20 3d 20 30  olCache) ) i = 0
e450: 3b 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72  ;.    if( i>pPar
e460: 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 20  se->nColCache ) 
e470: 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
e480: 65 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 72 73  e = i;.    pPars
e490: 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 69  e->iColCache = i
e4a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
e4b0: 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  Reg;.}../*.** Cl
e4c0: 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
e4d0: 61 63 68 65 20 65 6e 74 72 69 65 73 20 61 73 73  ache entries ass
e4e0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
e4f0: 20 76 64 62 65 0a 2a 2a 20 63 75 72 73 6f 72 20   vdbe.** cursor 
e500: 77 69 74 68 20 63 75 72 73 6f 72 20 6e 75 6d 62  with cursor numb
e510: 65 72 20 69 54 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  er iTable..*/.vo
e520: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c  id sqlite3ExprCl
e530: 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50  earColumnCache(P
e540: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
e550: 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 66 28  t iTable){.  if(
e560: 20 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20   iTable<0 ){.   
e570: 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
e580: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  he = 0;.    pPar
e590: 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20  se->iColCache = 
e5a0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
e5b0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
e5c0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  =0; i<pParse->nC
e5d0: 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20  olCache; i++){. 
e5e0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
e5f0: 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 54  >aColCache[i].iT
e600: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
e610: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
e620: 28 20 69 3d 3d 70 50 61 72 73 65 2d 3e 6e 43 6f  ( i==pParse->nCo
e630: 6c 43 61 63 68 65 2d 31 20 29 3b 0a 20 20 20 20  lCache-1 );.    
e640: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c      pParse->aCol
e650: 43 61 63 68 65 5b 69 5d 20 3d 20 70 50 61 72 73  Cache[i] = pPars
e660: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 2d 2d 70  e->aColCache[--p
e670: 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
e680: 5d 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ];.        pPars
e690: 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 70  e->iColCache = p
e6a0: 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
e6b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e6c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
e6d0: 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
e6e0: 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  t an affinity ch
e6f0: 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65  ange has occurre
e700: 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72  d on iCount.** r
e710: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
e720: 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a  g with iStart..*
e730: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
e740: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
e750: 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  hange(Parse *pPa
e760: 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c  rse, int iStart,
e770: 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20   int iCount){.  
e780: 69 6e 74 20 69 45 6e 64 20 3d 20 69 53 74 61 72  int iEnd = iStar
e790: 74 20 2b 20 69 43 6f 75 6e 74 20 2d 20 31 3b 0a  t + iCount - 1;.
e7a0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
e7b0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  =0; i<pParse->nC
e7c0: 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20  olCache; i++){. 
e7d0: 20 20 20 69 6e 74 20 72 20 3d 20 70 50 61 72 73     int r = pPars
e7e0: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
e7f0: 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
e800: 3d 69 53 74 61 72 74 20 26 26 20 72 3c 3d 69 45  =iStart && r<=iE
e810: 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  nd ){.      pPar
e820: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
e830: 2e 61 66 66 43 68 61 6e 67 65 20 3d 20 31 3b 0a  .affChange = 1;.
e840: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
e850: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
e860: 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
e870: 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
e880: 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
e890: 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
e8a0: 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
e8b0: 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
e8c0: 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
e8d0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
e8e0: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
e8f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
e900: 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
e910: 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
e920: 6e 74 20 69 3b 0a 20 20 69 66 28 20 69 46 72 6f  nt i;.  if( iFro
e930: 6d 3d 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 3b  m==iTo ) return;
e940: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
e950: 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
e960: 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
e970: 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
e980: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
e990: 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
e9a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  i++){.    int x 
e9b0: 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
e9c0: 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20  che[i].iReg;.   
e9d0: 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26   if( x>=iFrom &&
e9e0: 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b   x<iFrom+nReg ){
e9f0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
ea00: 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
ea10: 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20   += iTo-iFrom;. 
ea20: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
ea30: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ea40: 74 6f 20 63 6f 70 79 20 63 6f 6e 74 65 6e 74 20  to copy content 
ea50: 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
ea60: 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
ea70: 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
ea80: 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a  To..iTo+nReg-1..
ea90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
eaa0: 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73  xprCodeCopy(Pars
eab0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
eac0: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
ead0: 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
eae0: 69 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d  i;.  if( iFrom==
eaf0: 69 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  iTo ) return;.  
eb00: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b  for(i=0; i<nReg;
eb10: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
eb20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
eb30: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
eb40: 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c 20 69 54  opy, iFrom+i, iT
eb50: 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  o+i);.  }.}../*.
eb60: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
eb70: 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69  f any register i
eb80: 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f  n the range iFro
eb90: 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76  m..iTo (inclusiv
eba0: 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73  e).** is used as
ebb0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c   part of the col
ebc0: 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 73 74  umn cache..*/.st
ebd0: 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43  atic int usedAsC
ebe0: 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65  olumnCache(Parse
ebf0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
ec00: 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
ec10: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
ec20: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
ec30: 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
ec40: 20 20 69 6e 74 20 72 20 3d 20 70 50 61 72 73 65    int r = pParse
ec50: 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
ec60: 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
ec70: 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20  iFrom && r<=iTo 
ec80: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
ec90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
eca0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20  *.** There is a 
ecb0: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
ecc0: 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 57 65  r iReg..**.** We
ecd0: 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 6d 6f   are going to mo
ece0: 64 69 66 79 20 74 68 65 20 76 61 6c 75 65 2c 20  dify the value, 
ecf0: 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  so we need to ma
ed00: 6b 65 20 73 75 72 65 20 69 74 0a 2a 2a 20 69 73  ke sure it.** is
ed10: 20 6e 6f 74 20 61 20 63 61 63 68 65 64 20 72 65   not a cached re
ed20: 67 69 73 74 65 72 2e 20 20 49 66 20 69 52 65 67  gister.  If iReg
ed30: 20 69 73 20 61 20 63 61 63 68 65 64 20 72 65 67   is a cached reg
ed40: 69 73 74 65 72 2c 0a 2a 2a 20 74 68 65 6e 20 63  ister,.** then c
ed50: 6c 65 61 72 20 74 68 65 20 63 6f 72 72 65 73 70  lear the corresp
ed60: 6f 6e 64 69 6e 67 20 63 61 63 68 65 20 6c 69 6e  onding cache lin
ed70: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
ed80: 65 33 45 78 70 72 57 72 69 74 61 62 6c 65 52 65  e3ExprWritableRe
ed90: 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70 50  gister(Parse *pP
eda0: 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
edb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
edc0: 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
edd0: 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
ede0: 69 52 65 67 29 20 29 7b 0a 20 20 20 20 66 6f 72  iReg) ){.    for
edf0: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
ee00: 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b  nColCache; i++){
ee10: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
ee20: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
ee30: 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
ee40: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43        pParse->aC
ee50: 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70 50 61  olCache[i] = pPa
ee60: 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 2d  rse->aColCache[-
ee70: 2d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  -pParse->nColCac
ee80: 68 65 5d 3b 0a 20 20 20 20 20 20 20 20 70 50 61  he];.        pPa
ee90: 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d  rse->iColCache =
eea0: 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
eeb0: 68 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  he;.      }.    
eec0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
eed0: 66 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72  f the last instr
eee0: 75 63 74 69 6f 6e 20 63 6f 64 65 64 20 69 73 20  uction coded is 
eef0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 63 6f 70  an ephemeral cop
ef00: 79 20 6f 66 20 61 6e 79 20 6f 66 0a 2a 2a 20 74  y of any of.** t
ef10: 68 65 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  he registers in 
ef20: 74 68 65 20 6e 52 65 67 20 72 65 67 69 73 74 65  the nReg registe
ef30: 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  rs beginning wit
ef40: 68 20 69 52 65 67 2c 20 74 68 65 6e 0a 2a 2a 20  h iReg, then.** 
ef50: 63 6f 6e 76 65 72 74 20 74 68 65 20 6c 61 73 74  convert the last
ef60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 72 6f   instruction fro
ef70: 6d 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 4f 50  m OP_SCopy to OP
ef80: 5f 43 6f 70 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  _Copy..*/.void s
ef90: 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f  qlite3ExprHardCo
efa0: 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  py(Parse *pParse
efb0: 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
efc0: 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 61 64 64  nReg){.  int add
efd0: 72 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  r;.  VdbeOp *pOp
efe0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
eff0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
f000: 65 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  e;.  addr = sqli
f010: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
f020: 64 72 28 76 29 3b 0a 20 20 70 4f 70 20 3d 20 73  dr(v);.  pOp = s
f030: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
f040: 76 2c 20 61 64 64 72 2d 31 29 3b 0a 20 20 61 73  v, addr-1);.  as
f050: 73 65 72 74 28 20 70 4f 70 20 7c 7c 20 70 50 61  sert( pOp || pPa
f060: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
f070: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
f080: 4f 70 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64  Op && pOp->opcod
f090: 65 3d 3d 4f 50 5f 53 43 6f 70 79 20 26 26 20 70  e==OP_SCopy && p
f0a0: 4f 70 2d 3e 70 31 3e 3d 69 52 65 67 20 26 26 20  Op->p1>=iReg && 
f0b0: 70 4f 70 2d 3e 70 31 3c 69 52 65 67 2b 6e 52 65  pOp->p1<iReg+nRe
f0c0: 67 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70  g ){.    pOp->op
f0d0: 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a  code = OP_Copy;.
f0e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
f0f0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74  erate code to st
f100: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
f110: 20 74 68 65 20 69 41 6c 69 61 73 2d 74 68 20 61   the iAlias-th a
f120: 6c 69 61 73 20 69 6e 20 72 65 67 69 73 74 65 72  lias in register
f130: 0a 2a 2a 20 74 61 72 67 65 74 2e 20 20 54 68 65  .** target.  The
f140: 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
f150: 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 45 78 70   is called, pExp
f160: 72 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 74  r is evaluated t
f170: 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  o compute.** the
f180: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c   value of the al
f190: 69 61 73 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ias.  The value 
f1a0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20  is stored in an 
f1b0: 61 75 78 69 6c 69 61 72 79 20 72 65 67 69 73 74  auxiliary regist
f1c0: 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 75  er.** and the nu
f1d0: 6d 62 65 72 20 6f 66 20 74 68 61 74 20 72 65 67  mber of that reg
f1e0: 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
f1f0: 64 2e 20 20 4f 6e 20 73 75 62 73 65 71 75 65 6e  d.  On subsequen
f200: 74 20 63 61 6c 6c 73 2c 0a 2a 2a 20 74 68 65 20  t calls,.** the 
f210: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
f220: 69 73 20 72 65 74 75 72 6e 65 64 20 77 69 74 68  is returned with
f230: 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61  out generating a
f240: 6e 79 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e  ny code..**.** N
f250: 6f 74 65 20 74 68 61 74 20 69 6e 20 6f 72 64 65  ote that in orde
f260: 72 20 66 6f 72 20 74 68 69 73 20 74 6f 20 77 6f  r for this to wo
f270: 72 6b 2c 20 63 6f 64 65 20 6d 75 73 74 20 62 65  rk, code must be
f280: 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68   generated in th
f290: 65 0a 2a 2a 20 73 61 6d 65 20 6f 72 64 65 72 20  e.** same order 
f2a0: 74 68 61 74 20 69 74 20 69 73 20 65 78 65 63 75  that it is execu
f2b0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 69 61 73  ted..**.** Alias
f2c0: 65 73 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20  es are numbered 
f2d0: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 31 2e  starting with 1.
f2e0: 20 20 53 6f 20 69 41 6c 69 61 73 20 69 73 20 69    So iAlias is i
f2f0: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f  n the range.** o
f300: 66 20 31 20 74 6f 20 70 50 61 72 73 65 2d 3e 6e  f 1 to pParse->n
f310: 41 6c 69 61 73 20 69 6e 63 6c 75 73 69 76 65 2e  Alias inclusive.
f320: 20 20 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73 65 2d    .**.** pParse-
f330: 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31  >aAlias[iAlias-1
f340: 5d 20 72 65 63 6f 72 64 73 20 74 68 65 20 72 65  ] records the re
f350: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
f360: 65 72 65 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  ere the value.**
f370: 20 6f 66 20 74 68 65 20 69 41 6c 69 61 73 2d 74   of the iAlias-t
f380: 68 20 61 6c 69 61 73 20 69 73 20 73 74 6f 72 65  h alias is store
f390: 64 2e 20 20 49 66 20 7a 65 72 6f 2c 20 74 68 61  d.  If zero, tha
f3a0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
f3b0: 0a 2a 2a 20 61 6c 69 61 73 20 68 61 73 20 6e 6f  .** alias has no
f3c0: 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6d 70 75  t yet been compu
f3d0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
f3e0: 6e 74 20 63 6f 64 65 41 6c 69 61 73 28 50 61 72  nt codeAlias(Par
f3f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
f400: 69 41 6c 69 61 73 2c 20 45 78 70 72 20 2a 70 45  iAlias, Expr *pE
f410: 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
f420: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
f430: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
f440: 69 6e 74 20 69 52 65 67 3b 0a 20 20 69 66 28 20  int iReg;.  if( 
f450: 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c  pParse->nAliasAl
f460: 6c 6f 63 3c 70 50 61 72 73 65 2d 3e 6e 41 6c 69  loc<pParse->nAli
f470: 61 73 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  as ){.    pParse
f480: 2d 3e 61 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->aAlias = sqlit
f490: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
f4a0: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 41  e(db, pParse->aA
f4b0: 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lias,.          
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50         sizeof(pP
f4e0: 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29  arse->aAlias[0])
f4f0: 2a 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20  *pParse->nAlias 
f500: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
f510: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f520: 64 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 41 6c  d && pParse->nAl
f530: 69 61 73 41 6c 6c 6f 63 3e 30 20 29 3b 0a 20 20  iasAlloc>0 );.  
f540: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f550: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
f560: 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  0;.    memset(&p
f570: 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 70 50  Parse->aAlias[pP
f580: 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f  arse->nAliasAllo
f590: 63 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  c], 0,.         
f5a0: 20 20 28 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61    (pParse->nAlia
f5b0: 73 2d 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  s-pParse->nAlias
f5c0: 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28 70 50  Alloc)*sizeof(pP
f5d0: 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29  arse->aAlias[0])
f5e0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
f5f0: 41 6c 69 61 73 41 6c 6c 6f 63 20 3d 20 70 50 61  AliasAlloc = pPa
f600: 72 73 65 2d 3e 6e 41 6c 69 61 73 3b 0a 20 20 7d  rse->nAlias;.  }
f610: 0a 20 20 61 73 73 65 72 74 28 20 69 41 6c 69 61  .  assert( iAlia
f620: 73 3e 30 20 26 26 20 69 41 6c 69 61 73 3c 3d 70  s>0 && iAlias<=p
f630: 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b  Parse->nAlias );
f640: 0a 20 20 69 52 65 67 20 3d 20 70 50 61 72 73 65  .  iReg = pParse
f650: 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d  ->aAlias[iAlias-
f660: 31 5d 3b 0a 20 20 69 66 28 20 69 52 65 67 3d 3d  1];.  if( iReg==
f670: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  0 ){.    if( pPa
f680: 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
f690: 61 63 68 65 20 29 7b 0a 20 20 20 20 20 20 69 52  ache ){.      iR
f6a0: 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
f6b0: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
f6c0: 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
f6d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
f6e0: 20 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50 61      iReg = ++pPa
f6f0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
f700: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f710: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
f720: 69 52 65 67 29 3b 0a 20 20 20 20 20 20 70 50 61  iReg);.      pPa
f730: 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69  rse->aAlias[iAli
f740: 61 73 2d 31 5d 20 3d 20 69 52 65 67 3b 0a 20 20  as-1] = iReg;.  
f750: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
f760: 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
f770: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
f780: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
f790: 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
f7a0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
f7b0: 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70  ression.  Attemp
f7c0: 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  t to store the r
f7d0: 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
f7e0: 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20  er "target"..** 
f7f0: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
f800: 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74  ter where result
f810: 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  s are stored..**
f820: 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f  .** With this ro
f830: 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20  utine, there is 
f840: 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  no guarantee tha
f850: 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a  t results will.*
f860: 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  * be stored in t
f870: 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
f880: 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72  lt might be stor
f890: 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ed in some other
f8a0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20  .** register if 
f8b0: 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74  it is convenient
f8c0: 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20   to do so.  The 
f8d0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
f8e0: 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74  .** must check t
f8f0: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
f900: 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75  nd move the resu
f910: 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72  lts to the desir
f920: 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a  ed.** register..
f930: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
f940: 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72  prCodeTarget(Par
f950: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
f960: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
f970: 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
f980: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
f990: 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65    /* The VM unde
f9a0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
f9b0: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f9d0: 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
f9e0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
f9f0: 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
fa00: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
fa10: 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
fa20: 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20  ster inReg */.  
fa30: 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
fa40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
fa50: 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
fa60: 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
fa70: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
fa80: 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20  egFree2 = 0;    
fa90: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
faa0: 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
fab0: 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
fac0: 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   */.  int r1, r2
fad0: 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20  , r3, r4;       
fae0: 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73  /* Various regis
faf0: 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20  ter numbers */. 
fb00: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
fb10: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
fb20: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
fb30: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
fb40: 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74  iled );.  assert
fb50: 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
fb60: 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
fb70: 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  em );.  if( v==0
fb80: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
fb90: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
fba0: 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
fbb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
fbc0: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
fbd0: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
fbe0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
fbf0: 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
fc00: 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67     AggInfo *pAgg
fc10: 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
fc20: 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  ggInfo;.      st
fc30: 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
fc40: 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e   *pCol = &pAggIn
fc50: 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  fo->aCol[pExpr->
fc60: 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28  iAgg];.      if(
fc70: 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65   !pAggInfo->dire
fc80: 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ctMode ){.      
fc90: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
fca0: 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20  iMem>0 );.      
fcb0: 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e    inReg = pCol->
fcc0: 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72  iMem;.        br
fcd0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
fce0: 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
fcf0: 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
fd00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fd10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
fd20: 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
fd30: 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  ->sortingIdx,.  
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
fd60: 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
fd70: 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
fd80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
fd90: 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
fda0: 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
fdb0: 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
fdc0: 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
fdd0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
fde0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
fdf0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20  pExpr->iTable<0 
fe00: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
fe10: 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
fe20: 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63  when coding chec
fe30: 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  k constraints */
fe40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
fe50: 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
fe60: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
fe70: 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  eg = pExpr->iCol
fe80: 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b  umn + pParse->ck
fe90: 42 61 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Base;.      }els
fea0: 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  e{.        testc
feb0: 61 73 65 28 20 28 70 45 78 70 72 2d 3e 66 6c 61  ase( (pExpr->fla
fec0: 67 73 20 26 20 45 50 5f 41 6e 79 41 66 66 29 21  gs & EP_AnyAff)!
fed0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  =0 );.        in
fee0: 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
fef0: 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
ff00: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54  Parse, pExpr->pT
ff10: 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
ff40: 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
ff50: 6c 65 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  le, target,.    
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
ff80: 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 41  pr->flags & EP_A
ff90: 6e 79 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a  nyAff);.      }.
ffa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ffb0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
ffc0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
ffd0: 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70  codeInteger(v, p
ffe0: 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29  Expr, 0, target)
fff0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10000 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
10010 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
10020 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68 61  codeReal(v, (cha
10030 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
10040 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
10050 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
10060 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10070 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
10080 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71  RING: {.      sq
10090 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
100a0 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
100b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
100c0 64 4f 70 34 28 76 2c 4f 50 5f 53 74 72 69 6e 67  dOp4(v,OP_String
100d0 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c  8, 0, target, 0,
100e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
100f0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
10100 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
10110 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
10120 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10130 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
10140 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
10150 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10160 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
10170 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
10180 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
10190 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
101a0 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
101b0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
101c0 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
101d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
101e0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  ;.      char *zB
101f0 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lob;.      asser
10200 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  t( pExpr->token.
10210 6e 3e 3d 33 20 29 3b 0a 20 20 20 20 20 20 61 73  n>=3 );.      as
10220 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
10230 65 6e 2e 7a 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20  en.z[0]=='x' || 
10240 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  pExpr->token.z[0
10250 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
10260 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74  assert( pExpr->t
10270 6f 6b 65 6e 2e 7a 5b 31 5d 3d 3d 27 5c 27 27 20  oken.z[1]=='\'' 
10280 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10290 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b   pExpr->token.z[
102a0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31  pExpr->token.n-1
102b0 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
102c0 20 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65   n = pExpr->toke
102d0 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a  n.n - 3;.      z
102e0 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d   = (char*)pExpr-
102f0 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20  >token.z + 2;.  
10300 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69      zBlob = sqli
10310 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c  te3HexToBlob(sql
10320 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a  ite3VdbeDb(v), z
10330 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
10340 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10350 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74   OP_Blob, n/2, t
10360 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c  arget, 0, zBlob,
10370 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
10380 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10390 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
103a0 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
103b0 20 20 20 20 20 20 69 6e 74 20 69 50 72 69 6f 72        int iPrior
103c0 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
103d0 70 4f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pOp;.      if( p
103e0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3c 3d 31  Expr->token.n<=1
103f0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 69 50  .         && (iP
10400 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 56 64  rior = sqlite3Vd
10410 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
10420 2d 31 29 3e 3d 30 0a 20 20 20 20 20 20 20 20 20  -1)>=0.         
10430 26 26 20 28 70 4f 70 20 3d 20 73 71 6c 69 74 65  && (pOp = sqlite
10440 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 69 50  3VdbeGetOp(v, iP
10450 72 69 6f 72 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d  rior))->opcode==
10460 4f 50 5f 56 61 72 69 61 62 6c 65 0a 20 20 20 20  OP_Variable.    
10470 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b       && pOp->p1+
10480 70 4f 70 2d 3e 70 33 3d 3d 70 45 78 70 72 2d 3e  pOp->p3==pExpr->
10490 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20  iTable.         
104a0 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e  && pOp->p2+pOp->
104b0 70 33 3d 3d 74 61 72 67 65 74 0a 20 20 20 20 20  p3==target.     
104c0 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a      && pOp->p4.z
104d0 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
104e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
104f0 72 65 76 69 6f 75 73 20 69 6e 73 74 72 75 63 74  revious instruct
10500 69 6f 6e 20 77 61 73 20 61 20 63 6f 70 79 20 6f  ion was a copy o
10510 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 75  f the previous u
10520 6e 6e 61 6d 65 64 0a 20 20 20 20 20 20 20 20 2a  nnamed.        *
10530 2a 20 70 61 72 61 6d 65 74 65 72 20 69 6e 74 6f  * parameter into
10540 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 65   the previous re
10550 67 69 73 74 65 72 2c 20 74 68 65 6e 20 73 69 6d  gister, then sim
10560 70 6c 79 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ply increment th
10570 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70  e.        ** rep
10580 65 61 74 20 63 6f 75 6e 74 20 6f 6e 20 74 68 65  eat count on the
10590 20 70 72 69 6f 72 20 69 6e 73 74 72 75 63 74 69   prior instructi
105a0 6f 6e 20 72 61 74 68 65 72 20 74 68 61 6e 20 6d  on rather than m
105b0 61 6b 69 6e 67 20 61 20 6e 65 77 0a 20 20 20 20  aking a new.    
105c0 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
105d0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
105e0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b         pOp->p3++
105f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10600 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10610 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56  beAddOp3(v, OP_V
10620 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  ariable, pExpr->
10630 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c 20  iTable, target, 
10640 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
10650 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31  pExpr->token.n>1
10660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
10670 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
10680 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  4(v, -1, (char*)
10690 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
106a0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
106b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
106c0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
106d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
106e0 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
106f0 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
10700 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
10710 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10720 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a    case TK_AS: {.
10730 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 63 6f        inReg = co
10740 64 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20  deAlias(pParse, 
10750 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70  pExpr->iTable, p
10760 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
10770 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
10780 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
10790 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
107a0 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
107b0 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
107c0 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
107d0 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
107e0 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
107f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c  /.      int aff,
10800 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e   to_op;.      in
10810 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
10820 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
10830 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
10840 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
10850 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66   aff = sqlite3Af
10860 66 69 6e 69 74 79 54 79 70 65 28 26 70 45 78 70  finityType(&pExp
10870 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  r->token);.     
10880 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53   to_op = aff - S
10890 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b  QLITE_AFF_TEXT +
108a0 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20   OP_ToText;.    
108b0 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
108c0 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c  =OP_ToText    ||
108d0 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
108e0 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20  _TEXT    );.    
108f0 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
10900 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c  =OP_ToBlob    ||
10910 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
10920 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20  _NONE    );.    
10930 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
10940 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c  =OP_ToNumeric ||
10950 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
10960 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20  _NUMERIC );.    
10970 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
10980 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c  =OP_ToInt     ||
10990 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
109a0 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
109b0 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
109c0 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c  =OP_ToReal    ||
109d0 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
109e0 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20  _REAL    );.    
109f0 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
10a00 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a  p==OP_ToText );.
10a10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10a20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62  to_op==OP_ToBlob
10a30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
10a40 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
10a50 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20  Numeric );.     
10a60 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
10a70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20  ==OP_ToInt );.  
10a80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
10a90 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29  _op==OP_ToReal )
10aa0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
10ab0 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20  g!=target ){.   
10ac0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10ad0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
10ae0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
10af0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  t);.        inRe
10b00 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
10b10 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10b20 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74  3VdbeAddOp1(v, t
10b30 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20  o_op, inReg);.  
10b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73      testcase( us
10b50 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
10b60 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69  pParse, inReg, i
10b70 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73  nReg) );.      s
10b80 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
10b90 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
10ba0 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b  arse, inReg, 1);
10bb0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10bc0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
10bd0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
10be0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
10bf0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
10c00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
10c10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
10c20 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
10c30 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
10c40 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
10c50 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
10c60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10c70 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
10c80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10c90 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
10ca0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
10cb0 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
10cc0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
10cd0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
10ce0 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
10cf0 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Ne );.      te
10d00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
10d10 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
10d20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
10d30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
10d40 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
10d50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
10d60 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
10d70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
10d80 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
10d90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
10da0 4e 45 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  NE );.      code
10db0 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28  CompareOperands(
10dc0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
10dd0 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46  Left, &r1, &regF
10de0 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ree1,.          
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
10e10 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67  Right, &r2, &reg
10e20 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
10e30 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
10e40 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
10e50 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
10e60 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
10e70 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
10e80 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
10e90 50 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  P2);.      testc
10ea0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
10eb0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
10ec0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
10ed0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10ee0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
10ef0 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
10f00 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  TK_OR:.    case 
10f10 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
10f20 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63  e TK_STAR:.    c
10f30 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
10f40 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20    case TK_REM:. 
10f50 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
10f60 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  D:.    case TK_B
10f70 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  ITOR:.    case T
10f80 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73  K_SLASH:.    cas
10f90 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
10fa0 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
10fb0 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f   .    case TK_CO
10fc0 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  NCAT: {.      as
10fd0 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50  sert( TK_AND==OP
10fe0 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _And );.      as
10ff0 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
11000 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
11010 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
11020 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Add );.      ass
11030 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
11040 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20  P_Subtract );.  
11050 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
11060 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
11070 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11080 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
11090 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  BitAnd );.      
110a0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
110b0 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20  ==OP_BitOr );.  
110c0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
110d0 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
110e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
110f0 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
11100 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20  hiftLeft );.    
11110 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
11120 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
11130 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ht );.      asse
11140 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
11150 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20  P_Concat );.    
11160 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
11170 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
11180 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
11190 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _OR );.      tes
111a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
111b0 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
111c0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e  case( op==TK_MIN
111d0 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
111e0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
111f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11200 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
11210 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
11220 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f  ase( op==TK_BITO
11230 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
11240 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
11250 48 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  H );.      testc
11260 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49  ase( op==TK_LSHI
11270 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  FT );.      test
11280 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
11290 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  IFT );.      tes
112a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
112b0 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
112c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
112d0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
112e0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
112f0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
11300 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
11310 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
11320 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
11330 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
11340 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11350 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
11360 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
11370 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
11380 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
11390 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
113a0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
113b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
113c0 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
113d0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
113e0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
113f0 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
11400 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
11410 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
11420 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
11430 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
11440 28 63 68 61 72 2a 29 70 4c 65 66 74 2d 3e 74 6f  (char*)pLeft->to
11450 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f  ken.z, pLeft->to
11460 6b 65 6e 2e 6e 2c 20 31 2c 20 74 61 72 67 65 74  ken.n, 1, target
11470 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
11480 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
11490 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
114a0 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
114b0 76 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72  v, pLeft, 1, tar
114c0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  get);.      }els
114d0 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  e{.        regFr
114e0 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69 74  ee1 = r1 = sqlit
114f0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11500 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
11510 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11520 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
11530 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 72  , r1);.        r
11540 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
11550 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
11560 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
11570 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
11580 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11590 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
115a0 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
115b0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
115c0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
115d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
115e0 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
115f0 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
11600 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11610 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
11620 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
11630 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
11640 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
11650 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11660 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
11670 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11680 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f  se( op==TK_BITNO
11690 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
116a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
116b0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
116c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
116d0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
116e0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
116f0 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
11700 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
11710 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
11720 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73   target;.      s
11730 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11740 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65  (v, op, r1, inRe
11750 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
11760 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11770 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
11780 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
11790 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
117a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
117b0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
117c0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Null );.      as
117d0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
117e0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
117f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11800 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
11810 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11820 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
11830 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11840 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11850 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
11860 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  get);.      r1 =
11870 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11880 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
11890 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
118a0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
118b0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
118c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
118d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
118e0 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b  dOp1(v, op, r1);
118f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11900 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
11910 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d  ddImm, target, -
11920 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
11930 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11940 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
11950 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
11960 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
11970 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  ION: {.      Agg
11980 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45  Info *pInfo = pE
11990 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
119a0 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d       if( pInfo==
119b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
119c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
119d0 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
119e0 61 67 67 72 65 67 61 74 65 3a 20 25 54 22 2c 0a  aggregate: %T",.
119f0 20 20 20 20 20 20 20 20 20 20 20 20 26 70 45 78              &pEx
11a00 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  pr->span);.     
11a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11a20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61  inReg = pInfo->a
11a30 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
11a40 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ].iMem;.      }.
11a50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11a60 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
11a70 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63  ONST_FUNC:.    c
11a80 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
11a90 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
11aa0 74 20 2a 70 4c 69 73 74 20 3d 20 28 0a 20 20 20  t *pList = (.   
11ab0 20 20 20 20 20 45 78 70 72 48 61 73 41 6e 79 50       ExprHasAnyP
11ac0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
11ad0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53  P_TokenOnly|EP_S
11ae0 70 61 6e 4f 6e 6c 79 29 20 3f 20 30 20 3a 20 70  panOnly) ? 0 : p
11af0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 0a 20 20  Expr->x.pList.  
11b00 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 6e 74      );.      int
11b10 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f   nExpr = pList ?
11b20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
11b30 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  0;.      FuncDef
11b40 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69 6e   *pDef;.      in
11b50 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e  t nId;.      con
11b60 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20  st char *zId;.  
11b70 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73      int constMas
11b80 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  k = 0;.      int
11b90 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63   i;.      u8 enc
11ba0 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
11bb0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
11bc0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61 73 73   = 0;..      ass
11bd0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
11be0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
11bf0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
11c00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
11c10 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20  ==TK_CONST_FUNC 
11c20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
11c30 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  e( op==TK_FUNCTI
11c40 4f 4e 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20  ON );.      zId 
11c50 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  = (char*)pExpr->
11c60 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e  token.z;.      n
11c70 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  Id = pExpr->toke
11c80 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20  n.n;.      pDef 
11c90 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
11ca0 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e  ction(db, zId, n
11cb0 49 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20  Id, nExpr, enc, 
11cc0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
11cd0 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20  ( pDef!=0 );.   
11ce0 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
11cf0 20 20 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20          nExpr = 
11d00 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
11d10 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
11d20 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
11d30 50 61 72 73 65 2c 20 6e 45 78 70 72 29 3b 0a 20  Parse, nExpr);. 
11d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
11d50 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
11d60 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 31  Parse, pList, r1
11d70 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
11d80 65 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 70 72  e{.        nExpr
11d90 20 3d 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20   = r1 = 0;.     
11da0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
11db0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11dc0 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
11dd0 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
11de0 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
11df0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
11e00 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
11e10 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
11e20 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
11e30 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
11e40 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
11e50 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
11e60 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
11e70 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
11e80 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
11e90 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
11ea0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
11eb0 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
11ec0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
11ed0 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
11ee0 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
11ef0 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
11f00 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
11f10 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
11f20 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
11f30 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
11f40 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
11f50 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
11f60 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
11f70 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
11f80 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
11f90 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
11fa0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
11fb0 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
11fc0 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
11fd0 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
11fe0 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
11ff0 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
12000 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
12010 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
12020 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
12030 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
12040 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
12050 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
12060 20 20 20 20 69 66 28 20 6e 45 78 70 72 3e 3d 32      if( nExpr>=2
12070 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
12080 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
12090 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
120a0 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
120b0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
120c0 64 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c  db, pDef, nExpr,
120d0 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
120e0 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
120f0 20 69 66 28 20 6e 45 78 70 72 3e 30 20 29 7b 0a   if( nExpr>0 ){.
12100 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
12110 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
12120 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
12130 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73  Def, nExpr, pLis
12140 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
12150 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
12160 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12170 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69  nExpr && i<32; i
12180 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
12190 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
121a0 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b  nstant(pList->a[
121b0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
121c0 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
121d0 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20   |= (1<<i);.    
121e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
121f0 28 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  ( (pDef->flags &
12200 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
12210 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43  DCOLL)!=0 && !pC
12220 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
12230 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
12240 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
12250 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
12260 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
12270 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
12280 69 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20  if( pDef->flags 
12290 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
122a0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
122b0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
122c0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
122d0 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
122e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
122f0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
12300 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
12310 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
12320 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
12330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12340 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
12350 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20  ion, constMask, 
12360 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  r1, target,.    
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12380 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c      (char*)pDef,
12390 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
123a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
123b0 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
123c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
123d0 20 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20   nExpr ){.      
123e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
123f0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
12400 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20 20  , r1, nExpr);.  
12410 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
12420 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
12430 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
12440 65 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20  e, r1, nExpr);. 
12450 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12460 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
12470 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
12480 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
12490 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
124a0 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74  ELECT: {.      t
124b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
124c0 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
124d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
124e0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
124f0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
12500 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
12510 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
12520 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
12530 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Expr, 0, 0);.   
12540 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
12550 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
12560 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  n;.      break;.
12570 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
12580 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
12590 74 20 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 30 3b  t rNotFound = 0;
125a0 0a 20 20 20 20 20 20 69 6e 74 20 72 4d 61 79 48  .      int rMayH
125b0 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
125c0 20 20 20 69 6e 74 20 6a 32 2c 20 6a 33 2c 20 6a     int j2, j3, j
125d0 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63 68 61  4, j5;.      cha
125e0 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  r affinity;.    
125f0 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20    int eType;..  
12600 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
12610 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
12620 4e 20 65 78 70 72 20 72 25 64 22 2c 20 74 61 72  N expr r%d", tar
12630 67 65 74 29 29 3b 0a 20 20 20 20 20 20 65 54 79  get));.      eTy
12640 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
12650 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
12660 70 45 78 70 72 2c 20 26 72 4d 61 79 48 61 76 65  pExpr, &rMayHave
12670 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  Null);.      if(
12680 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b   rMayHaveNull ){
12690 0a 20 20 20 20 20 20 20 20 72 4e 6f 74 46 6f 75  .        rNotFou
126a0 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nd = ++pParse->n
126b0 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  Mem;.      }..  
126c0 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
126d0 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
126e0 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20  o use to create 
126f0 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72  a key from the r
12700 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
12710 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
12720 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73  n. affinityStr s
12730 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73  tores a static s
12740 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
12750 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 34 20 6f  or.      ** P4 o
12760 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e  f OP_MakeRecord.
12770 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12780 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61  affinity = compa
12790 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
127a0 78 70 72 29 3b 0a 0a 0a 20 20 20 20 20 20 2f 2a  xpr);...      /*
127b0 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e   Code the <expr>
127c0 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
127d0 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d   (...)". The tem
127e0 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20  porary table.   
127f0 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61     ** pExpr->iTa
12800 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ble contains the
12810 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
12820 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73  e up the (...) s
12830 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  et..      */.   
12840 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
12850 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20  leColCache++;.  
12860 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
12870 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
12880 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
12890 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
128a0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
128b0 2d 2d 3b 0a 20 20 20 20 20 20 6a 32 20 3d 20 73  --;.      j2 = s
128c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
128d0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 74  (v, OP_IsNull, t
128e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
128f0 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
12900 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
12910 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56     j3 = sqlite3V
12920 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12930 4d 75 73 74 42 65 49 6e 74 2c 20 74 61 72 67 65  MustBeInt, targe
12940 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 34 20 3d  t);.        j4 =
12950 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12960 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
12970 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ts, pExpr->iTabl
12980 65 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  e, 0, target);. 
12990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
129a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
129b0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
129c0 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d  t);.        j5 =
129d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
129e0 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
129f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12a00 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
12a10 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
12a20 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
12a30 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 20 20  v, j4);.        
12a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12a50 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
12a60 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
12a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12a80 20 20 72 32 20 3d 20 72 65 67 46 72 65 65 32 20    r2 = regFree2 
12a90 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
12aa0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Reg(pParse);..  
12ab0 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
12ac0 61 20 72 65 63 6f 72 64 20 61 6e 64 20 74 65 73  a record and tes
12ad0 74 20 66 6f 72 20 73 65 74 20 6d 65 6d 62 65 72  t for set member
12ae0 73 68 69 70 2e 20 49 66 20 74 68 65 20 73 65 74  ship. If the set
12af0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
12b00 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 2c 20    ** the value, 
12b10 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
12b20 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65 73 74   end of the test
12b30 20 63 6f 64 65 2e 20 54 68 65 20 74 61 72 67 65   code. The targe
12b40 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 67  t.        ** reg
12b50 69 73 74 65 72 20 73 74 69 6c 6c 20 63 6f 6e 74  ister still cont
12b60 61 69 6e 73 20 74 68 65 20 74 72 75 65 20 28 31  ains the true (1
12b70 29 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20  ) value written 
12b80 74 6f 20 69 74 20 65 61 72 6c 69 65 72 2e 0a 20  to it earlier.. 
12b90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
12ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12bb0 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
12bc0 63 6f 72 64 2c 20 74 61 72 67 65 74 2c 20 31 2c  cord, target, 1,
12bd0 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
12be0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
12bf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12c00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
12c10 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
12c20 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j5 = sqlite3Vdb
12c30 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f  eAddOp3(v, OP_Fo
12c40 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
12c50 6c 65 2c 20 30 2c 20 72 32 29 3b 0a 0a 20 20 20  le, 0, r2);..   
12c60 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
12c70 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
12c80 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  st fails, then t
12c90 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
12ca0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 78 20   .        ** "x 
12cb0 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73  IN (...)" expres
12cc0 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74  sion must be eit
12cd0 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49  her 0 or NULL. I
12ce0 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  f the set.      
12cf0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
12d00 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
12d10 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
12d20 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a   0. If the set .
12d30 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
12d40 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
12d50 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
12d60 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
12d70 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  the.        ** e
12d80 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73  xpression is als
12d90 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
12da0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
12db0 4e 6f 74 46 6f 75 6e 64 3d 3d 30 20 29 7b 0a 20  NotFound==0 ){. 
12dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
12dd0 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
12de0 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63  it is known at c
12df0 6f 6d 70 69 6c 65 20 74 69 6d 65 20 28 6e 6f 77  ompile time (now
12e00 29 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20  ) that .        
12e10 20 20 2a 2a 20 74 68 65 20 73 65 74 20 63 6f 6e    ** the set con
12e20 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61  tains no NULL va
12e30 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65  lues. This happe
12e40 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ns as the result
12e50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
12e60 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   a "NOT NULL" co
12e70 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20  nstraint in the 
12e80 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
12e90 20 4e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 20   No need.       
12ea0 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
12eb0 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
12ec0 20 61 74 20 72 75 6e 74 69 6d 65 20 69 6e 20 74   at runtime in t
12ed0 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
12ee0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
12ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12f00 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
12f10 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
12f20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12f30 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
12f40 6c 6f 63 6b 20 70 6f 70 75 6c 61 74 65 73 20 74  lock populates t
12f50 68 65 20 72 4e 6f 74 46 6f 75 6e 64 20 72 65 67  he rNotFound reg
12f60 69 73 74 65 72 20 77 69 74 68 20 65 69 74 68 65  ister with eithe
12f70 72 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20  r NULL.         
12f80 20 2a 2a 20 6f 72 20 30 20 28 61 6e 20 69 6e 74   ** or 0 (an int
12f90 65 67 65 72 20 76 61 6c 75 65 29 2e 20 49 66 20  eger value). If 
12fa0 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
12fb0 72 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 0a  re contains one.
12fc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
12fd0 6d 6f 72 65 20 4e 55 4c 4c 73 2c 20 74 68 65 6e  more NULLs, then
12fe0 20 73 65 74 20 72 4e 6f 74 46 6f 75 6e 64 20 74   set rNotFound t
12ff0 6f 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73  o NULL. Otherwis
13000 65 2c 20 73 65 74 20 69 74 0a 20 20 20 20 20 20  e, set it.      
13010 20 20 20 20 2a 2a 20 74 6f 20 30 2e 20 49 66 20      ** to 0. If 
13020 72 65 67 69 73 74 65 72 20 72 4d 61 79 48 61 76  register rMayHav
13030 65 4e 75 6c 6c 20 69 73 20 61 6c 72 65 61 64 79  eNull is already
13040 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c   set to some val
13050 75 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ue.          ** 
13060 6f 74 68 65 72 20 74 68 61 6e 20 4e 55 4c 4c 2c  other than NULL,
13070 20 74 68 65 6e 20 74 68 65 20 74 65 73 74 20 68   then the test h
13080 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
13090 72 75 6e 20 61 6e 64 20 0a 20 20 20 20 20 20 20  run and .       
130a0 20 20 20 2a 2a 20 72 4e 6f 74 46 6f 75 6e 64 20     ** rNotFound 
130b0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  is already popul
130c0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  ated..          
130d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  */.          sta
130e0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e  tic const char n
130f0 75 6c 6c 52 65 63 6f 72 64 5b 5d 20 3d 20 7b 20  ullRecord[] = { 
13100 30 78 30 32 2c 20 30 78 30 30 20 7d 3b 0a 20 20  0x02, 0x00 };.  
13110 20 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c          j3 = sql
13120 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13130 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 4d  , OP_NotNull, rM
13140 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20  ayHaveNull);.   
13150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13160 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
13170 75 6c 6c 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e  ull, 0, rNotFoun
13180 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  d);.          sq
13190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
131a0 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 32 2c 20 72  v, OP_Blob, 2, r
131b0 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 30 2c 20  MayHaveNull, 0, 
131c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
131e0 6c 6c 52 65 63 6f 72 64 2c 20 50 34 5f 53 54 41  llRecord, P4_STA
131f0 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
13200 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j4 = sqlite3Vdbe
13210 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75  AddOp3(v, OP_Fou
13220 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
13230 65 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75  e, 0, rMayHaveNu
13240 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ll);.          s
13250 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13260 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13270 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20  0, rNotFound);. 
13280 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13290 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
132a0 6a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  j4);.          s
132b0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
132c0 72 65 28 76 2c 20 6a 33 29 3b 0a 0a 20 20 20 20  re(v, j3);..    
132d0 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
132e0 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73  e value of regis
132f0 74 65 72 20 72 4e 6f 74 46 6f 75 6e 64 20 28 77  ter rNotFound (w
13300 68 69 63 68 20 69 73 20 65 69 74 68 65 72 20 4e  hich is either N
13310 55 4c 4c 20 6f 72 20 30 29 0a 20 20 20 20 20 20  ULL or 0).      
13320 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
13330 74 61 72 67 65 74 20 72 65 67 69 73 74 65 72 2e  target register.
13340 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   This will be th
13350 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  e result of the.
13360 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
13370 72 65 73 73 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ression..       
13380 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
13390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
133a0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4e  2(v, OP_Copy, rN
133b0 6f 74 46 6f 75 6e 64 2c 20 74 61 72 67 65 74 29  otFound, target)
133c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
133d0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
133e0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
133f0 20 6a 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   j2);.      sqli
13400 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13410 76 2c 20 6a 35 29 3b 0a 20 20 20 20 20 20 56 64  v, j5);.      Vd
13420 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
13430 6e 64 20 49 4e 20 65 78 70 72 20 72 25 64 22 2c  nd IN expr r%d",
13440 20 74 61 72 67 65 74 29 29 3b 0a 20 20 20 20 20   target));.     
13450 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
13460 6e 64 69 66 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ndif.    /*.    
13470 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
13480 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20  y AND z.    **. 
13490 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71     ** This is eq
134a0 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20  uivalent to.    
134b0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d  **.    **    x>=
134c0 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a  y AND x<=z.    *
134d0 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74  *.    ** X is st
134e0 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
134f0 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
13500 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
13510 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
13520 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69  Expr..    ** Z i
13530 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
13540 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
13550 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Expr..    */.   
13560 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
13570 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
13580 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
13590 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75  Left;.      stru
135a0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
135b0 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72   *pLItem = pExpr
135c0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20  ->x.pList->a;.  
135d0 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
135e0 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
135f0 3b 0a 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  ;..      codeCom
13600 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61  pareOperands(pPa
13610 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 31 2c  rse, pLeft, &r1,
13620 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20   &regFree1,.    
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
13650 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46  ight, &r2, &regF
13660 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
13670 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
13680 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
13690 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
136a0 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  0 );.      r3 = 
136b0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
136c0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
136d0 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r4 = sqlite3Get
136e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
136f0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
13700 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
13710 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c  , pRight, OP_Ge,
13720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13730 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53     r1, r2, r3, S
13740 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
13750 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a        pLItem++;.
13760 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
13770 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  LItem->pExpr;.  
13780 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
13790 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
137a0 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20  , regFree2);.   
137b0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
137c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
137d0 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67  se, pRight, &reg
137e0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65  Free2);.      te
137f0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
13800 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
13810 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
13820 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
13830 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72  OP_Le, r1, r2, r
13840 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  4, SQLITE_STOREP
13850 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
13860 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
13870 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74  P_And, r3, r4, t
13880 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
13890 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
138a0 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b  Reg(pParse, r3);
138b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
138c0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
138d0 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20  rse, r4);.      
138e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
138f0 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
13900 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  {.      inReg = 
13910 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
13920 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
13930 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
13940 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
13950 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
13960 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20      ** Form A:. 
13970 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57     **   CASE x W
13980 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
13990 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
139a0 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
139b0 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
139c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
139d0 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   B:.    **   CAS
139e0 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  E WHEN e1 THEN r
139f0 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
13a00 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
13a10 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
13a20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
13a30 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20  orm A is can be 
13a40 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
13a50 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
13a60 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77  form B as follow
13a70 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  s:.    **   CASE
13a80 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20   WHEN x=e1 THEN 
13a90 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45  r1 WHEN x=e2 THE
13aa0 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20  N r2 ....    ** 
13ab0 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e         WHEN x=eN
13ac0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
13ad0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
13ae0 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74  * X (if it exist
13af0 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  s) is in pExpr->
13b00 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
13b10 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 52 69  is in pExpr->pRi
13b20 67 68 74 2e 20 20 54 68 65 20 59 20 69 73 20 61  ght.  The Y is a
13b30 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49  lso optional.  I
13b40 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20  f there is no.  
13b50 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75 73 65    ** ELSE clause
13b60 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 74 65   and no other te
13b70 72 6d 20 6d 61 74 63 68 65 73 2c 20 74 68 65 6e  rm matches, then
13b80 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
13b90 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 73 73  he.    ** exprss
13ba0 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20  ion is NULL..   
13bb0 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78   ** Ei is in pEx
13bc0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
13bd0 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70  ] and Ri is pExp
13be0 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b  r->pList->a[i*2+
13bf0 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  1]..    **.    *
13c00 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * The result of 
13c10 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
13c20 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65  s the Ri for the
13c30 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
13c40 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66  Ei,.    ** or if
13c50 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74   there is no mat
13c60 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c  ching Ei, the EL
13c70 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66  SE term Y, or if
13c80 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a   there is.    **
13c90 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e   no ELSE term, N
13ca0 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
13cb0 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a  case TK_CASE: {.
13cc0 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62        int endLab
13cd0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
13ce0 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20          /* GOTO 
13cf0 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66  label for end of
13d00 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20   CASE stmt */.  
13d10 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65      int nextCase
13d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13d30 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
13d40 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45  bel for next WHE
13d50 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  N clause */.    
13d60 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20    int nExpr;    
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d80 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72      /* 2x number
13d90 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
13da0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
13dd0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
13de0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
13df0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
13e00 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
13e10 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
13e20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
13e30 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65  ist_item *aListe
13e40 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f  lem;  /* Array o
13e50 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
13e60 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d        Expr opCom
13e70 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  pare;           
13e80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
13e90 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20  ==Ei expression 
13ea0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 63 61  */.      Expr ca
13eb0 63 68 65 58 3b 20 20 20 20 20 20 20 20 20 20 20  cheX;           
13ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
13ed0 63 68 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  ched expression 
13ee0 58 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  X */.      Expr 
13ef0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f10 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e  The X expression
13f20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
13f30 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pTest = 0;      
13f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
13f50 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72  ==Ei (form A) or
13f60 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42   just Ei (form B
13f70 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  ) */..      asse
13f80 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
13f90 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
13fa0 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78  IsSelect) && pEx
13fb0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20  pr->x.pList );. 
13fc0 20 20 20 20 20 61 73 73 65 72 74 28 28 70 45 78       assert((pEx
13fd0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
13fe0 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20  pr % 2) == 0);. 
13ff0 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
14000 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
14010 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
14020 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
14030 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
14040 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
14050 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
14060 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
14070 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20  .      endLabel 
14080 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
14090 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
140a0 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
140b0 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
140c0 20 20 20 20 20 20 20 63 61 63 68 65 58 20 3d 20         cacheX = 
140d0 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73  *pX;.        tes
140e0 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54  tcase( pX->op==T
140f0 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 58 2d 3e  K_COLUMN || pX->
14100 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
14110 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65  );.        cache
14120 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  X.iTable = sqlit
14130 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
14140 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46  Parse, pX, &regF
14150 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 74  ree1);.        t
14160 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
14170 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
14180 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52  cacheX.op = TK_R
14190 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20  EGISTER;.       
141a0 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
141b0 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
141c0 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
141d0 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20   &cacheX;.      
141e0 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
141f0 70 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pare;.      }.  
14200 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
14210 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  bleColCache++;. 
14220 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14230 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
14240 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b         if( pX ){
14250 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
14260 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20  t( pTest!=0 );. 
14270 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
14280 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
14290 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
142a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
142b0 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
142c0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
142d0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
142e0 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
142f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
14300 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
14310 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
14320 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  st->op==TK_COLUM
14330 4e 20 7c 7c 20 70 54 65 73 74 2d 3e 6f 70 3d 3d  N || pTest->op==
14340 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
14350 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
14360 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
14370 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
14380 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
14390 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
143a0 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
143b0 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
143c0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
143d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
143e0 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
143f0 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52  .pExpr->op==TK_R
14400 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
14410 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14420 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
14430 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
14440 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14450 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14460 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
14470 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  0, endLabel);.  
14480 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14490 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
144a0 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20   nextCase);.    
144b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
144c0 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
144d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
144e0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
144f0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 74 61  Expr->pRight, ta
14500 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  rget);.      }el
14510 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
14520 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14530 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
14540 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
14550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
14560 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
14570 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
14580 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
14590 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e  disableColCache>
145a0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  0 );.      pPars
145b0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
145c0 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61  he--;.      brea
145d0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
145e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
145f0 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
14600 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
14610 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69  if( !pParse->tri
14620 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  gStack ){.      
14630 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14640 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
14670 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
14680 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
14690 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
146a0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
146b0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
146c0 2d 3e 61 66 66 69 6e 69 74 79 21 3d 4f 45 5f 49  ->affinity!=OE_I
146d0 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
146e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
146f0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
14700 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20  llback ||.      
14710 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
14720 2d 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20 4f 45  ->affinity == OE
14730 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20  _Abort ||.      
14740 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
14750 2d 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20 4f 45  ->affinity == OE
14760 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20  _Fail );.       
14770 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
14780 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 29 3b  Expr(db, pExpr);
14790 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
147a0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
147b0 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43  P_Halt, SQLITE_C
147c0 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70 72  ONSTRAINT, pExpr
147d0 2d 3e 61 66 66 69 6e 69 74 79 2c 20 30 2c 0a 20  ->affinity, 0,. 
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45         (char*)pE
14800 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
14810 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
14820 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
14830 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14840 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
14850 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20  = OE_Ignore );. 
14860 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14870 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14880 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30  ContextPop, 0, 0
14890 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
148a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
148b0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
148c0 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e  rse->trigStack->
148d0 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20  ignoreJump);.   
148e0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
148f0 74 28 28 76 2c 20 22 72 61 69 73 65 28 49 47 4e  t((v, "raise(IGN
14900 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d  ORE)"));.      }
14910 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14920 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
14930 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14940 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14950 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
14960 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14970 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
14980 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  e2);.  return in
14990 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
149a0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
149b0 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
149c0 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ssion and store 
149d0 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
149e0 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
149f0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
14a00 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72  ster number wher
14a10 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
14a20 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
14a30 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74  ** If the regist
14a40 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
14a50 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  y register that 
14a60 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74  can be deallocat
14a70 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  ed,.** then writ
14a80 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74  e its number int
14a90 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65  o *pReg.  If the
14aa0 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
14ab0 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d   is not.** a tem
14ac0 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74  porary, then set
14ad0 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a   *pReg to zero..
14ae0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
14af0 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
14b00 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
14b10 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
14b20 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71  ){.  int r1 = sq
14b30 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
14b40 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
14b50 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
14b60 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
14b70 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
14b80 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20  if( r2==r1 ){.  
14b90 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20    *pReg = r1;.  
14ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
14bb0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
14bc0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
14bd0 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d    *pReg = 0;.  }
14be0 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a  .  return r2;.}.
14bf0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14c00 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
14c10 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
14c20 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
14c30 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
14c40 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
14c50 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
14c60 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
14c70 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
14c80 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
14c90 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
14ca0 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
14cb0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
14cc0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
14cd0 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  ){.  int inReg;.
14ce0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
14cf0 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
14d00 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
14d10 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
14d20 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
14d30 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
14d40 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28  rget);.  assert(
14d50 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c   pParse->pVdbe |
14d60 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
14d70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
14d80 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
14d90 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
14da0 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  be ){.    sqlite
14db0 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
14dc0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
14dd0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
14de0 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  et);.  }.  retur
14df0 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a  n target;.}../*.
14e00 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
14e10 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74   that evalutes t
14e20 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
14e30 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65  ion and puts the
14e40 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65   result.** in re
14e50 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
14e60 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61  *.** Also make a
14e70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
14e80 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20  ression results 
14e90 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61  into another "ca
14ea0 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a  che" register.**
14eb0 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
14ec0 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68  expression so th
14ed0 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  at the next time
14ee0 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
14ef0 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
14f00 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
14f10 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e   cache register.
14f20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14f30 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
14f40 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
14f50 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70   are used multip
14f60 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54  le .** times.  T
14f70 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65  hey are evaluate
14f80 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  d once and the r
14f90 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78  esults of the ex
14fa0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  pression.** are 
14fb0 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  reused..*/.int s
14fc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e  qlite3ExprCodeAn
14fd0 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  dCache(Parse *pP
14fe0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
14ff0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
15000 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
15010 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
15020 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67 20   inReg;.  inReg 
15030 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15040 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
15050 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65   target);.  asse
15060 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
15070 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
15080 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 20  =TK_REGISTER ){ 
15090 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a   .    int iMem;.
150a0 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61      iMem = ++pPa
150b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
150c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
150d0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52  (v, OP_Copy, inR
150e0 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70  eg, iMem);.    p
150f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
15100 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  Mem;.    pExpr->
15110 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
15120 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
15130 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nReg;.}../*.** R
15140 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 45  eturn TRUE if pE
15150 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73 74 61  xpr is an consta
15160 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  nt expression th
15170 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
15180 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72 69  e.** for factori
15190 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ng out of a loop
151a0 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
151b0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a  xpressions are:.
151c0 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20  **.**    *  Any 
151d0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
151e0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 77 6f  evaluates to two
151f0 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73   or more opcodes
15200 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e  ..**.**    *  An
15210 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50  y OP_Integer, OP
15220 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67  _Real, OP_String
15230 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75  , OP_Blob, OP_Nu
15240 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72  ll, .**       or
15250 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74 68 61   OP_Variable tha
15260 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
15270 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20  to be placed in 
15280 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65 63  a .**       spec
15290 69 66 69 63 20 72 65 67 69 73 74 65 72 2e 0a 2a  ific register..*
152a0 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f  *.** There is no
152b0 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f 72   point in factor
152c0 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69  ing out single-i
152d0 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74  nstruction const
152e0 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ant.** expressio
152f0 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  ns that need to 
15300 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 70  be placed in a p
15310 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74  articular regist
15320 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c  er.  .** We coul
15330 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20 6f 75  d factor them ou
15340 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65 20 77  t, but then we w
15350 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64 64 69  ould end up addi
15360 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70  ng an.** OP_SCop
15370 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  y instruction to
15380 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20   move the value 
15390 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
153a0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74   register.** lat
153b0 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73  er.  We might as
153c0 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65 20 74   well just use t
153d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74  he original inst
153e0 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61  ruction and.** a
153f0 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43 6f 70  void the OP_SCop
15400 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
15410 20 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f   isAppropriateFo
15420 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70 72 20  rFactoring(Expr 
15430 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69  *p){.  if( !sqli
15440 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
15450 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20  tNotJoin(p) ){. 
15460 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
15470 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65   Only constant e
15480 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61  xpressions are a
15490 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 66  ppropriate for f
154a0 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a  actoring */.  }.
154b0 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
154c0 26 20 45 50 5f 46 69 78 65 64 44 65 73 74 29 3d  & EP_FixedDest)=
154d0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
154e0 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73   1;  /* Any cons
154f0 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61 20 66  tant without a f
15500 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e  ixed destination
15510 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
15520 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
15530 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
15540 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a  ) p = p->pLeft;.
15550 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
15560 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
15570 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
15580 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
15590 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20  BLOB:.#endif.   
155a0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
155b0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  E:.    case TK_I
155c0 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
155d0 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
155e0 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20  ase TK_NULL:.   
155f0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
15600 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
15610 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f  e( p->op==TK_BLO
15620 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  B );.      testc
15630 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56  ase( p->op==TK_V
15640 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20 20 20  ARIABLE );.     
15650 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
15660 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a  ==TK_INTEGER );.
15670 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15680 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  p->op==TK_FLOAT 
15690 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
156a0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c  e( p->op==TK_NUL
156b0 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
156c0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53  ase( p->op==TK_S
156d0 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f  TRING );.      /
156e0 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63  * Single-instruc
156f0 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77  tion constants w
15700 69 74 68 20 61 20 66 69 78 65 64 20 64 65 73 74  ith a fixed dest
15710 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ination are.    
15720 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e 65    ** better done
15730 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65   in-line.  If we
15740 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20 74 68   factor them, th
15750 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64  ey will just end
15760 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67 65 6e  .      ** up gen
15770 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43  erating an OP_SC
15780 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  opy to move the 
15790 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 65 73  value to the des
157a0 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  tination.      *
157b0 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20  * register. */. 
157c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
157d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
157e0 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
157f0 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e    if( p->pLeft->
15800 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20  op==TK_FLOAT || 
15810 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  p->pLeft->op==TK
15820 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
15830 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
15840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 62        }.       b
15850 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15860 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
15870 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15880 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
15890 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  ./*.** If pExpr 
158a0 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  is a constant ex
158b0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
158c0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
158d0 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f 75  .** factoring ou
158e0 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65  t of a loop, the
158f0 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 65  n evaluate the e
15900 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74  xpression.** int
15910 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64  o a register and
15920 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70   convert the exp
15930 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20 54  ression into a T
15940 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 65 78  K_REGISTER.** ex
15950 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  pression..*/.sta
15960 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e 73  tic int evalCons
15970 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57  tExpr(Walker *pW
15980 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
15990 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  pr){.  Parse *pP
159a0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
159b0 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74 63 68  pParse;.  switch
159c0 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
159d0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
159e0 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  TER: {.      ret
159f0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
15a00 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
15a10 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
15a20 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
15a30 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
15a40 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UNC: {.      /* 
15a50 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
15a60 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 76 65   a function have
15a70 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
15a80 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d  tion..      ** M
15a90 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20 77 61  ark them this wa
15aa0 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e 65 72  y to avoid gener
15ab0 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20 4f 50  ated unneeded OP
15ac0 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  _SCopy.      ** 
15ad0 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20  instructions. . 
15ae0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
15af0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
15b00 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
15b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
15b20 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15b30 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
15b40 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
15b50 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
15b60 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
15b70 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
15b80 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
15b90 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 4c  item *pItem = pL
15ba0 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
15bb0 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  for(; i>0; i--, 
15bc0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
15bd0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
15be0 45 78 70 72 20 29 20 70 49 74 65 6d 2d 3e 70 45  Expr ) pItem->pE
15bf0 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
15c00 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20 20  _FixedDest;.    
15c10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15c20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15c30 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70 70  .  }.  if( isApp
15c40 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f  ropriateForFacto
15c50 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a 20  ring(pExpr) ){. 
15c60 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70 50     int r1 = ++pP
15c70 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
15c80 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20 3d  int r2;.    r2 =
15c90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15ca0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
15cb0 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69  Expr, r1);.    i
15cc0 66 28 20 72 31 21 3d 72 32 20 29 20 73 71 6c 69  f( r1!=r2 ) sqli
15cd0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15ce0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
15cf0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
15d00 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20  K_REGISTER;.    
15d10 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
15d20 72 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57  r2;.    return W
15d30 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
15d40 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
15d50 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  nue;.}../*.** Pr
15d60 65 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74 61  eevaluate consta
15d70 6e 74 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  nt subexpression
15d80 73 20 77 69 74 68 69 6e 20 70 45 78 70 72 20 61  s within pExpr a
15d90 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
15da0 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
15db0 74 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70 45  ters.  Modify pE
15dc0 78 70 72 20 73 6f 20 74 68 61 74 20 74 68 65 20  xpr so that the 
15dd0 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72  constant subexpr
15de0 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b  esions.** are TK
15df0 5f 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64 65  _REGISTER opcode
15e00 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
15e10 74 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20  the precomputed 
15e20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  values..*/.void 
15e30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
15e40 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20 2a  onstants(Parse *
15e50 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
15e60 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  xpr){.  Walker w
15e70 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
15e80 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74 45  ack = evalConstE
15e90 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  xpr;.  w.xSelect
15ea0 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Callback = 0;.  
15eb0 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
15ec0 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
15ed0 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
15ee0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
15ef0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
15f00 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
15f10 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
15f20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
15f30 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
15f40 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20  into a sequence 
15f50 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67  of registers beg
15f60 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74  inning at target
15f70 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
15f80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
15f90 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e  ments evaluated.
15fa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
15fb0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
15fc0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15fd0 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
15fe0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
15ff0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
16000 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
16010 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f  on list to be co
16020 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72  ded */.  int tar
16030 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57  get,        /* W
16040 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65  here to write re
16050 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64  sults */.  int d
16060 6f 48 61 72 64 43 6f 70 79 20 20 20 20 20 2f 2a  oHardCopy     /*
16070 20 4d 61 6b 65 20 61 20 68 61 72 64 20 63 6f 70   Make a hard cop
16080 79 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  y of every eleme
16090 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  nt */.){.  struc
160a0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
160b0 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
160c0 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   n;.  assert( pL
160d0 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ist!=0 );.  asse
160e0 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
160f0 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78    n = pList->nEx
16100 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  pr;.  for(pItem=
16110 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
16120 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
16130 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  ){.    if( pItem
16140 2d 3e 69 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->iAlias ){.    
16150 20 20 69 6e 74 20 69 52 65 67 20 3d 20 63 6f 64    int iReg = cod
16160 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70  eAlias(pParse, p
16170 49 74 65 6d 2d 3e 69 41 6c 69 61 73 2c 20 70 49  Item->iAlias, pI
16180 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61 72 67  tem->pExpr, targ
16190 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  et+i);.      Vdb
161a0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
161b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
161c0 20 20 20 20 20 69 66 28 20 69 52 65 67 21 3d 74       if( iReg!=t
161d0 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20  arget+i ){.     
161e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
161f0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
16200 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74 2b 69  , iReg, target+i
16210 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16220 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
16230 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
16240 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
16250 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
16260 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 48 61 72   }.    if( doHar
16270 64 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 73  dCopy ){.      s
16280 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f  qlite3ExprHardCo
16290 70 79 28 70 50 61 72 73 65 2c 20 74 61 72 67 65  py(pParse, targe
162a0 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, n);.    }.  }
162b0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
162c0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
162d0 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
162e0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
162f0 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
16300 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
16310 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
16320 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
16330 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
16340 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
16350 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
16360 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
16370 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
16380 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
16390 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
163a0 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
163b0 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
163c0 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
163d0 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
163e0 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
163f0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
16400 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  L..**.** This co
16410 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
16420 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
16430 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
16440 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
16450 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
16460 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
16470 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
16480 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
16490 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
164a0 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
164b0 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
164c0 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
164d0 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
164e0 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
164f0 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
16500 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
16510 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
16520 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
16530 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
16540 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
16550 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
16560 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
16570 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
16580 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
16590 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
165a0 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
165b0 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
165c0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
165d0 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
165e0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
165f0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
16600 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
16610 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
16620 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
16630 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
16640 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
16650 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
16660 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
16670 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  n;.  op = pExpr-
16680 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
16690 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
166a0 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
166b0 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
166c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
166d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
166e0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
166f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16700 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
16710 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20  ColCache==0 );. 
16720 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16730 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
16740 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
16750 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49  ,jumpIfNull^SQLI
16760 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
16770 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
16780 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b  sableColCache++;
16790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
167a0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
167b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
167c0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
167d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
167e0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
167f0 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20  ColCache>0 );.  
16800 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
16810 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20  bleColCache--;. 
16820 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16830 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
16840 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
16850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16860 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
16870 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
16880 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
16890 20 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73   testcase( pPars
168a0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
168b0 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  he==0 );.      s
168c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
168d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
168e0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
168f0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
16900 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
16910 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20  olCache++;.     
16920 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
16930 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
16940 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
16950 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
16960 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
16970 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
16980 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50  he>0 );.      pP
16990 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
169a0 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62  Cache--;.      b
169b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
169c0 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
169d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
169e0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
169f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16a00 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
16a10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
16a20 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
16a30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16a40 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
16a50 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
16a60 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
16a70 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
16a80 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
16a90 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
16aa0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  _EQ: {.      ass
16ab0 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  ert( TK_LT==OP_L
16ac0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
16ad0 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20  t( TK_LE==OP_Le 
16ae0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16af0 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b   TK_GT==OP_Gt );
16b00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
16b10 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  K_GE==OP_Ge );. 
16b20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
16b30 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  EQ==OP_Eq );.   
16b40 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45     assert( TK_NE
16b50 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
16b60 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
16b70 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
16b80 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
16b90 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
16ba0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29  ase( op==TK_GT )
16bb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16bc0 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ( op==TK_GE );. 
16bd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
16be0 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
16bf0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16c00 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_NE );.      t
16c10 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
16c20 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
16c30 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61  codeCompareOpera
16c40 6e 64 73 28 70 50 61 72 73 65 2c 20 70 45 78 70  nds(pParse, pExp
16c50 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20 26  r->pLeft, &r1, &
16c60 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20 20  regFree1,.      
16c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c80 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
16c90 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 32 2c 20  r->pRight, &r2, 
16ca0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
16cb0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
16cc0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
16cd0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
16ce0 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
16cf0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
16d00 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
16d10 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
16d20 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
16d30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16d40 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
16d50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16d60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
16d70 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
16d80 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
16d90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
16da0 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
16db0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ll );.      asse
16dc0 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
16dd0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
16de0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
16df0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
16e00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
16e10 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
16e20 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
16e30 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16e40 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16e50 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
16e60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16e70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
16e80 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
16e90 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
16ea0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
16eb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16ec0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
16ed0 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20  N: {.      /*   
16ee0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
16ef0 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   z.      **.    
16f00 20 20 2a 2a 20 49 73 20 65 71 75 69 76 61 6c 65    ** Is equivale
16f10 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a  nt to .      **.
16f20 20 20 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79        **    x>=y
16f30 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20   AND x<=z.      
16f40 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64 65  **.      ** Code
16f50 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
16f60 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
16f70 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
16f80 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ression.      **
16f90 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66   elementation of
16fa0 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20   x..      */.   
16fb0 20 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b     Expr exprAnd;
16fc0 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70  .      Expr comp
16fd0 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
16fe0 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20   compRight;.    
16ff0 20 20 45 78 70 72 20 65 78 70 72 58 3b 0a 0a 20    Expr exprX;.. 
17000 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
17010 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
17020 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
17030 74 29 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  t) );.      expr
17040 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
17050 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  t;.      exprAnd
17060 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
17070 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66      exprAnd.pLef
17080 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
17090 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69       exprAnd.pRi
170a0 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
170b0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
170c0 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20  .op = TK_GE;.   
170d0 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66     compLeft.pLef
170e0 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
170f0 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
17100 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
17110 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
17120 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
17130 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20  op = TK_LE;.    
17140 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
17150 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
17160 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
17170 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
17180 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
17190 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69 54 61  .      exprX.iTa
171a0 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ble = sqlite3Exp
171b0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
171c0 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
171d0 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
171e0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
171f0 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58  0 );.      exprX
17200 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  .op = TK_REGISTE
17210 52 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  R;.      testcas
17220 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
17230 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17240 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
17250 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
17260 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
17270 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17280 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
17290 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
172a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
172b0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
172c0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
172d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
172e0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp3(v, OP_If, r
172f0 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
17300 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74  ull!=0);.      t
17310 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
17320 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
17330 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
17340 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  ll==0 );.      b
17350 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
17360 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
17370 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
17380 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
17390 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
173a0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
173b0 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
173c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
173d0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
173e0 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
173f0 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
17400 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
17410 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
17420 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
17430 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
17440 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
17450 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
17460 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
17470 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
17480 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
17490 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
174a0 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
174b0 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
174c0 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
174d0 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
174e0 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
174f0 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
17500 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
17510 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17520 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
17530 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
17540 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
17550 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
17560 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
17570 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
17580 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
17590 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
175a0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
175b0 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
175c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
175d0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
175e0 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
175f0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
17600 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
17610 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
17620 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
17630 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
17640 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
17650 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
17660 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
17670 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
17680 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
17690 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
176a0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
176b0 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
176c0 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
176d0 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
176e0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
176f0 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
17700 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
17710 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
17720 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
17730 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
17740 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
17750 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
17760 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
17770 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
17780 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
17790 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
177a0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
177b0 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
177c0 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
177d0 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
177e0 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
177f0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
17800 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
17810 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
17820 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
17830 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
17840 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
17850 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
17860 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
17870 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
17880 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
17890 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
178a0 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
178b0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
178c0 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
178d0 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
178e0 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
178f0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
17900 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
17910 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
17920 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
17930 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
17940 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
17950 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
17960 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
17970 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
17980 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
17990 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
179a0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
179b0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
179c0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
179d0 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
179e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
179f0 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
17a00 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
17a10 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
17a20 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
17a30 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
17a40 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
17a50 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
17a60 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
17a70 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
17a80 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
17a90 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
17aa0 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
17ab0 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
17ac0 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
17ad0 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
17ae0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
17af0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
17b00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17b10 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  e( pParse->disab
17b20 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b  leColCache==0 );
17b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17b40 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
17b50 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
17b60 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
17b70 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
17b80 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
17b90 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
17ba0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
17bb0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
17bc0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
17bd0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
17be0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73  ert( pParse->dis
17bf0 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29  ableColCache>0 )
17c00 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
17c10 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d  disableColCache-
17c20 2d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  -;.      break;.
17c30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
17c40 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
17c50 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
17c60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17c70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17c80 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
17c90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17ca0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
17cb0 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20  ColCache==0 );. 
17cc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17cd0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
17ce0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
17cf0 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49   jumpIfNull^SQLI
17d00 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
17d10 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
17d20 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b  sableColCache++;
17d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17d40 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
17d50 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
17d60 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
17d70 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
17d80 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
17d90 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20  eColCache>0 );. 
17da0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
17db0 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  ableColCache--;.
17dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17dd0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17de0 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
17df0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17e00 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
17e10 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
17e20 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
17e30 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
17e40 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
17e50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17e60 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
17e70 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
17e80 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
17e90 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
17ea0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
17eb0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
17ec0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
17ed0 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
17ee0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17ef0 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
17f00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17f10 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
17f20 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17f30 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
17f40 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
17f50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17f60 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
17f70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17f80 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
17f90 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
17fa0 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73  reOperands(pPars
17fb0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
17fc0 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c   &r1, &regFree1,
17fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
18000 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32  , &r2, &regFree2
18010 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
18020 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
18030 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
18040 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18060 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
18070 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
18080 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
18090 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
180a0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
180b0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
180c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
180d0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
180e0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
180f0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  ULL: {.      tes
18100 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
18110 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
18120 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
18130 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
18140 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
18150 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
18160 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
18170 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
18180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18190 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
181a0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
181b0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
181c0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
181d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
181e0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
181f0 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57      /*    x BETW
18200 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
18210 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73    **.      ** Is
18220 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
18230 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
18240 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
18250 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  =z.      **.    
18260 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20    ** Code it as 
18270 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
18280 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
18290 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
182a0 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  .      ** elemen
182b0 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20  tation of x..   
182c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72     */.      Expr
182d0 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20   exprAnd;.      
182e0 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20  Expr compLeft;. 
182f0 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69       Expr compRi
18300 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ght;.      Expr 
18310 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 61 73  exprX;..      as
18320 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
18330 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
18340 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
18350 20 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70 45       exprX = *pE
18360 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
18370 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54    exprAnd.op = T
18380 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78 70  K_AND;.      exp
18390 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f  rAnd.pLeft = &co
183a0 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78  mpLeft;.      ex
183b0 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
183c0 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20  compRight;.     
183d0 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
183e0 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70  K_GE;.      comp
183f0 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  Left.pLeft = &ex
18400 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  prX;.      compL
18410 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  eft.pRight = pEx
18420 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
18430 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 63  ].pExpr;.      c
18440 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
18450 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52  _LE;.      compR
18460 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  ight.pLeft = &ex
18470 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52  prX;.      compR
18480 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45  ight.pRight = pE
18490 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
184a0 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  1].pExpr;.      
184b0 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73  exprX.iTable = s
184c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
184d0 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  mp(pParse, &expr
184e0 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
184f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
18500 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
18510 20 20 20 20 65 78 70 72 58 2e 6f 70 20 3d 20 54      exprX.op = T
18520 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20  K_REGISTER;.    
18530 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
18540 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
18550 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
18560 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65  False(pParse, &e
18570 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
18580 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
18590 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
185a0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
185b0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
185c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
185d0 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
185e0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
185f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18600 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20  , OP_IfNot, r1, 
18610 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
18620 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74  !=0);.      test
18630 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
18640 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
18650 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
18660 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
18670 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
18680 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18690 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
186a0 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
186b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
186c0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
186d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  );.}../*.** Do a
186e0 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
186f0 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
18700 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
18710 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
18720 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65  ).** if they are
18730 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72   identical and r
18740 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
18750 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e  hey differ in an
18760 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  y way..**.** Som
18770 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
18780 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
18790 46 41 4c 53 45 20 65 76 65 6e 20 69 66 20 74 68  FALSE even if th
187a0 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  e two expression
187b0 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20  s.** really are 
187c0 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20  equivalent.  If 
187d0 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20  we cannot prove 
187e0 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
187f0 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e  ions are.** iden
18800 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e  tical, we return
18810 20 46 41 4c 53 45 20 6a 75 73 74 20 74 6f 20 62   FALSE just to b
18820 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74  e safe.  So if t
18830 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
18840 65 74 75 72 6e 73 20 66 61 6c 73 65 2c 20 74 68  eturns false, th
18850 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65  en you do not re
18860 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65  ally know for ce
18870 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f  rtain if the two
18880 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
18890 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42  are the same.  B
188a0 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20  ut if you get a 
188b0 54 52 55 45 20 72 65 74 75 72 6e 2c 20 74 68 65  TRUE return, the
188c0 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20  n you.** can be 
188d0 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73  sure the express
188e0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
188f0 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65  e.  In the place
18900 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20  s where.** this 
18910 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c  routine is used,
18920 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72   it does not hur
18930 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72  t to get an extr
18940 61 20 46 41 4c 53 45 20 2d 20 74 68 61 74 0a 2a  a FALSE - that.*
18950 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73  * just might res
18960 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67  ult in some slig
18970 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65  htly slower code
18980 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67  .  But returning
18990 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74  .** an incorrect
189a0 20 54 52 55 45 20 63 6f 75 6c 64 20 6c 65 61 64   TRUE could lead
189b0 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f   to a malfunctio
189c0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
189d0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70  3ExprCompare(Exp
189e0 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29  r *pA, Expr *pB)
189f0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
18a00 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b   pA==0||pB==0 ){
18a10 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d  .    return pB==
18a20 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78  pA;.  }.  if( Ex
18a30 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41  prHasProperty(pA
18a40 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
18a50 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
18a60 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pB, EP_xIsSel
18a70 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
18a80 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
18a90 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
18aa0 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
18ab0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
18ac0 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nct) ) return 0;
18ad0 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
18ae0 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30  B->op ) return 0
18af0 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
18b00 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
18b10 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
18b20 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
18b30 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
18b40 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67  Compare(pA->pRig
18b50 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20  ht, pB->pRight) 
18b60 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69  ) return 0;..  i
18b70 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73 74 20 26  f( pA->x.pList &
18b80 26 20 70 42 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  & pB->x.pList ){
18b90 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 78 2e 70  .    if( pA->x.p
18ba0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  List->nExpr!=pB-
18bb0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
18bc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
18bd0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 78  for(i=0; i<pA->x
18be0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  .pList->nExpr; i
18bf0 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
18c00 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 78 2e  *pExprA = pA->x.
18c10 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
18c20 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  r;.      Expr *p
18c30 45 78 70 72 42 20 3d 20 70 42 2d 3e 78 2e 70 4c  ExprB = pB->x.pL
18c40 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
18c50 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
18c60 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
18c70 45 78 70 72 41 2c 20 70 45 78 70 72 42 29 20 29  ExprA, pExprB) )
18c80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
18c90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d  .  }else if( pA-
18ca0 3e 78 2e 70 4c 69 73 74 20 7c 7c 20 70 42 2d 3e  >x.pList || pB->
18cb0 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72  x.pList ){.    r
18cc0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
18cd0 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
18ce0 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41  pB->iTable || pA
18cf0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
18d00 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
18d10 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21  0;.  if( pA->op!
18d20 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
18d30 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20  ->token.z ){.   
18d40 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a   if( pB->token.z
18d50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
18d60 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
18d70 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e  n.n!=pA->token.n
18d80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
18d90 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
18da0 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41 2d 3e  ICmp((char*)pA->
18db0 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70  token.z,(char*)p
18dc0 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74  B->token.z,pB->t
18dd0 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20  oken.n)!=0 ){.  
18de0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18df0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
18e00 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64   1;.}.../*.** Ad
18e10 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
18e20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
18e30 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
18e40 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
18e50 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
18e60 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
18e70 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
18e80 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
18e90 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
18ea0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
18eb0 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
18ec0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
18ed0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
18ee0 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
18ef0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
18f00 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
18f10 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
18f20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
18f30 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
18f40 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70      3,.       &p
18f50 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
18f60 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
18f70 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20  olumnAlloc,.    
18f80 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
18f90 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
18fa0 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
18fb0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
18fc0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61  gInfo->aFunc[] a
18fd0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
18fe0 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
18ff0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
19000 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
19010 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
19020 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
19030 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
19040 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a  foFunc(sqlite3 *
19050 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
19060 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
19070 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73  pInfo->aFunc = s
19080 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
19090 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20  ate(.       db, 
190a0 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
190b0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a  Func,.       siz
190c0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  eof(pInfo->aFunc
190d0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
190e0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
190f0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49  Func,.       &pI
19100 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c  nfo->nFuncAlloc,
19110 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
19120 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
19130 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
19140 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61   the xExprCallba
19150 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61  ck for a tree wa
19160 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65  lker.  It is use
19170 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  d to.** implemen
19180 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
19190 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
191a0 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
191b0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
191c0 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
191d0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
191e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
191f0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
19200 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  e(Walker *pWalke
19210 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
19220 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
19230 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
19240 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
19250 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
19260 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
19270 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
19280 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
19290 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
192a0 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41  ggInfo = pNC->pA
192b0 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63  ggInfo;..  switc
192c0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
192d0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
192e0 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
192f0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
19300 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
19310 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
19320 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
19330 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
19340 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
19350 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ;.      /* Check
19360 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
19370 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
19380 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
19390 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
193a0 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
193b0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
193c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53   */.      if( pS
193d0 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  rcList ){.      
193e0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
193f0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
19400 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
19410 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
19420 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
19430 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
19440 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
19450 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
19460 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
19470 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
19480 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
19490 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
194a0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
194b0 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
194c0 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
194d0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
194e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
194f0 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
19500 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
19510 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
19520 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
19530 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
19540 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
19550 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
19560 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
19570 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
19580 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
19590 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
195a0 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
195b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
195c0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
195d0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
195e0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
195f0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
19600 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
19610 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
19620 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
19630 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
19640 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
19650 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
19660 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
19670 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
19680 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
19690 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
196b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
196c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
196d0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
196e0 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
196f0 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
19700 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
19710 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
19720 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
19730 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
19740 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
19750 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
19760 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
19770 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
19780 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
19790 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
197a0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
197b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
197c0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
197d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
197f0 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
19800 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
19810 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
19820 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
19830 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
19840 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
19850 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
19860 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
19870 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
19880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
19890 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
198a0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
198b0 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
198c0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
198d0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
198e0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
198f0 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
19900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19910 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
19920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19930 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
19940 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
19970 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
19980 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
19990 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
199a0 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
199b0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
199c0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
199d0 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
199e0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
199f0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
19a00 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
19a10 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
19a20 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
19a30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
19a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
19a60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
19a70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
19a80 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
19a90 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
19aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ab0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
19ac0 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
19ad0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
19ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19af0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
19b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19b10 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
19b20 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
19b30 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
19b40 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
19b50 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
19b60 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
19b70 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
19b80 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
19b90 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
19ba0 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
19bb0 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
19bc0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
19bd0 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
19be0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
19bf0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
19c00 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
19c10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
19c20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
19c30 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
19c40 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
19c50 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
19c60 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
19c70 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 6b 3b  pExpr->iAgg = k;
19c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
19c90 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
19ca0 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
19cb0 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
19cc0 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
19cd0 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
19ce0 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
19cf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
19d00 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
19d10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19d20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
19d30 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
19d40 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74  pNC->nDepth==0 t
19d50 65 73 74 20 63 61 75 73 65 73 20 61 67 67 72 65  est causes aggre
19d60 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  gate functions i
19d70 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 20  n subqueries.   
19d80 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f     ** to be igno
19d90 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  red */.      if(
19da0 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20   pNC->nDepth==0 
19db0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
19dc0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
19dd0 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
19de0 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
19df0 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
19e00 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
19e10 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
19e20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
19e30 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
19e40 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
19e50 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
19e60 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
19e70 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
19e80 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
19e90 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
19ea0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19eb0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
19ec0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
19ed0 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29  m->pExpr, pExpr)
19ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19ef0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
19f00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
19f10 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
19f20 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
19f30 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
19f40 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
19f50 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
19f60 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
19f70 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
19f80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
19f90 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
19fa0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
19fb0 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
19fc0 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
19fd0 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
19fe0 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
19ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1a000 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1a010 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1a020 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1a030 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
1a040 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
1a050 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
1a060 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
1a070 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
1a080 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
1a090 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a0a0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  m;.            p
1a0b0 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71  Item->pFunc = sq
1a0c0 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
1a0d0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
1a100 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
1a110 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20  oken.n,.        
1a120 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1a130 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70  ->x.pList ? pExp
1a140 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
1a150 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
1a160 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1a170 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
1a180 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
1a190 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1a1a0 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70  m->iDistinct = p
1a1b0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1a1c0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1a1d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a1e0 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
1a1f0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
1a200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1a210 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a220 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72     /* Make pExpr
1a230 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70   point to the ap
1a240 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e  propriate pAggIn
1a250 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72  fo->aFunc[] entr
1a260 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  y.        */.   
1a270 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
1a280 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45   = i;.        pE
1a290 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
1a2a0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
1a2b0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1a2c0 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
1a2d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
1a2e0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
1a2f0 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
1a300 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
1a310 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
1a320 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
1a330 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  lect){.  NameCon
1a340 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
1a350 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69 66  ker->u.pNC;.  if
1a360 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  ( pNC->nDepth==0
1a370 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65   ){.    pNC->nDe
1a380 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  pth++;.    sqlit
1a390 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
1a3a0 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a  lker, pSelect);.
1a3b0 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d      pNC->nDepth-
1a3c0 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  -;.    return WR
1a3d0 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c 73 65  C_Prune;.  }else
1a3e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1a3f0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
1a400 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
1a410 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1a420 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
1a430 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1a440 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
1a450 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
1a460 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
1a470 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
1a480 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20  Agg[] array..** 
1a490 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Make additional 
1a4a0 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70  entries to the p
1a4b0 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
1a4c0 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
1a4d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1a4e0 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
1a4f0 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
1a500 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1a510 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
1a520 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
1a530 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
1a540 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
1a550 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1a560 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
1a570 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
1a580 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
1a590 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
1a5a0 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
1a5b0 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53  ggregate;.  w.xS
1a5c0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
1a5d0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
1a5e0 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75  sInSelect;.  w.u
1a5f0 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 73 71  .pNC = pNC;.  sq
1a600 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
1a610 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
1a620 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
1a630 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1a640 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
1a650 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
1a660 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
1a670 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
1a680 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1a690 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
1a6a0 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
1a6b0 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
1a6c0 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f  cut short..*/.vo
1a6d0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
1a6e0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
1a6f0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
1a700 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1a710 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
1a720 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1a730 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1a740 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
1a750 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
1a760 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1a770 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
1a780 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1a790 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1a7a0 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
1a7b0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
1a7c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1a7d0 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
1a7e0 63 61 74 65 20 74 65 6d 70 6f 72 61 72 79 20 75  cate temporary u
1a7f0 73 65 20 72 65 67 69 73 74 65 72 73 20 64 75 72  se registers dur
1a800 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ing code generat
1a810 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1a820 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61  te3GetTempReg(Pa
1a830 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1a840 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
1a850 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pReg==0 ){.    r
1a860 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
1a870 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nMem;.  }.  retu
1a880 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  rn pParse->aTemp
1a890 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54  Reg[--pParse->nT
1a8a0 65 6d 70 52 65 67 5d 3b 0a 7d 0a 76 6f 69 64 20  empReg];.}.void 
1a8b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a8c0 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
1a8d0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
1a8e0 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50    if( iReg && pP
1a8f0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
1a900 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
1a910 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
1a920 20 20 73 71 6c 69 74 65 33 45 78 70 72 57 72 69    sqlite3ExprWri
1a930 74 61 62 6c 65 52 65 67 69 73 74 65 72 28 70 50  tableRegister(pP
1a940 61 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20 20  arse, iReg);.   
1a950 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
1a960 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
1a970 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20  eg++] = iReg;.  
1a980 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
1a990 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
1a9a0 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65  e a block of nRe
1a9b0 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65  g consecutive re
1a9c0 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73  gisters.*/.int s
1a9d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1a9e0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1a9f0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
1aa00 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70  nt i, n;.  i = p
1aa10 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
1aa20 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
1aa30 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28  nRangeReg;.  if(
1aa40 20 6e 52 65 67 3c 3d 6e 20 26 26 20 21 75 73 65   nReg<=n && !use
1aa50 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
1aa60 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29  Parse, i, i+n-1)
1aa70 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1aa80 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
1aa90 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
1aaa0 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
1aab0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1aac0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
1aad0 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
1aae0 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
1aaf0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
1ab00 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
1ab10 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
1ab20 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1ab30 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
1ab40 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73    if( nReg>pPars
1ab50 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a  e->nRangeReg ){.
1ab60 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
1ab70 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20  geReg = nReg;.  
1ab80 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
1ab90 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  Reg = iReg;.  }.
1aba0 7d 0a                                            }.