/ Hex Artifact Content
Login

Artifact fad49e282d0aaa899becf5b2c4ed405aae1c872f0e952903c221adbf83b370b5:


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 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  t.h"../* Forward
0220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   declarations */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
0240: 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
0250: 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
0260: 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
0270: 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
0280: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  ;.static int exp
0290: 72 43 6f 64 65 56 65 63 74 6f 72 28 50 61 72 73  rCodeVector(Pars
02a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
02b0: 2a 70 2c 20 69 6e 74 20 2a 70 69 54 6f 46 72 65  *p, int *piToFre
02c0: 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  e);../*.** Retur
02d0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  n the affinity c
02e0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 61 20 73  haracter for a s
02f0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  ingle column of 
0300: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 68 61 72  a table..*/.char
0310: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c   sqlite3TableCol
0320: 75 6d 6e 41 66 66 69 6e 69 74 79 28 54 61 62 6c  umnAffinity(Tabl
0330: 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f  e *pTab, int iCo
0340: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43  l){.  assert( iC
0350: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
0360: 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c 3e 3d  .  return iCol>=
0370: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
0380: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
0390: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
03a0: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
03b0: 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74  urn the 'affinit
03c0: 79 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  y' of the expres
03d0: 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e  sion pExpr if an
03e0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  y..**.** If pExp
03f0: 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61  r is a column, a
0400: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
0410: 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41  column via an 'A
0420: 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20  S' alias,.** or 
0430: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74  a sub-select wit
0440: 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  h a column as th
0450: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20  e return value, 
0460: 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66  then the .** aff
0470: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f  inity of that co
0480: 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64  lumn is returned
0490: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30  . Otherwise, 0x0
04a0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  0 is returned,.*
04b0: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  * indicating no 
04c0: 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65  affinity for the
04d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
04e0: 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52  ** i.e. the WHER
04f0: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
0500: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0510: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0520: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
0530: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0560: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0570: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0580: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0590: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
05a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
05b0: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
05c0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
05d0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
05e0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
05f0: 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 45 78   op;.  while( Ex
0600: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0610: 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b  xpr, EP_Skip) ){
0620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
0630: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
0640: 54 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 20  TE );.    pExpr 
0650: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
0660: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
0670: 72 21 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6f 70  r!=0 );.  }.  op
0680: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
0690: 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  if( op==TK_SELEC
06a0: 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
06b0: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50   pExpr->flags&EP
06c0: 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20  _xIsSelect );.  
06d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
06e0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
06f0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
0700: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
0710: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70  r);.  }.  if( op
0720: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
0730: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b  op = pExpr->op2;
0740: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0750: 4f 4d 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20  OMIT_CAST.  if( 
0760: 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20  op==TK_CAST ){. 
0770: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
0780: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0790: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
07a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
07b0: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
07c0: 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e(pExpr->u.zToke
07d0: 6e 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  n, 0);.  }.#endi
07e0: 66 0a 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f  f.  if( (op==TK_
07f0: 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70  AGG_COLUMN || op
0800: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 29 20 26 26 20  ==TK_COLUMN) && 
0810: 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 20 29 7b  pExpr->y.pTab ){
0820: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0830: 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66  te3TableColumnAf
0840: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 79 2e  finity(pExpr->y.
0850: 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f  pTab, pExpr->iCo
0860: 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lumn);.  }.  if(
0870: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43   op==TK_SELECT_C
0880: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 61 73 73  OLUMN ){.    ass
0890: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
08a0: 74 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53  t->flags&EP_xIsS
08b0: 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74  elect );.    ret
08c0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
08d0: 66 66 69 6e 69 74 79 28 0a 20 20 20 20 20 20 20  ffinity(.       
08e0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78   pExpr->pLeft->x
08f0: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
0900: 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
0910: 6d 6e 5d 2e 70 45 78 70 72 0a 20 20 20 20 29 3b  mn].pExpr.    );
0920: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54  .  }.  if( op==T
0930: 4b 5f 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20  K_VECTOR ){.    
0940: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
0950: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0960: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
0970: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
0980: 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 45  turn pExpr->affE
0990: 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  xpr;.}../*.** Se
09a0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
09b0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
09c0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
09d0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
09e0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
09f0: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0a00: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0a10: 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20  r to a new Expr 
0a20: 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70  node that.** imp
0a30: 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c  lements the COLL
0a40: 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
0a50: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
0a60: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
0a70: 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66 61   occurs, that fa
0a80: 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ct is recorded i
0a90: 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20  n pParse->db.** 
0aa0: 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70 61  and the pExpr pa
0ab0: 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75 72  rameter is retur
0ac0: 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ned unchanged..*
0ad0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0ae0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0af0: 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
0b00: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
0b10: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0b20: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
0b30: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
0b40: 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c  /* Add the "COLL
0b50: 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74  ATE" clause to t
0b60: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
0b70: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
0b80: 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20 2f 2a 20  *pCollName,  /* 
0b90: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
0ba0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  g sequence */.  
0bb0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
0bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
0bd0: 20 74 6f 20 64 65 71 75 6f 74 65 20 70 43 6f 6c   to dequote pCol
0be0: 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  lName */.){.  if
0bf0: 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30  ( pCollName->n>0
0c00: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
0c10: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
0c20: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
0c30: 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43  , TK_COLLATE, pC
0c40: 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75 6f 74 65  ollName, dequote
0c50: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
0c60: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
0c70: 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Left = pExpr;.  
0c80: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
0c90: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50  |= EP_Collate|EP
0ca0: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78  _Skip;.      pEx
0cb0: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
0cc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0cd0: 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c  xpr;.}.Expr *sql
0ce0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0cf0: 74 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a  teString(Parse *
0d00: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0d10: 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  xpr, const char 
0d20: 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b  *zC){.  Token s;
0d30: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30  .  assert( zC!=0
0d40: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 6f 6b   );.  sqlite3Tok
0d50: 65 6e 49 6e 69 74 28 26 73 2c 20 28 63 68 61 72  enInit(&s, (char
0d60: 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  *)zC);.  return 
0d70: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0d80: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
0d90: 65 2c 20 70 45 78 70 72 2c 20 26 73 2c 20 30 29  e, pExpr, &s, 0)
0da0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20  ;.}../*.** Skip 
0db0: 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c  over any TK_COLL
0dc0: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a  ATE operators..*
0dd0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
0de0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 45  xprSkipCollate(E
0df0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77  xpr *pExpr){.  w
0e00: 68 69 6c 65 28 20 70 45 78 70 72 20 26 26 20 45  hile( pExpr && E
0e10: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
0e20: 45 78 70 72 2c 20 45 50 5f 53 6b 69 70 29 20 29  Expr, EP_Skip) )
0e30: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
0e40: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  xpr->op==TK_COLL
0e50: 41 54 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72  ATE );.    pExpr
0e60: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0e70: 0a 20 20 7d 20 20 20 0a 20 20 72 65 74 75 72 6e  .  }   .  return
0e80: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
0e90: 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54   Skip over any T
0ea0: 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  K_COLLATE operat
0eb0: 6f 72 73 20 61 6e 64 2f 6f 72 20 61 6e 79 20 75  ors and/or any u
0ec0: 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20  nlikely().** or 
0ed0: 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 6f 72 20  likelihood() or 
0ee0: 6c 69 6b 65 6c 79 28 29 20 66 75 6e 63 74 69 6f  likely() functio
0ef0: 6e 73 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f  ns at the root o
0f00: 66 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  f an.** expressi
0f10: 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  on..*/.Expr *sql
0f20: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
0f30: 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28 45 78 70  ateAndLikely(Exp
0f40: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69  r *pExpr){.  whi
0f50: 6c 65 28 20 70 45 78 70 72 20 26 26 20 45 78 70  le( pExpr && Exp
0f60: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
0f70: 70 72 2c 20 45 50 5f 53 6b 69 70 7c 45 50 5f 55  pr, EP_Skip|EP_U
0f80: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
0f90: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
0fa0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e  rty(pExpr, EP_Un
0fb0: 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20 20  likely) ){.     
0fc0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
0fd0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0fe0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
0ff0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1000: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1010: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20  nExpr>0 );.     
1020: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1030: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
1040: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  );.      pExpr =
1050: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1060: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
1070: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1080: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
1090: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20  =TK_COLLATE );. 
10a0: 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78       pExpr = pEx
10b0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 7d  pr->pLeft;.    }
10c0: 0a 20 20 7d 20 20 20 0a 20 20 72 65 74 75 72 6e  .  }   .  return
10d0: 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pExpr;.}../*.**
10e0: 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 6c   Return the coll
10f0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
1100: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
1110: 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20 74  n pExpr. If.** t
1120: 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 69 6e  here is no defin
1130: 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ed collating seq
1140: 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20 4e 55  uence, return NU
1150: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
1160: 73 6f 3a 20 73 71 6c 69 74 65 33 45 78 70 72 4e  so: sqlite3ExprN
1170: 4e 43 6f 6c 6c 53 65 71 28 29 0a 2a 2a 0a 2a 2a  NCollSeq().**.**
1180: 20 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72   The sqlite3Expr
1190: 4e 4e 43 6f 6c 6c 53 65 71 28 29 20 77 6f 72 6b  NNCollSeq() work
11a0: 73 20 74 68 65 20 73 61 6d 65 20 65 78 61 63 74  s the same exact
11b0: 20 74 68 61 74 20 69 74 20 72 65 74 75 72 6e 73   that it returns
11c0: 20 74 68 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20   the.** default 
11d0: 63 6f 6c 6c 61 74 69 6f 6e 20 69 66 20 70 45 78  collation if pEx
11e0: 70 72 20 68 61 73 20 6e 6f 20 64 65 66 69 6e 65  pr has no define
11f0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2a 0a  d collation..**.
1200: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
1210: 20 73 65 71 75 65 6e 63 65 20 6d 69 67 68 74 20   sequence might 
1220: 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  be determined by
1230: 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
1240: 74 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65  tor.** or by the
1250: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 63   presence of a c
1260: 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 64 65 66  olumn with a def
1270: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
1280: 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c  equence..** COLL
1290: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 74 61  ATE operators ta
12a0: 6b 65 20 66 69 72 73 74 20 70 72 65 63 65 64 65  ke first precede
12b0: 6e 63 65 2e 20 20 4c 65 66 74 20 6f 70 65 72 61  nce.  Left opera
12c0: 6e 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63  nds take.** prec
12d0: 65 64 65 6e 63 65 20 6f 76 65 72 20 72 69 67 68  edence over righ
12e0: 74 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43  t operands..*/.C
12f0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
1300: 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  xprCollSeq(Parse
1310: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1320: 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65  pExpr){.  sqlite
1330: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1340: 64 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  db;.  CollSeq *p
1350: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72  Coll = 0;.  Expr
1360: 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77   *p = pExpr;.  w
1370: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
1380: 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  nt op = p->op;. 
1390: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45     if( op==TK_RE
13a0: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
13b0: 3e 6f 70 32 3b 0a 20 20 20 20 69 66 28 20 28 6f  >op2;.    if( (o
13c0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
13d0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   || op==TK_COLUM
13e0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49 47  N || op==TK_TRIG
13f0: 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d 3e  GER).     && p->
1400: 79 2e 70 54 61 62 21 3d 30 0a 20 20 20 20 29 7b  y.pTab!=0.    ){
1410: 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b  .      /* op==TK
1420: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
1430: 79 2e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e  y.pTab!=0 happen
1440: 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73  s when pExpr was
1450: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20   originally.    
1460: 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e    ** a TK_COLUMN
1470: 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f 75   but was previou
1480: 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e  sly evaluated an
1490: 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72 65  d cached in a re
14a0: 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  gister */.      
14b0: 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75  int j = p->iColu
14c0: 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e  mn;.      if( j>
14d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
14e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
14f0: 3d 20 70 2d 3e 79 2e 70 54 61 62 2d 3e 61 43 6f  = p->y.pTab->aCo
1500: 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
1510: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1520: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
1530: 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
1540: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
1550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1560: 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b  }.    if( op==TK
1570: 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  _CAST || op==TK_
1580: 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70  UPLUS ){.      p
1590: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20   = p->pLeft;.   
15a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
15b0: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54   }.    if( op==T
15c0: 4b 5f 56 45 43 54 4f 52 20 29 7b 0a 20 20 20 20  K_VECTOR ){.    
15d0: 20 20 70 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74    p = p->x.pList
15e0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
15f0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1600: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
1610: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1620: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1630: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
1640: 61 72 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30  arse, ENC(db), 0
1650: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
1660: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1670: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c   }.    if( p->fl
1680: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
1690: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
16a0: 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c  >pLeft && (p->pL
16b0: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
16c0: 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20  Collate)!=0 ){. 
16d0: 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c         p = p->pL
16e0: 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eft;.      }else
16f0: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1700: 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67  pNext  = p->pRig
1710: 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  ht;.        /* T
1720: 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20  he Expr.x union 
1730: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 74  is never used at
1740: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
1750: 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f  s Expr.pRight */
1760: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1770: 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c   p->x.pList==0 |
1780: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  | p->pRight==0 )
1790: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e  ;.        /* p->
17a0: 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43  flags holds EP_C
17b0: 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c  ollate and p->pL
17c0: 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20  eft->flags does 
17d0: 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20  not.  And.      
17e0: 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63    ** p->x.pSelec
17f0: 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66  t cannot.  So if
1800: 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73   p->x.pLeft exis
1810: 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64  ts, it must hold
1820: 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c   at.        ** l
1830: 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c  east one EP_Coll
1840: 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f  ate. Thus the fo
1850: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41  llowing two ALWA
1860: 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  YS. */.        i
1870: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30  f( p->x.pList!=0
1880: 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 64   .         && !d
1890: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
18a0: 20 20 20 20 20 20 20 20 20 26 26 20 41 4c 57 41           && ALWA
18b0: 59 53 28 21 45 78 70 72 48 61 73 50 72 6f 70 65  YS(!ExprHasPrope
18c0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
18d0: 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b  ect)).        ){
18e0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
18f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1900: 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d  i=0; ALWAYS(i<p-
1910: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29  >x.pList->nExpr)
1920: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1930: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1940: 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69  roperty(p->x.pLi
1950: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1960: 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  EP_Collate) ){. 
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
1980: 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d  xt = p->x.pList-
1990: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
19a0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
19b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
19c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20      }.        p 
19e0: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  = pNext;.      }
19f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1a10: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1a20: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
1a30: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
1a40: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
1a50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
1a60: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
1a70: 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rn the collation
1a80: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
1a90: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
1aa0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
1ab0: 69 73 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f  is no defined co
1ac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ad0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
1ae0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 65 66  er to the.** def
1af0: 61 75 74 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  autl collation s
1b00: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 53  equence..**.** S
1b10: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
1b20: 45 78 70 72 43 6f 6c 6c 53 65 71 28 29 0a 2a 2a  ExprCollSeq().**
1b30: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
1b40: 78 70 72 43 6f 6c 6c 53 65 71 28 29 20 72 6f 75  xprCollSeq() rou
1b50: 74 69 6e 65 20 77 6f 72 6b 73 20 74 68 65 20 73  tine works the s
1b60: 61 6d 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ame except that 
1b70: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  it.** returns NU
1b80: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
1b90: 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  o defined collat
1ba0: 69 6f 6e 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  ion..*/.CollSeq 
1bb0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f  *sqlite3ExprNNCo
1bc0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
1bd0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1be0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20  ){.  CollSeq *p 
1bf0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1c00: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
1c10: 70 72 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  pr);.  if( p==0 
1c20: 29 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ) p = pParse->db
1c30: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 61  ->pDfltColl;.  a
1c40: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1c50: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1c60: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1c70: 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
1c80: 73 73 69 6f 6e 73 20 68 61 76 65 20 65 71 75 69  ssions have equi
1c90: 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  valent collating
1ca0: 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 69   sequences..*/.i
1cb0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1cc0: 6c 6c 53 65 71 4d 61 74 63 68 28 50 61 72 73 65  llSeqMatch(Parse
1cd0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1ce0: 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 29 7b  pE1, Expr *pE2){
1cf0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1d00: 6c 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  l1 = sqlite3Expr
1d10: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
1d20: 2c 20 70 45 31 29 3b 0a 20 20 43 6f 6c 6c 53 65  , pE1);.  CollSe
1d30: 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69  q *pColl2 = sqli
1d40: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
1d50: 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20  (pParse, pE2);. 
1d60: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
1d70: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 31 2d 3e 7a  trICmp(pColl1->z
1d80: 4e 61 6d 65 2c 20 70 43 6f 6c 6c 32 2d 3e 7a 4e  Name, pColl2->zN
1d90: 61 6d 65 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame)==0;.}../*.*
1da0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
1db0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
1dc0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
1dd0: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
1de0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
1df0: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
1e00: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1e10: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
1e20: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1e30: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1e40: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
1e50: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1e60: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
1e70: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
1e80: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1e90: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
1ea0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
1eb0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
1ec0: 3b 0a 20 20 69 66 28 20 61 66 66 31 3e 53 51 4c  ;.  if( aff1>SQL
1ed0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 26 26 20  ITE_AFF_NONE && 
1ee0: 61 66 66 32 3e 53 51 4c 49 54 45 5f 41 46 46 5f  aff2>SQLITE_AFF_
1ef0: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 2f 2a 20 42  NONE ){.    /* B
1f00: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
1f10: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
1f20: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
1f30: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
1f40: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
1f50: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
1f60: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
1f70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1f80: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1f90: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1fa0: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1fb0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1fc0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1fd0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1fe0: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1ff0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2000: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
2010: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2020: 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73    /* One side is
2030: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f   a column, the o
2040: 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65  ther is not. Use
2050: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66   the columns aff
2060: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73  inity. */.    as
2070: 73 65 72 74 28 20 61 66 66 31 3c 3d 53 51 4c 49  sert( aff1<=SQLI
2080: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 7c 7c 20 61  TE_AFF_NONE || a
2090: 66 66 32 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff2<=SQLITE_AFF_
20a0: 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 72 65 74 75  NONE );.    retu
20b0: 72 6e 20 28 61 66 66 31 3c 3d 53 51 4c 49 54 45  rn (aff1<=SQLITE
20c0: 5f 41 46 46 5f 4e 4f 4e 45 20 3f 20 61 66 66 32  _AFF_NONE ? aff2
20d0: 20 3a 20 61 66 66 31 29 20 7c 20 53 51 4c 49 54   : aff1) | SQLIT
20e0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a  E_AFF_NONE;.  }.
20f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
2100: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  s a comparison o
2110: 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e  perator.  Return
2120: 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69   the type affini
2130: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  ty that should.*
2140: 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20  * be applied to 
2150: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72  both operands pr
2160: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65  ior to doing the
2170: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a   comparison..*/.
2180: 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70  static char comp
2190: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45  arisonAffinity(E
21a0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63  xpr *pExpr){.  c
21b0: 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72  har aff;.  asser
21c0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
21d0: 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _EQ || pExpr->op
21e0: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72  ==TK_IN || pExpr
21f0: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20  ->op==TK_LT ||. 
2200: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2210: 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78  op==TK_GT || pEx
2220: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c  pr->op==TK_GE ||
2230: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
2240: 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  E ||.          p
2250: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20  Expr->op==TK_NE 
2260: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
2270: 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IS || pExpr->op
2280: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
2290: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
22a0: 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20  Left );.  aff = 
22b0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
22c0: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
22d0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
22e0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66  pRight ){.    af
22f0: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
2300: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
2310: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a  ->pRight, aff);.
2320: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
2330: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
2340: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2350: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
2360: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
2370: 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53  nity(pExpr->x.pS
2380: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
2390: 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b  [0].pExpr, aff);
23a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66  .  }else if( aff
23b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 66 66 20 3d  ==0 ){.    aff =
23c0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
23d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
23e0: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ff;.}../*.** pEx
23f0: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
2400: 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65  on expression, e
2410: 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28  g. '=', '<', IN(
2420: 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78  ...) etc..** idx
2430: 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65  _affinity is the
2440: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20   affinity of an 
2450: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20  indexed column. 
2460: 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69  Return true.** i
2470: 66 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  f the index with
2480: 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66   affinity idx_af
2490: 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73  finity may be us
24a0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
24b0: 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ** the compariso
24c0: 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69  n in pExpr..*/.i
24d0: 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  nt sqlite3IndexA
24e0: 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a  ffinityOk(Expr *
24f0: 70 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f  pExpr, char idx_
2500: 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61  affinity){.  cha
2510: 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73  r aff = comparis
2520: 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  onAffinity(pExpr
2530: 29 3b 0a 20 20 69 66 28 20 61 66 66 3c 53 51 4c  );.  if( aff<SQL
2540: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a  ITE_AFF_TEXT ){.
2550: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2560: 7d 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c  }.  if( aff==SQL
2570: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a  ITE_AFF_TEXT ){.
2580: 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61      return idx_a
2590: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
25a0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 7d 0a 20 20  AFF_TEXT;.  }.  
25b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73  return sqlite3Is
25c0: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
25d0: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 7d  idx_affinity);.}
25e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
25f0: 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74  he P5 value that
2600: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
2610: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
2620: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
2630: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
2640: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
2650: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
2660: 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74   pExpr2..*/.stat
2670: 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70  ic u8 binaryComp
2680: 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70  areP5(Expr *pExp
2690: 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32  r1, Expr *pExpr2
26a0: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
26b0: 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63  ){.  u8 aff = (c
26c0: 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41  har)sqlite3ExprA
26d0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
26e0: 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c  .  aff = (u8)sql
26f0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
2700: 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29  ity(pExpr1, aff)
2710: 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c   | (u8)jumpIfNul
2720: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  l;.  return aff;
2730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2740: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2750: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
2760: 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64  ence that should
2770: 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61   be used by.** a
2780: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
2790: 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70  on operator comp
27a0: 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20  aring pLeft and 
27b0: 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  pRight..**.** If
27c0: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65   the left hand e
27d0: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
27e0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
27f0: 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74  ce type, then it
2800: 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68   is.** used. Oth
2810: 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61  erwise the colla
2820: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
2830: 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  r the right hand
2840: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
2850: 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64  s used, or the d
2860: 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20  efault (BINARY) 
2870: 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65  if neither expre
2880: 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c  ssion has a coll
2890: 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a  ating.** type..*
28a0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52  *.** Argument pR
28b0: 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c  ight (but not pL
28c0: 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75  eft) may be a nu
28d0: 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74  ll pointer. In t
28e0: 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20  his case,.** it 
28f0: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
2900: 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  d..*/.CollSeq *s
2910: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
2920: 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61  areCollSeq(.  Pa
2930: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
2940: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20  Expr *pLeft, .  
2950: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
2960: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
2970: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
2980: 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  t );.  if( pLeft
2990: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
29a0: 6c 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c  late ){.    pCol
29b0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
29c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
29d0: 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Left);.  }else i
29e0: 66 28 20 70 52 69 67 68 74 20 26 26 20 28 70 52  f( pRight && (pR
29f0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
2a00: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
2a10: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2a20: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2a30: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
2a40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f    }else{.    pCo
2a50: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2a60: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2a70: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
2a80: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
2a90: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2aa0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
2ab0: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
2ac0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
2ad0: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 20 45 78 70 72  Coll;.}../* Expr
2ae0: 65 73 73 73 69 6f 6e 20 70 20 69 73 20 61 20 63  esssion p is a c
2af0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
2b00: 6f 72 2e 20 20 52 65 74 75 72 6e 20 61 20 63 6f  or.  Return a co
2b10: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
2b20: 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
2b30: 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73  for the comparis
2b40: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  on operator..**.
2b50: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  ** This is norma
2b60: 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70  lly just a wrapp
2b70: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
2b80: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2b90: 6c 6c 53 65 71 28 29 2e 0a 2a 2a 20 48 6f 77 65  llSeq()..** Howe
2ba0: 76 65 72 2c 20 69 66 20 74 68 65 20 4f 50 5f 43  ver, if the OP_C
2bb0: 6f 6d 6d 75 74 65 64 20 66 6c 61 67 20 69 73 20  ommuted flag is 
2bc0: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  set, then the or
2bd0: 64 65 72 20 6f 66 20 74 68 65 20 6f 70 65 72 61  der of the opera
2be0: 6e 64 73 0a 2a 2a 20 69 73 20 72 65 76 65 72 73  nds.** is revers
2bf0: 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ed in the sqlite
2c00: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2c10: 6c 6c 53 65 71 28 29 20 63 61 6c 6c 20 73 6f 20  llSeq() call so 
2c20: 74 68 61 74 20 74 68 65 0a 2a 2a 20 63 6f 72 72  that the.** corr
2c30: 65 63 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ect collating se
2c40: 71 75 65 6e 63 65 20 69 73 20 66 6f 75 6e 64 2e  quence is found.
2c50: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
2c60: 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 43  ite3ExprCompareC
2c70: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
2c80: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a  arse, Expr *p){.
2c90: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
2ca0: 70 65 72 74 79 28 70 2c 20 45 50 5f 43 6f 6d 6d  perty(p, EP_Comm
2cb0: 75 74 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74  uted) ){.    ret
2cc0: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 6e 61 72  urn sqlite3Binar
2cd0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
2ce0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 52 69 67 68  pParse, p->pRigh
2cf0: 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t, p->pLeft);.  
2d00: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2d10: 6e 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  n sqlite3BinaryC
2d20: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
2d30: 61 72 73 65 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  arse, p->pLeft, 
2d40: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  p->pRight);.  }.
2d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
2d60: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
2d70: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2d80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d90: 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50  codeCompare(.  P
2da0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2db0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
2dc0: 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61  (and code genera
2dd0: 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f  ting) context */
2de0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
2df0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
2e00: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
2e10: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
2e20: 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65  /* The right ope
2e30: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  rand */.  int op
2e40: 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  code,       /* T
2e50: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
2e60: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  code */.  int in
2e70: 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52  1, int in2, /* R
2e80: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
2e90: 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e  operands */.  in
2ea0: 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
2eb0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
2ec0: 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  true.  */.  int 
2ed0: 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 20 20 2f 2a  jumpIfNull,   /*
2ee0: 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69   If true, jump i
2ef0: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
2f00: 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   is NULL */.  in
2f10: 74 20 69 73 43 6f 6d 6d 75 74 65 64 20 20 20 20  t isCommuted    
2f20: 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  /* The compariso
2f30: 6e 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 6d 75  n has been commu
2f40: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ted */.){.  int 
2f50: 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p5;.  int addr;.
2f60: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a    CollSeq *p4;..
2f70: 20 20 69 66 28 20 69 73 43 6f 6d 6d 75 74 65 64    if( isCommuted
2f80: 20 29 7b 0a 20 20 20 20 70 34 20 3d 20 73 71 6c   ){.    p4 = sql
2f90: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
2fa0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
2fb0: 20 70 52 69 67 68 74 2c 20 70 4c 65 66 74 29 3b   pRight, pLeft);
2fc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 34  .  }else{.    p4
2fd0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
2fe0: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
2ff0: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
3000: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 35 20  ight);.  }.  p5 
3010: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
3020: 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  5(pLeft, pRight,
3030: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
3040: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
3050: 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d  beAddOp4(pParse-
3060: 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20  >pVdbe, opcode, 
3070: 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a  in2, dest, in1,.
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
30a0: 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  *)p4, P4_COLLSEQ
30b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
30c0: 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d  ChangeP5(pParse-
30d0: 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b  >pVdbe, (u8)p5);
30e0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
30f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3100: 74 72 75 65 20 69 66 20 65 78 70 72 65 73 73 69  true if expressi
3110: 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20 76 65  on pExpr is a ve
3120: 63 74 6f 72 2c 20 6f 72 20 66 61 6c 73 65 20 6f  ctor, or false o
3130: 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
3140: 41 20 76 65 63 74 6f 72 20 69 73 20 64 65 66 69  A vector is defi
3150: 6e 65 64 20 61 73 20 61 6e 79 20 65 78 70 72 65  ned as any expre
3160: 73 73 69 6f 6e 20 74 68 61 74 20 72 65 73 75 6c  ssion that resul
3170: 74 73 20 69 6e 20 74 77 6f 20 6f 72 20 6d 6f 72  ts in two or mor
3180: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  e.** columns of 
3190: 72 65 73 75 6c 74 2e 20 20 45 76 65 72 79 20 54  result.  Every T
31a0: 4b 5f 56 45 43 54 4f 52 20 6e 6f 64 65 20 69 73  K_VECTOR node is
31b0: 20 61 6e 20 76 65 63 74 6f 72 20 62 65 63 61 75   an vector becau
31c0: 73 65 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72  se the.** parser
31d0: 20 77 69 6c 6c 20 6e 6f 74 20 67 65 6e 65 72 61   will not genera
31e0: 74 65 20 61 20 54 4b 5f 56 45 43 54 4f 52 20 77  te a TK_VECTOR w
31f0: 69 74 68 20 66 65 77 65 72 20 74 68 61 6e 20 74  ith fewer than t
3200: 77 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2a 20 42  wo entries..** B
3210: 75 74 20 61 20 54 4b 5f 53 45 4c 45 43 54 20 6d  ut a TK_SELECT m
3220: 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61  ight be either a
3230: 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73 63 61   vector or a sca
3240: 6c 61 72 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a  lar. It is only.
3250: 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  ** considered a 
3260: 76 65 63 74 6f 72 20 69 66 20 69 74 20 68 61 73  vector if it has
3270: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 72 65 73   two or more res
3280: 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  ult columns..*/.
3290: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
32a0: 73 56 65 63 74 6f 72 28 45 78 70 72 20 2a 70 45  sVector(Expr *pE
32b0: 78 70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  xpr){.  return s
32c0: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
32d0: 53 69 7a 65 28 70 45 78 70 72 29 3e 31 3b 0a 7d  Size(pExpr)>1;.}
32e0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
32f0: 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64  xpression passed
3300: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
3310: 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 79 70 65  ument is of type
3320: 20 54 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20 72   TK_VECTOR .** r
3330: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
3340: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
3350: 69 6e 20 74 68 65 20 76 65 63 74 6f 72 2e 20 4f  in the vector. O
3360: 72 2c 20 69 66 20 74 68 65 20 65 78 70 72 65 73  r, if the expres
3370: 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75 62  sion.** is a sub
3380: 2d 73 65 6c 65 63 74 2c 20 72 65 74 75 72 6e 20  -select, return 
3390: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
33a0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 75 62  lumns in the sub
33b0: 2d 73 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a 20  -select. For.** 
33c0: 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20 6f  any other type o
33d0: 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65  f expression, re
33e0: 74 75 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73  turn 1..*/.int s
33f0: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
3400: 53 69 7a 65 28 45 78 70 72 20 2a 70 45 78 70 72  Size(Expr *pExpr
3410: 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20 70 45 78  ){.  u8 op = pEx
3420: 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70  pr->op;.  if( op
3430: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
3440: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b  op = pExpr->op2;
3450: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 45  .  if( op==TK_VE
3460: 43 54 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75  CTOR ){.    retu
3470: 72 6e 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  rn pExpr->x.pLis
3480: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 65 6c 73  t->nExpr;.  }els
3490: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c  e if( op==TK_SEL
34a0: 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ECT ){.    retur
34b0: 6e 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  n pExpr->x.pSele
34c0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
34d0: 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  r;.  }else{.    
34e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a  return 1;.  }.}.
34f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
3500: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
3510: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70 56  expression of pV
3520: 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74 68  ector that is th
3530: 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  e i-th.** column
3540: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 28   of the vector (
3550: 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
3560: 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65 20  g with 0).  The 
3570: 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 65  caller must.** e
3580: 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73 20  nsure that i is 
3590: 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a 2a  within range..**
35a0: 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69  .** If pVector i
35b0: 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6c 61  s really a scala
35c0: 72 20 28 61 6e 64 20 22 73 63 61 6c 61 72 22 20  r (and "scalar" 
35d0: 68 65 72 65 20 69 6e 63 6c 75 64 65 73 20 73 75  here includes su
35e0: 62 71 75 65 72 69 65 73 0a 2a 2a 20 74 68 61 74  bqueries.** that
35f0: 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65   return a single
3600: 20 63 6f 6c 75 6d 6e 21 29 20 74 68 65 6e 20 72   column!) then r
3610: 65 74 75 72 6e 20 70 56 65 63 74 6f 72 20 75 6e  eturn pVector un
3620: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
3630: 70 56 65 63 74 6f 72 20 72 65 74 61 69 6e 73 20  pVector retains 
3640: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65  ownership of the
3650: 20 72 65 74 75 72 6e 65 64 20 73 75 62 65 78 70   returned subexp
3660: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ression..**.** I
3670: 66 20 74 68 65 20 76 65 63 74 6f 72 20 69 73 20  f the vector is 
3680: 61 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 20 74  a (SELECT ...) t
3690: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
36a0: 6f 6e 20 72 65 74 75 72 6e 65 64 20 69 73 0a 2a  on returned is.*
36b0: 2a 20 6a 75 73 74 20 74 68 65 20 65 78 70 72 65  * just the expre
36c0: 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 2d  ssion for the i-
36d0: 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72  th term of the r
36e0: 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 6d  esult set, and m
36f0: 61 79 0a 2a 2a 20 6e 6f 74 20 62 65 20 72 65 61  ay.** not be rea
3700: 64 79 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6f  dy for evaluatio
3710: 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 74 61  n because the ta
3720: 62 6c 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  ble cursor has n
3730: 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20 70  ot yet.** been p
3740: 6f 73 69 74 69 6f 6e 65 64 2e 0a 2a 2f 0a 45 78  ositioned..*/.Ex
3750: 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74 6f  pr *sqlite3Vecto
3760: 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45 78  rFieldSubexpr(Ex
3770: 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e 74  pr *pVector, int
3780: 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   i){.  assert( i
3790: 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74  <sqlite3ExprVect
37a0: 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29 20  orSize(pVector) 
37b0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
37c0: 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56 65  ExprIsVector(pVe
37d0: 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ctor) ){.    ass
37e0: 65 72 74 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70  ert( pVector->op
37f0: 32 3d 3d 30 20 7c 7c 20 70 56 65 63 74 6f 72 2d  2==0 || pVector-
3800: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
3810: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 56 65 63   );.    if( pVec
3820: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  tor->op==TK_SELE
3830: 43 54 20 7c 7c 20 70 56 65 63 74 6f 72 2d 3e 6f  CT || pVector->o
3840: 70 32 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  p2==TK_SELECT ){
3850: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 56  .      return pV
3860: 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74  ector->x.pSelect
3870: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ->pEList->a[i].p
3880: 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Expr;.    }else{
3890: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 56  .      return pV
38a0: 65 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ector->x.pList->
38b0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
38c0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
38d0: 56 65 63 74 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Vector;.}../*.**
38e0: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
38f0: 75 72 6e 20 61 20 6e 65 77 20 45 78 70 72 20 6f  urn a new Expr o
3900: 62 6a 65 63 74 20 77 68 69 63 68 20 77 68 65 6e  bject which when
3910: 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 73 71   passed to.** sq
3920: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
3930: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61 6c  will generate al
3940: 6c 20 6e 65 63 65 73 73 61 72 79 20 63 6f 64 65  l necessary code
3950: 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74   to compute.** t
3960: 68 65 20 69 46 69 65 6c 64 2d 74 68 20 63 6f 6c  he iField-th col
3970: 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74 6f  umn of the vecto
3980: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 56 65  r expression pVe
3990: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctor..**.** It i
39a0: 73 20 6f 6b 20 66 6f 72 20 70 56 65 63 74 6f 72  s ok for pVector
39b0: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
39c0: 28 61 73 20 6c 6f 6e 67 20 61 73 20 69 46 69 65  (as long as iFie
39d0: 6c 64 3d 3d 30 29 2e 20 20 0a 2a 2a 20 49 6e 20  ld==0).  .** In 
39e0: 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73 20  that case, this 
39f0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
3a00: 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  ke sqlite3ExprDu
3a10: 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  p()..**.** The c
3a20: 61 6c 6c 65 72 20 6f 77 6e 73 20 74 68 65 20 72  aller owns the r
3a30: 65 74 75 72 6e 65 64 20 45 78 70 72 20 6f 62 6a  eturned Expr obj
3a40: 65 63 74 20 61 6e 64 20 69 73 20 72 65 73 70 6f  ect and is respo
3a50: 6e 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 65 6e  nsible for.** en
3a60: 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20  suring that the 
3a70: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 65  returned value e
3a80: 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66  ventually gets f
3a90: 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  reed..**.** The 
3aa0: 63 61 6c 6c 65 72 20 72 65 74 61 69 6e 73 20 6f  caller retains o
3ab0: 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65 63  wnership of pVec
3ac0: 74 6f 72 2e 20 20 49 66 20 70 56 65 63 74 6f 72  tor.  If pVector
3ad0: 20 69 73 20 61 20 54 4b 5f 53 45 4c 45 43 54 2c   is a TK_SELECT,
3ae0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74  .** then the ret
3af0: 75 72 6e 65 64 20 6f 62 6a 65 63 74 20 77 69 6c  urned object wil
3b00: 6c 20 72 65 66 65 72 65 6e 63 65 20 70 56 65 63  l reference pVec
3b10: 74 6f 72 20 61 6e 64 20 73 6f 20 70 56 65 63 74  tor and so pVect
3b20: 6f 72 20 6d 75 73 74 20 72 65 6d 61 69 6e 0a 2a  or must remain.*
3b30: 2a 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20  * valid for the 
3b40: 6c 69 66 65 20 6f 66 20 74 68 65 20 72 65 74 75  life of the retu
3b50: 72 6e 65 64 20 6f 62 6a 65 63 74 2e 20 20 49 66  rned object.  If
3b60: 20 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b   pVector is a TK
3b70: 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72 20 61 20  _VECTOR.** or a 
3b80: 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
3b90: 6e 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20 62  n, then it can b
3ba0: 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f  e deleted as soo
3bb0: 6e 20 61 73 20 74 68 69 73 20 72 6f 75 74 69 6e  n as this routin
3bc0: 65 0a 2a 2a 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  e.** returns..**
3bd0: 0a 2a 2a 20 41 20 74 72 69 63 6b 20 74 6f 20 63  .** A trick to c
3be0: 61 75 73 65 20 61 20 54 4b 5f 53 45 4c 45 43 54  ause a TK_SELECT
3bf0: 20 70 56 65 63 74 6f 72 20 74 6f 20 62 65 20 64   pVector to be d
3c00: 65 6c 65 74 65 64 20 74 6f 67 65 74 68 65 72 20  eleted together 
3c10: 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 74 75  with.** the retu
3c20: 72 6e 65 64 20 45 78 70 72 20 6f 62 6a 65 63 74  rned Expr object
3c30: 20 69 73 20 74 6f 20 61 74 74 61 63 68 20 74 68   is to attach th
3c40: 65 20 70 56 65 63 74 6f 72 20 74 6f 20 74 68 65  e pVector to the
3c50: 20 70 52 69 67 68 74 20 66 69 65 6c 64 0a 2a 2a   pRight field.**
3c60: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
3c70: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
3c80: 4e 20 45 78 70 72 20 6f 62 6a 65 63 74 2e 0a 2a  N Expr object..*
3c90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
3ca0: 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c  xprForVectorFiel
3cb0: 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
3cc0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
3cd0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
3ce0: 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c    Expr *pVector,
3cf0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65         /* The ve
3d00: 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20 65  ctor.  List of e
3d10: 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20  xpressions or a 
3d20: 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20 20  sub-SELECT */.  
3d30: 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20 20  int iField      
3d40: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f       /* Which co
3d50: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
3d60: 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  or to return */.
3d70: 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74 3b  ){.  Expr *pRet;
3d80: 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e  .  if( pVector->
3d90: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
3da0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56 65  .    assert( pVe
3db0: 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  ctor->flags & EP
3dc0: 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20  _xIsSelect );.  
3dd0: 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c 45    /* The TK_SELE
3de0: 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6e  CT_COLUMN Expr n
3df0: 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ode:.    **.    
3e00: 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20 20  ** pLeft:       
3e10: 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e 74      pVector cont
3e20: 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43 54  aining TK_SELECT
3e30: 2e 20 20 4e 6f 74 20 64 65 6c 65 74 65 64 2e 0a  .  Not deleted..
3e40: 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20 20      ** pRight:  
3e50: 20 20 20 20 20 20 20 20 6e 6f 74 20 75 73 65 64          not used
3e60: 2e 20 20 42 75 74 20 72 65 63 75 72 73 69 76 65  .  But recursive
3e70: 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  ly deleted..    
3e80: 2a 2a 20 69 43 6f 6c 75 6d 6e 3a 20 20 20 20 20  ** iColumn:     
3e90: 20 20 20 20 49 6e 64 65 78 20 6f 66 20 61 20 63      Index of a c
3ea0: 6f 6c 75 6d 6e 20 69 6e 20 70 56 65 63 74 6f 72  olumn in pVector
3eb0: 0a 20 20 20 20 2a 2a 20 69 54 61 62 6c 65 3a 20  .    ** iTable: 
3ec0: 20 20 20 20 20 20 20 20 20 30 20 6f 72 20 74 68           0 or th
3ed0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
3ee0: 6d 6e 73 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f  mns on the LHS o
3ef0: 66 20 61 6e 20 61 73 73 69 67 6e 6d 65 6e 74 0a  f an assignment.
3f00: 20 20 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69 54      ** pLeft->iT
3f10: 61 62 6c 65 3a 20 20 20 46 69 72 73 74 20 69 6e  able:   First in
3f20: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
3f30: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65  ister holding re
3f40: 73 75 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20 2a  sult, or 0.    *
3f50: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
3f60: 20 20 20 69 66 20 74 68 65 20 72 65 73 75 6c 74     if the result
3f70: 20 69 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d 70   is not yet comp
3f80: 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uted..    **.   
3f90: 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44   ** sqlite3ExprD
3fa0: 65 6c 65 74 65 28 29 20 73 70 65 63 69 66 69 63  elete() specific
3fb0: 61 6c 6c 79 20 73 6b 69 70 73 20 74 68 65 20 72  ally skips the r
3fc0: 65 63 75 72 73 69 76 65 20 64 65 6c 65 74 65 20  ecursive delete 
3fd0: 6f 66 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 20  of.    ** pLeft 
3fe0: 6f 6e 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  on TK_SELECT_COL
3ff0: 55 4d 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74 20  UMN nodes.  But 
4000: 70 52 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f 77  pRight is follow
4010: 65 64 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a 20  ed, so pVector. 
4020: 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 74 74     ** can be att
4030: 61 63 68 65 64 20 74 6f 20 70 52 69 67 68 74 20  ached to pRight 
4040: 74 6f 20 63 61 75 73 65 20 74 68 69 73 20 6e 6f  to cause this no
4050: 64 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65 72  de to take owner
4060: 73 68 69 70 20 6f 66 0a 20 20 20 20 2a 2a 20 70  ship of.    ** p
4070: 56 65 63 74 6f 72 2e 20 20 54 79 70 69 63 61 6c  Vector.  Typical
4080: 6c 79 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65  ly there will be
4090: 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45 4c   multiple TK_SEL
40a0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73  ECT_COLUMN nodes
40b0: 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
40c0: 20 73 61 6d 65 20 70 4c 65 66 74 20 70 6f 69 6e   same pLeft poin
40d0: 74 65 72 20 74 6f 20 74 68 65 20 70 56 65 63 74  ter to the pVect
40e0: 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e 65  or, but only one
40f0: 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
4100: 77 69 6c 6c 20 6f 77 6e 20 74 68 65 20 70 56 65  will own the pVe
4110: 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctor..    */.   
4120: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 50   pRet = sqlite3P
4130: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
4140: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 2c 20 30  SELECT_COLUMN, 0
4150: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 52  , 0);.    if( pR
4160: 65 74 20 29 7b 0a 20 20 20 20 20 20 70 52 65 74  et ){.      pRet
4170: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 46 69 65  ->iColumn = iFie
4180: 6c 64 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e  ld;.      pRet->
4190: 70 4c 65 66 74 20 3d 20 70 56 65 63 74 6f 72 3b  pLeft = pVector;
41a0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
41b0: 74 28 20 70 52 65 74 3d 3d 30 20 7c 7c 20 70 52  t( pRet==0 || pR
41c0: 65 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 3b  et->iTable==0 );
41d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
41e0: 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  ( pVector->op==T
41f0: 4b 5f 56 45 43 54 4f 52 20 29 20 70 56 65 63 74  K_VECTOR ) pVect
4200: 6f 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78 2e  or = pVector->x.
4210: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d  pList->a[iField]
4220: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 52 65 74  .pExpr;.    pRet
4230: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
4240: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 56  p(pParse->db, pV
4250: 65 63 74 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73  ector, 0);.    s
4260: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
4270: 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 70  nRemap(pParse, p
4280: 52 65 74 2c 20 70 56 65 63 74 6f 72 29 3b 0a 20  Ret, pVector);. 
4290: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
42a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78  ;.}../*.** If ex
42b0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
42c0: 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 53 45 4c  s of type TK_SEL
42d0: 45 43 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  ECT, generate co
42e0: 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a  de to evaluate.*
42f0: 2a 20 69 74 2e 20 52 65 74 75 72 6e 20 74 68 65  * it. Return the
4300: 20 72 65 67 69 73 74 65 72 20 69 6e 20 77 68 69   register in whi
4310: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ch the result is
4320: 20 73 74 6f 72 65 64 20 28 6f 72 2c 20 69 66 20   stored (or, if 
4330: 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65  the .** sub-sele
4340: 63 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20  ct returns more 
4350: 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c  than one column,
4360: 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e   the first in an
4370: 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20 72 65 67   array.** of reg
4380: 69 73 74 65 72 73 20 69 6e 20 77 68 69 63 68 20  isters in which 
4390: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74  the result is st
43a0: 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ored)..**.** If 
43b0: 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 54  pExpr is not a T
43c0: 4b 5f 53 45 4c 45 43 54 20 65 78 70 72 65 73 73  K_SELECT express
43d0: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ion, return 0..*
43e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
43f0: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50  rCodeSubselect(P
4400: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
4410: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
4420: 74 20 72 65 67 20 3d 20 30 3b 0a 23 69 66 6e 64  t reg = 0;.#ifnd
4430: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
4440: 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 70 45  UBQUERY.  if( pE
4450: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
4460: 43 54 20 29 7b 0a 20 20 20 20 72 65 67 20 3d 20  CT ){.    reg = 
4470: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
4480: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
4490: 70 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  pr);.  }.#endif.
44a0: 20 20 72 65 74 75 72 6e 20 72 65 67 3b 0a 7d 0a    return reg;.}.
44b0: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
44c0: 70 56 65 63 74 6f 72 20 70 6f 69 6e 74 73 20 74  pVector points t
44d0: 6f 20 61 20 76 65 63 74 6f 72 20 65 78 70 72 65  o a vector expre
44e0: 73 73 69 6f 6e 20 2d 20 65 69 74 68 65 72 20 61  ssion - either a
44f0: 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f 72   TK_VECTOR.** or
4500: 20 54 4b 5f 53 45 4c 45 43 54 20 74 68 61 74 20   TK_SELECT that 
4510: 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
4520: 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54 68  n one column. Th
4530: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
4540: 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  rns.** the regis
4550: 74 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  ter number of a 
4560: 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 6f  register that co
4570: 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
4580: 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 69   of.** element i
4590: 46 69 65 6c 64 20 6f 66 20 74 68 65 20 76 65 63  Field of the vec
45a0: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 56  tor..**.** If pV
45b0: 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53 45  ector is a TK_SE
45c0: 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c  LECT expression,
45d0: 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20 69   then code for i
45e0: 74 20 6d 75 73 74 20 68 61 76 65 20 0a 2a 2a 20  t must have .** 
45f0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e  already been gen
4600: 65 72 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  erated using the
4610: 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c 65   exprCodeSubsele
4620: 63 74 28 29 20 72 6f 75 74 69 6e 65 2e 20 49 6e  ct() routine. In
4630: 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 70 61   this.** case pa
4640: 72 61 6d 65 74 65 72 20 72 65 67 53 65 6c 65 63  rameter regSelec
4650: 74 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  t should be the 
4660: 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
4670: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 2a  y of registers.*
4680: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
4690: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
46a0: 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a 0a  sub-select. .**.
46b0: 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69 73  ** If pVector is
46c0: 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43 54   of type TK_VECT
46d0: 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f  OR, then code fo
46e0: 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  r the requested 
46f0: 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65 6e 65  field.** is gene
4700: 72 61 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  rated. In this c
4710: 61 73 65 20 28 2a 70 52 65 67 46 72 65 65 29 20  ase (*pRegFree) 
4720: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 74 68  may be set to th
4730: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61  e number of.** a
4740: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
4750: 74 65 72 20 74 6f 20 62 65 20 66 72 65 65 64 20  ter to be freed 
4760: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 65  by the caller be
4770: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
4780: 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
4790: 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74 20 70  urning, output p
47a0: 61 72 61 6d 65 74 65 72 20 28 2a 70 70 45 78 70  arameter (*ppExp
47b0: 72 29 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  r) is set to poi
47c0: 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45 78 70  nt to the.** Exp
47d0: 72 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  r object corresp
47e0: 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d 65 6e  onding to elemen
47f0: 74 20 69 45 6c 65 6d 20 6f 66 20 74 68 65 20 76  t iElem of the v
4800: 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ector..*/.static
4810: 20 69 6e 74 20 65 78 70 72 56 65 63 74 6f 72 52   int exprVectorR
4820: 65 67 69 73 74 65 72 28 0a 20 20 50 61 72 73 65  egister(.  Parse
4830: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
4850: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
4860: 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20   Expr *pVector, 
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20 65 78   /* Vector to ex
4890: 74 72 61 63 74 20 65 6c 65 6d 65 6e 74 20 66 72  tract element fr
48a0: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65  om */.  int iFie
48b0: 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ld,             
48c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64          /* Field
48d0: 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d   to extract from
48e0: 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20 69 6e   pVector */.  in
48f0: 74 20 72 65 67 53 65 6c 65 63 74 2c 20 20 20 20  t regSelect,    
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4910: 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79 20   First in array 
4920: 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  of registers */.
4930: 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 2c    Expr **ppExpr,
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72 65 73    /* OUT: Expres
4960: 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  sion element */.
4970: 20 20 69 6e 74 20 2a 70 52 65 67 46 72 65 65 20    int *pRegFree 
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70 20 72    /* OUT: Temp r
49a0: 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65 20  egister to free 
49b0: 2a 2f 0a 29 7b 0a 20 20 75 38 20 6f 70 20 3d 20  */.){.  u8 op = 
49c0: 70 56 65 63 74 6f 72 2d 3e 6f 70 3b 0a 20 20 61  pVector->op;.  a
49d0: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 56 45  ssert( op==TK_VE
49e0: 43 54 4f 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52  CTOR || op==TK_R
49f0: 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54  EGISTER || op==T
4a00: 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 69 66  K_SELECT );.  if
4a10: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
4a20: 52 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70 72  R ){.    *ppExpr
4a30: 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72   = sqlite3Vector
4a40: 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 56 65  FieldSubexpr(pVe
4a50: 63 74 6f 72 2c 20 69 46 69 65 6c 64 29 3b 0a 20  ctor, iField);. 
4a60: 20 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f     return pVecto
4a70: 72 2d 3e 69 54 61 62 6c 65 2b 69 46 69 65 6c 64  r->iTable+iField
4a80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d  ;.  }.  if( op==
4a90: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
4aa0: 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63 74   *ppExpr = pVect
4ab0: 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  or->x.pSelect->p
4ac0: 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64 5d  EList->a[iField]
4ad0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 72 65 74  .pExpr;.     ret
4ae0: 75 72 6e 20 72 65 67 53 65 6c 65 63 74 2b 69 46  urn regSelect+iF
4af0: 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70 70 45  ield;.  }.  *ppE
4b00: 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e 78  xpr = pVector->x
4b10: 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  .pList->a[iField
4b20: 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65 74 75 72  ].pExpr;.  retur
4b30: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
4b40: 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 2a 70  eTemp(pParse, *p
4b50: 70 45 78 70 72 2c 20 70 52 65 67 46 72 65 65 29  pExpr, pRegFree)
4b60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65  ;.}../*.** Expre
4b70: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61  ssion pExpr is a
4b80: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77   comparison betw
4b90: 65 65 6e 20 74 77 6f 20 76 65 63 74 6f 72 20 76  een two vector v
4ba0: 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65 0a 2a  alues. Compute.*
4bb0: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
4bc0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28  the comparison (
4bd0: 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c 29 20 61  1, 0, or NULL) a
4be0: 6e 64 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a  nd write that.**
4bf0: 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65 67   result into reg
4c00: 69 73 74 65 72 20 64 65 73 74 2e 0a 2a 2a 0a 2a  ister dest..**.*
4c10: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
4c20: 74 20 73 61 74 69 73 66 79 20 74 68 65 20 66 6f  t satisfy the fo
4c30: 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f 6e 64 69  llowing precondi
4c40: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tions:.**.**    
4c50: 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  if pExpr->op==TK
4c60: 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d 3d 54 4b  _IS:      op==TK
4c70: 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49  _EQ and p5==SQLI
4c80: 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20  TE_NULLEQ.**    
4c90: 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  if pExpr->op==TK
4ca0: 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54 4b  _ISNOT:   op==TK
4cb0: 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53 51 4c 49  _NE and p5==SQLI
4cc0: 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20 20  TE_NULLEQ.**    
4cd0: 6f 74 68 65 72 77 69 73 65 3a 20 20 20 20 20 20  otherwise:      
4ce0: 20 20 20 20 20 20 20 20 20 20 6f 70 3d 3d 70 45            op==pE
4cf0: 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70 35 3d 3d  xpr->op and p5==
4d00: 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  0.*/.static void
4d10: 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61   codeVectorCompa
4d20: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
4d30: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  rse,        /* C
4d40: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 6f  ode generator co
4d50: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
4d60: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
4d70: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
4d80: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
4d90: 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
4da0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
4db0: 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 74 68   results into th
4dc0: 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  is register */. 
4dd0: 20 75 38 20 6f 70 2c 20 20 20 20 20 20 20 20 20   u8 op,         
4de0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
4df0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ison operator */
4e00: 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
4e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
4e20: 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20 7a 65 72  TE_NULLEQ or zer
4e30: 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  o */.){.  Vdbe *
4e40: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4e50: 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  e;.  Expr *pLeft
4e60: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
4e70: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20  .  Expr *pRight 
4e80: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
4e90: 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 73  .  int nLeft = s
4ea0: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
4eb0: 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20 69  Size(pLeft);.  i
4ec0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 4c  nt i;.  int regL
4ed0: 65 66 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  eft = 0;.  int r
4ee0: 65 67 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 75  egRight = 0;.  u
4ef0: 38 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 69 6e  8 opx = op;.  in
4f00: 74 20 61 64 64 72 44 6f 6e 65 20 3d 20 73 71 6c  t addrDone = sql
4f10: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
4f20: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
4f30: 20 69 73 43 6f 6d 6d 75 74 65 64 20 3d 20 45 78   isCommuted = Ex
4f40: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
4f50: 78 70 72 2c 45 50 5f 43 6f 6d 6d 75 74 65 64 29  xpr,EP_Commuted)
4f60: 3b 0a 0a 20 20 69 66 28 20 6e 4c 65 66 74 21 3d  ;..  if( nLeft!=
4f70: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
4f80: 72 53 69 7a 65 28 70 52 69 67 68 74 29 20 29 7b  rSize(pRight) ){
4f90: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4fa0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f  rMsg(pParse, "ro
4fb0: 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22  w value misused"
4fc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
4fd0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45 78   }.  assert( pEx
4fe0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c  pr->op==TK_EQ ||
4ff0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
5000: 45 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 45 78  E .       || pEx
5010: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c  pr->op==TK_IS ||
5020: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
5030: 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 7c 7c 20  SNOT .       || 
5040: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
5050: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
5060: 4b 5f 47 54 20 0a 20 20 20 20 20 20 20 7c 7c 20  K_GT .       || 
5070: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
5080: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
5090: 4b 5f 47 45 20 0a 20 20 29 3b 0a 20 20 61 73 73  K_GE .  );.  ass
50a0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
50b0: 6f 70 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70  op || (pExpr->op
50c0: 3d 3d 54 4b 5f 49 53 20 26 26 20 6f 70 3d 3d 54  ==TK_IS && op==T
50d0: 4b 5f 45 51 29 0a 20 20 20 20 20 20 20 20 20 20  K_EQ).          
50e0: 20 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d    || (pExpr->op=
50f0: 3d 54 4b 5f 49 53 4e 4f 54 20 26 26 20 6f 70 3d  =TK_ISNOT && op=
5100: 3d 54 4b 5f 4e 45 29 20 29 3b 0a 20 20 61 73 73  =TK_NE) );.  ass
5110: 65 72 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45  ert( p5==0 || pE
5120: 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20  xpr->op!=op );. 
5130: 20 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51 4c   assert( p5==SQL
5140: 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45  ITE_NULLEQ || pE
5150: 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a  xpr->op==op );..
5160: 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 53    p5 |= SQLITE_S
5170: 54 4f 52 45 50 32 3b 0a 20 20 69 66 28 20 6f 70  TOREP2;.  if( op
5180: 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70 78 20 3d  x==TK_LE ) opx =
5190: 20 54 4b 5f 4c 54 3b 0a 20 20 69 66 28 20 6f 70   TK_LT;.  if( op
51a0: 78 3d 3d 54 4b 5f 47 45 20 29 20 6f 70 78 20 3d  x==TK_GE ) opx =
51b0: 20 54 4b 5f 47 54 3b 0a 0a 20 20 72 65 67 4c 65   TK_GT;..  regLe
51c0: 66 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62  ft = exprCodeSub
51d0: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
51e0: 4c 65 66 74 29 3b 0a 20 20 72 65 67 52 69 67 68  Left);.  regRigh
51f0: 74 20 3d 20 65 78 70 72 43 6f 64 65 53 75 62 73  t = exprCodeSubs
5200: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 52  elect(pParse, pR
5210: 69 67 68 74 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  ight);..  for(i=
5220: 30 3b 20 31 20 2f 2a 4c 6f 6f 70 20 65 78 69 74  0; 1 /*Loop exit
5230: 73 20 62 79 20 22 62 72 65 61 6b 22 2a 2f 3b 20  s by "break"*/; 
5240: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  i++){.    int re
5250: 67 46 72 65 65 31 20 3d 20 30 2c 20 72 65 67 46  gFree1 = 0, regF
5260: 72 65 65 32 20 3d 20 30 3b 0a 20 20 20 20 45 78  ree2 = 0;.    Ex
5270: 70 72 20 2a 70 4c 2c 20 2a 70 52 3b 20 0a 20 20  pr *pL, *pR; .  
5280: 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20    int r1, r2;.  
5290: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
52a0: 26 20 69 3c 6e 4c 65 66 74 20 29 3b 0a 20 20 20  & i<nLeft );.   
52b0: 20 72 31 20 3d 20 65 78 70 72 56 65 63 74 6f 72   r1 = exprVector
52c0: 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
52d0: 20 70 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c 65   pLeft, i, regLe
52e0: 66 74 2c 20 26 70 4c 2c 20 26 72 65 67 46 72 65  ft, &pL, &regFre
52f0: 65 31 29 3b 0a 20 20 20 20 72 32 20 3d 20 65 78  e1);.    r2 = ex
5300: 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72  prVectorRegister
5310: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
5320: 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70   i, regRight, &p
5330: 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  R, &regFree2);. 
5340: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
5350: 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c 20 6f  Parse, pL, pR, o
5360: 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65 73 74  px, r1, r2, dest
5370: 2c 20 70 35 2c 20 69 73 43 6f 6d 6d 75 74 65 64  , p5, isCommuted
5380: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
5390: 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
53a0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
53b0: 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 74 65 73  =OP_Lt);.    tes
53c0: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
53d0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
53e0: 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
53f0: 20 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d     testcase(op==
5400: 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
5410: 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
5420: 47 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Gt);.    testcas
5430: 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
5440: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
5450: 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 74  p==OP_Ge);.    t
5460: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
5470: 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
5480: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
5490: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 6f 70  .    testcase(op
54a0: 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
54b0: 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
54c0: 50 5f 4e 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  P_Ne);.    sqlit
54d0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
54e0: 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
54f0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  1);.    sqlite3R
5500: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
5510: 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
5520: 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66  .    if( i==nLef
5530: 74 2d 31 20 29 7b 0a 20 20 20 20 20 20 62 72 65  t-1 ){.      bre
5540: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
5550: 28 20 6f 70 78 3d 3d 54 4b 5f 45 51 20 29 7b 0a  ( opx==TK_EQ ){.
5560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5570: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
5580: 4e 6f 74 2c 20 64 65 73 74 2c 20 61 64 64 72 44  Not, dest, addrD
5590: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
55a0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 35 20  ge(v);.      p5 
55b0: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
55c0: 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  LL;.    }else if
55d0: 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b 0a  ( opx==TK_NE ){.
55e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
55f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
5600: 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65  , dest, addrDone
5610: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
5620: 76 29 3b 0a 20 20 20 20 20 20 70 35 20 7c 3d 20  v);.      p5 |= 
5630: 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 3b  SQLITE_KEEPNULL;
5640: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5650: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
5660: 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 47 54  _LT || op==TK_GT
5670: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c   || op==TK_LE ||
5680: 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20   op==TK_GE );.  
5690: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
56a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 6c 73 65  ddOp2(v, OP_Else
56b0: 4e 6f 74 45 71 2c 20 30 2c 20 61 64 64 72 44 6f  NotEq, 0, addrDo
56c0: 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ne);.      VdbeC
56d0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
56e0: 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56  =TK_LT);.      V
56f0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
5700: 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20   op==TK_GT);.   
5710: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
5720: 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29 3b  f(v, op==TK_LE);
5730: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
5740: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
5750: 47 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  GE);.      if( i
5760: 3d 3d 6e 4c 65 66 74 2d 32 20 29 20 6f 70 78 20  ==nLeft-2 ) opx 
5770: 3d 20 6f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = op;.    }.  }.
5780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
5790: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
57a0: 72 44 6f 6e 65 29 3b 0a 7d 0a 0a 23 69 66 20 53  rDone);.}..#if S
57b0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
57c0: 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65  EPTH>0./*.** Che
57d0: 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  ck that argument
57e0: 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73   nHeight is less
57f0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
5800: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a  o the maximum.**
5810: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
5820: 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74  h allowed. If it
5830: 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61   is not, leave a
5840: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
5850: 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  in.** pParse..*/
5860: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
5870: 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73  CheckHeight(Pars
5880: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
5890: 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72  Height){.  int r
58a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
58b0: 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20   int mxHeight = 
58c0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
58d0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
58e0: 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69  EXPR_DEPTH];.  i
58f0: 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69  f( nHeight>mxHei
5900: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
5910: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5920: 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72  e, .       "Expr
5930: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
5940: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
5950: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78  m depth %d)", mx
5960: 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20  Height.    );.  
5970: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
5980: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
5990: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  n rc;.}../* The 
59a0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
59b0: 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68  functions, heigh
59c0: 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68  tOfExpr(), heigh
59d0: 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  tOfExprList().**
59e0: 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c   and heightOfSel
59f0: 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20  ect(), are used 
5a00: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
5a10: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a   maximum height.
5a20: 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ** of any expres
5a30: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
5a40: 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75  nced by the stru
5a50: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
5a60: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
5a70: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
5a80: 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69  this maximum hei
5a90: 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ght is greater t
5aa0: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
5ab0: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
5ac0: 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c   to by pnHeight,
5ad0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
5ae0: 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20  meter, then set 
5af0: 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61  *pnHeight to tha
5b00: 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  t.** value..*/.s
5b10: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
5b20: 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c  tOfExpr(Expr *p,
5b30: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5b40: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5b50: 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a  if( p->nHeight>*
5b60: 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  pnHeight ){.    
5b70: 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d    *pnHeight = p-
5b80: 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  >nHeight;.    }.
5b90: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
5ba0: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  d heightOfExprLi
5bb0: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
5bc0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
5bd0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
5be0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
5bf0: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
5c00: 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68  ++){.      heigh
5c10: 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e  tOfExpr(p->a[i].
5c20: 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29  pExpr, pnHeight)
5c30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
5c40: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
5c50: 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  OfSelect(Select 
5c60: 2a 70 53 65 6c 65 63 74 2c 20 69 6e 74 20 2a 70  *pSelect, int *p
5c70: 6e 48 65 69 67 68 74 29 7b 0a 20 20 53 65 6c 65  nHeight){.  Sele
5c80: 63 74 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ct *p;.  for(p=p
5c90: 53 65 6c 65 63 74 3b 20 70 3b 20 70 3d 70 2d 3e  Select; p; p=p->
5ca0: 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 68 65 69  pPrior){.    hei
5cb0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68  ghtOfExpr(p->pWh
5cc0: 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ere, pnHeight);.
5cd0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5ce0: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48  (p->pHaving, pnH
5cf0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5d00: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d  htOfExpr(p->pLim
5d10: 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  it, pnHeight);. 
5d20: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
5d30: 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70  ist(p->pEList, p
5d40: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5d50: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5d60: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65  ->pGroupBy, pnHe
5d70: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5d80: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5d90: 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68  OrderBy, pnHeigh
5da0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
5db0: 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48   Set the Expr.nH
5dc0: 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69  eight variable i
5dd0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
5de0: 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a  passed as an .**
5df0: 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78   argument. An ex
5e00: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f  pression with no
5e10: 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e   children, Expr.
5e20: 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70  pList or .** Exp
5e30: 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72  r.pSelect member
5e40: 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66   has a height of
5e50: 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78   1. Any other ex
5e60: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20  pression.** has 
5e70: 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74  a height equal t
5e80: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  o the maximum he
5e90: 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65  ight of any othe
5ea0: 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64  r .** referenced
5eb0: 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a   Expr plus one..
5ec0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
5ed0: 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61 74  gate EP_Propagat
5ee0: 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d 20  e flags up from 
5ef0: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f 20  Expr.x.pList to 
5f00: 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20 69  Expr.flags,.** i
5f10: 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  f appropriate..*
5f20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
5f30: 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72  prSetHeight(Expr
5f40: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5f50: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5f60: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  tOfExpr(p->pLeft
5f70: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68  , &nHeight);.  h
5f80: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5f90: 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29  Right, &nHeight)
5fa0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
5fb0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
5fc0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
5fd0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5fe0: 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48  ->x.pSelect, &nH
5ff0: 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20  eight);.  }else 
6000: 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29  if( p->x.pList )
6010: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  {.    heightOfEx
6020: 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73  prList(p->x.pLis
6030: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
6040: 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50    p->flags |= EP
6050: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c  _Propagate & sql
6060: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
6070: 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  s(p->x.pList);. 
6080: 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20   }.  p->nHeight 
6090: 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d  = nHeight + 1;.}
60a0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
60b0: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
60c0: 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  iable using the 
60d0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20  exprSetHeight() 
60e0: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20  function. If.** 
60f0: 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72  the height is gr
6100: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d  eater than the m
6110: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65  aximum allowed e
6120: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c  xpression depth,
6130: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
6140: 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a  or in pParse..**
6150: 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61  .** Also propaga
6160: 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67  te all EP_Propag
6170: 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74  ate flags from t
6180: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
6190: 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61  into.** Expr.fla
61a0: 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gs. .*/.void sql
61b0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
61c0: 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20  tAndFlags(Parse 
61d0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
61e0: 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
61f0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
6200: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
6210: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  p);.  sqlite3Exp
6220: 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61  rCheckHeight(pPa
6230: 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29  rse, p->nHeight)
6240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6250: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  n the maximum he
6260: 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72  ight of any expr
6270: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
6280: 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65  renced.** by the
6290: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
62a0: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
62b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
62c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
62d0: 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a  rHeight(Select *
62e0: 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68  p){.  int nHeigh
62f0: 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f  t = 0;.  heightO
6300: 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69  fSelect(p, &nHei
6310: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  ght);.  return n
6320: 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 20  Height;.}.#else 
6330: 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67 68  /* ABOVE:  Heigh
6340: 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65 6e  t enforcement en
6350: 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20 48  abled.  BELOW: H
6360: 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e  eight enforcemen
6370: 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50  t off */./*.** P
6380: 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f  ropagate all EP_
6390: 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20  Propagate flags 
63a0: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
63b0: 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78  pList into.** Ex
63c0: 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f  pr.flags. .*/.vo
63d0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
63e0: 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28  tHeightAndFlags(
63f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
6400: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
6410: 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 26   && p->x.pList &
6420: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
6430: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
6440: 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c  ct) ){.    p->fl
6450: 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67  ags |= EP_Propag
6460: 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78 70  ate & sqlite3Exp
6470: 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e  rListFlags(p->x.
6480: 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 64  pList);.  }.}.#d
6490: 65 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69  efine exprSetHei
64a0: 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a  ght(y).#endif /*
64b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
64c0: 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a  _DEPTH>0 */../*.
64d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
64e0: 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f  is the core allo
64f0: 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e  cator for Expr n
6500: 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  odes..**.** Cons
6510: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
6520: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
6530: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
6540: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
6550: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
6560: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f   and for the pTo
6570: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ken argument is 
6580: 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  a single allocat
6590: 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20  ion.** obtained 
65a0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
65b0: 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c  lloc().  The cal
65c0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
65d0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
65e0: 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
65f0: 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61  the node eventua
6600: 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a  lly gets freed..
6610: 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  **.** If dequote
6620: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
6630: 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20  he token (if it 
6640: 65 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f  exists) is dequo
6650: 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ted..** If dequo
6660: 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20  te is false, no 
6670: 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72  dequoting is per
6680: 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64 65 51  formed.  The deQ
6690: 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uote.** paramete
66a0: 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  r is ignored if 
66b0: 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f  pToken is NULL o
66c0: 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20 64  r if the token d
66d0: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61  oes not.** appea
66e0: 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  r to be quoted. 
66f0: 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20 77   If the quotes w
6700: 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ere of the form 
6710: 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75  "..." (double-qu
6720: 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68  otes).** then th
6730: 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20 66  e EP_DblQuoted f
6740: 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
6750: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  e expression nod
6760: 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c  e..**.** Special
6770: 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54   case:  If op==T
6780: 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70 54  K_INTEGER and pT
6790: 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61  oken points to a
67a0: 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20   string that.** 
67b0: 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74 65  can be translate
67c0: 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74 20  d into a 32-bit 
67d0: 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68  integer, then th
67e0: 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a  e token is not.*
67f0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54  * stored in u.zT
6800: 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20  oken.  Instead, 
6810: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
6820: 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  es is written.**
6830: 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20 61   into u.iValue a
6840: 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  nd the EP_IntVal
6850: 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ue flag is set. 
6860: 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61 67   No extra storag
6870: 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65  e.** is allocate
6880: 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e  d to hold the in
6890: 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20 74  teger text and t
68a0: 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67 20  he dequote flag 
68b0: 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45  is ignored..*/.E
68c0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
68d0: 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65 33  Alloc(.  sqlite3
68e0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
68f0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73   /* Handle for s
6900: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
6910: 77 4e 4e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  wNN() */.  int o
6920: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6930: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6940: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e   opcode */.  con
6950: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  st Token *pToken
6960: 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72  ,    /* Token ar
6970: 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62  gument.  Might b
6980: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
6990: 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20  dequote         
69a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64      /* True to d
69b0: 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45  equote */.){.  E
69c0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  xpr *pNew;.  int
69d0: 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69   nExtra = 0;.  i
69e0: 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a  nt iValue = 0;..
69f0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
6a00: 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  );.  if( pToken 
6a10: 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54  ){.    if( op!=T
6a20: 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f  K_INTEGER || pTo
6a30: 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20  ken->z==0.      
6a40: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65      || sqlite3Ge
6a50: 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a  tInt32(pToken->z
6a60: 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b  , &iValue)==0 ){
6a70: 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d 20  .      nExtra = 
6a80: 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20  pToken->n+1;.   
6a90: 20 20 20 61 73 73 65 72 74 28 20 69 56 61 6c 75     assert( iValu
6aa0: 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  e>=0 );.    }.  
6ab0: 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  }.  pNew = sqlit
6ac0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
6ad0: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29  db, sizeof(Expr)
6ae0: 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20  +nExtra);.  if( 
6af0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d 73  pNew ){.    mems
6b00: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
6b10: 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 70  of(Expr));.    p
6b20: 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  New->op = (u8)op
6b30: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67 67  ;.    pNew->iAgg
6b40: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70   = -1;.    if( p
6b50: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  Token ){.      i
6b60: 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a  f( nExtra==0 ){.
6b70: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
6b80: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
6b90: 75 65 7c 45 50 5f 4c 65 61 66 7c 28 69 56 61 6c  ue|EP_Leaf|(iVal
6ba0: 75 65 3f 45 50 5f 49 73 54 72 75 65 3a 45 50 5f  ue?EP_IsTrue:EP_
6bb0: 49 73 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IsFalse);.      
6bc0: 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
6bd0: 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20   = iValue;.     
6be0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6bf0: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
6c00: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
6c10: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6c20: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c  ( pToken->z!=0 |
6c30: 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29  | pToken->n==0 )
6c40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
6c50: 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79  oken->n ) memcpy
6c60: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  (pNew->u.zToken,
6c70: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
6c80: 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  en->n);.        
6c90: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70  pNew->u.zToken[p
6ca0: 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  Token->n] = 0;. 
6cb0: 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f         if( dequo
6cc0: 74 65 20 26 26 20 73 71 6c 69 74 65 33 49 73 71  te && sqlite3Isq
6cd0: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
6ce0: 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ken[0]) ){.     
6cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
6d00: 6f 74 65 45 78 70 72 28 70 4e 65 77 29 3b 0a 20  oteExpr(pNew);. 
6d10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6d20: 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  .    }.#if SQLIT
6d30: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
6d40: 3e 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65  >0.    pNew->nHe
6d50: 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66  ight = 1;.#endif
6d60: 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20    .  }.  return 
6d70: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
6d80: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78  llocate a new ex
6d90: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72  pression node fr
6da0: 6f 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  om a zero-termin
6db0: 61 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20  ated token that 
6dc0: 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62  has.** already b
6dd0: 65 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f  een dequoted..*/
6de0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
6df0: 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
6e00: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
6e10: 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69   Handle for sqli
6e20: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
6e30: 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20  ) (may be null) 
6e40: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e60: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
6e70: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
6e80: 72 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f  r *zToken      /
6e90: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
6ea0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
6eb0: 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78   */.){.  Token x
6ec0: 3b 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e  ;.  x.z = zToken
6ed0: 3b 0a 20 20 78 2e 6e 20 3d 20 73 71 6c 69 74 65  ;.  x.n = sqlite
6ee0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
6ef0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
6f00: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
6f10: 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a   op, &x, 0);.}..
6f20: 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73 75 62  /*.** Attach sub
6f30: 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20  trees pLeft and 
6f40: 70 52 69 67 68 74 20 74 6f 20 74 68 65 20 45 78  pRight to the Ex
6f50: 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a  pr node pRoot..*
6f60: 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d 3d 4e  *.** If pRoot==N
6f70: 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ULL that means t
6f80: 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c  hat a memory all
6f90: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
6fa0: 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 49  s occurred..** I
6fb0: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 65 6c  n that case, del
6fc0: 65 74 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ete the subtrees
6fd0: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
6fe0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
6ff0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
7000: 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20  rees(.  sqlite3 
7010: 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70 52 6f  *db,.  Expr *pRo
7020: 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  ot,.  Expr *pLef
7030: 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  t,.  Expr *pRigh
7040: 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f 6f 74  t.){.  if( pRoot
7050: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
7060: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
7070: 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  led );.    sqlit
7080: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
7090: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c   pLeft);.    sql
70a0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
70b0: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65  b, pRight);.  }e
70c0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 52 69  lse{.    if( pRi
70d0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  ght ){.      pRo
70e0: 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ot->pRight = pRi
70f0: 67 68 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  ght;.      pRoot
7100: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
7110: 6f 70 61 67 61 74 65 20 26 20 70 52 69 67 68 74  opagate & pRight
7120: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
7130: 20 20 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a     if( pLeft ){.
7140: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65        pRoot->pLe
7150: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20  ft = pLeft;.    
7160: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
7170: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
7180: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20   pLeft->flags;. 
7190: 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74     }.    exprSet
71a0: 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20  Height(pRoot);. 
71b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
71c0: 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64  cate an Expr nod
71d0: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
71e0: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
71f0: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
7200: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
7210: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
7220: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
7230: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
7240: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
7250: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
7260: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
7270: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
7280: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
7290: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
72a0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
72b0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
72c0: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
72d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
72e0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
72f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
7300: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
7310: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
7320: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
7330: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
7340: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
7350: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
7360: 70 52 69 67 68 74 20 20 20 20 20 20 20 20 20 20  pRight          
7370: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
7380: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  nd */.){.  Expr 
7390: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
73a0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
73b0: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
73c0: 66 28 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20  f(Expr));.  if( 
73d0: 70 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  p ){.    memset(
73e0: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  p, 0, sizeof(Exp
73f0: 72 29 29 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  r));.    p->op =
7400: 20 6f 70 20 26 20 30 78 66 66 3b 0a 20 20 20 20   op & 0xff;.    
7410: 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  p->iAgg = -1;.  
7420: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
7430: 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72  achSubtrees(pPar
7440: 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74  se->db, p, pLeft
7450: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73  , pRight);.    s
7460: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
7470: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d  eight(pParse, p-
7480: 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c  >nHeight);.  }el
7490: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
74a0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
74b0: 2d 3e 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  ->db, pLeft);.  
74c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
74d0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
74e0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72  pRight);.  }.  r
74f0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
7500: 2a 20 41 64 64 20 70 53 65 6c 65 63 74 20 74 6f  * Add pSelect to
7510: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 53 65 6c   the Expr.x.pSel
7520: 65 63 74 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20  ect field.  Or, 
7530: 69 66 20 70 45 78 70 72 20 69 73 20 4e 55 4c 4c  if pExpr is NULL
7540: 20 28 64 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65   (due.** do a me
7550: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
7560: 66 61 69 6c 75 72 65 29 20 74 68 65 6e 20 64 65  failure) then de
7570: 6c 65 74 65 20 74 68 65 20 70 53 65 6c 65 63 74  lete the pSelect
7580: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
7590: 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64 64   sqlite3PExprAdd
75a0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
75b0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
75c0: 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
75d0: 63 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  ct){.  if( pExpr
75e0: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 78   ){.    pExpr->x
75f0: 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65  .pSelect = pSele
7600: 63 74 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50  ct;.    ExprSetP
7610: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
7620: 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53  P_xIsSelect|EP_S
7630: 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 73 71  ubquery);.    sq
7640: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
7650: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
7660: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c  e, pExpr);.  }el
7670: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
7680: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
7690: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
76a0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
76b0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
76c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a  pSelect);.  }.}.
76d0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
76e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
76f0: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
7700: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
7710: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
7720: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
7730: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
7740: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
7750: 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20 6f  ** If one side o
7760: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
7770: 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e 20  he AND is known 
7780: 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68 65  to be false, the
7790: 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20  n instead.** of 
77a0: 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e 44  returning an AND
77b0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75 73   expression, jus
77c0: 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73 74  t return a const
77d0: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ant expression w
77e0: 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20 6f  ith.** a value o
77f0: 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70 72  f false..*/.Expr
7800: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64   *sqlite3ExprAnd
7810: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7820: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
7830: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 73 71  r *pRight){.  sq
7840: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7850: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c  se->db;.  if( pL
7860: 65 66 74 3d 3d 30 20 20 29 7b 0a 20 20 20 20 72  eft==0  ){.    r
7870: 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20  eturn pRight;.  
7880: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
7890: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
78a0: 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65  n pLeft;.  }else
78b0: 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73 46   if( ExprAlwaysF
78c0: 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c 20 45  alse(pLeft) || E
78d0: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
78e0: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 73 71  Right) ){.    sq
78f0: 6c 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e  lite3ExprUnmapAn
7900: 64 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20  dDelete(pParse, 
7910: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
7920: 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64 44  te3ExprUnmapAndD
7930: 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70 52  elete(pParse, pR
7940: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
7950: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  n sqlite3Expr(db
7960: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 22 30  , TK_INTEGER, "0
7970: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
7980: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
7990: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
79a0: 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  AND, pLeft, pRig
79b0: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
79c0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
79d0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
79e0: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
79f0: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
7a00: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
7a10: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
7a20: 72 46 75 6e 63 74 69 6f 6e 28 0a 20 20 50 61 72  rFunction(.  Par
7a30: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7a40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
7a50: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
7a60: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
7a70: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6c 69 73   /* Argument lis
7a80: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
7a90: 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  oken,        /* 
7aa0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63  Name of the func
7ab0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 44  tion */.  int eD
7ac0: 69 73 74 69 6e 63 74 20 20 20 20 20 20 20 20 20  istinct         
7ad0: 2f 2a 20 53 46 5f 44 69 73 74 69 6e 63 74 20 6f  /* SF_Distinct o
7ae0: 72 20 53 46 5f 41 4c 4c 20 6f 72 20 30 20 2a 2f  r SF_ALL or 0 */
7af0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
7b00: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7b10: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7b20: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
7b30: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
7b40: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
7b50: 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f  TK_FUNCTION, pTo
7b60: 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ken, 1);.  if( p
7b70: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
7b80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
7b90: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
7ba0: 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20  /* Avoid memory 
7bb0: 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  leak when malloc
7bc0: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
7bd0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
7be0: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
7bf0: 2d 3e 6e 45 78 70 72 20 3e 20 70 50 61 72 73 65  ->nExpr > pParse
7c00: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
7c10: 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
7c20: 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73  ON_ARG] ){.    s
7c30: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7c40: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
7c50: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75   arguments on fu
7c60: 6e 63 74 69 6f 6e 20 25 54 22 2c 20 70 54 6f 6b  nction %T", pTok
7c70: 65 6e 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  en);.  }.  pNew-
7c80: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
7c90: 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  ;.  ExprSetPrope
7ca0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 48 61 73  rty(pNew, EP_Has
7cb0: 46 75 6e 63 29 3b 0a 20 20 61 73 73 65 72 74 28  Func);.  assert(
7cc0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
7cd0: 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65  y(pNew, EP_xIsSe
7ce0: 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  lect) );.  sqlit
7cf0: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
7d00: 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20  ndFlags(pParse, 
7d10: 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 65 44 69  pNew);.  if( eDi
7d20: 73 74 69 6e 63 74 3d 3d 53 46 5f 44 69 73 74 69  stinct==SF_Disti
7d30: 6e 63 74 20 29 20 45 78 70 72 53 65 74 50 72 6f  nct ) ExprSetPro
7d40: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 44  perty(pNew, EP_D
7d50: 69 73 74 69 6e 63 74 29 3b 0a 20 20 72 65 74 75  istinct);.  retu
7d60: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
7d70: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
7d80: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
7d90: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
7da0: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
7db0: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
7dc0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
7dd0: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
7de0: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
7df0: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
7e00: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
7e10: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
7e20: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
7e30: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
7e40: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
7e50: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
7e60: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
7e70: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
7e80: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
7e90: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 69 67 20   is not too big 
7ea0: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
7eb0: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
7ec0: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
7ed0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
7ee0: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
7ef0: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
7f00: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
7f10: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c  the form ":aaa",
7f20: 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61   "@aaa", or "$aa
7f30: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
7f40: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
7f50: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
7f60: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
7f70: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
7f80: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
7f90: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
7fa0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
7fb0: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
7fc0: 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69   sequential vari
7fd0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
7fe0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
7ff0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
8000: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
8010: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
8020: 70 72 20 2a 70 45 78 70 72 2c 20 75 33 32 20 6e  pr *pExpr, u32 n
8030: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
8040: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
8060: 20 20 79 6e 56 61 72 20 78 3b 0a 0a 20 20 69 66    ynVar x;..  if
8070: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
8080: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21  urn;.  assert( !
8090: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
80a0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
80b0: 75 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50  ue|EP_Reduced|EP
80c0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20  _TokenOnly) );. 
80d0: 20 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54   z = pExpr->u.zT
80e0: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
80f0: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
8100: 28 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61  ( z[0]!=0 );.  a
8110: 73 73 65 72 74 28 20 6e 3d 3d 28 75 33 32 29 73  ssert( n==(u32)s
8120: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8130: 29 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  ) );.  if( z[1]=
8140: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
8150: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
8160: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
8170: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
8180: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
8190: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
81a0: 20 29 3b 0a 20 20 20 20 78 20 3d 20 28 79 6e 56   );.    x = (ynV
81b0: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
81c0: 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ar);.  }else{.  
81d0: 20 20 69 6e 74 20 64 6f 41 64 64 20 3d 20 30 3b    int doAdd = 0;
81e0: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
81f0: 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  ?' ){.      /* W
8200: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
8210: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
8220: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
8230: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
8240: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
8250: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
8260: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ber */.      i64
8270: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   i;.      int bO
8280: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  k;.      if( n==
8290: 32 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  2 ){ /*OPTIMIZAT
82a0: 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20  ION-IF-TRUE*/.  
82b0: 20 20 20 20 20 20 69 20 3d 20 7a 5b 31 5d 2d 27        i = z[1]-'
82c0: 30 27 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  0';  /* The comm
82d0: 6f 6e 20 63 61 73 65 20 6f 66 20 3f 4e 20 66 6f  on case of ?N fo
82e0: 72 20 61 20 73 69 6e 67 6c 65 20 64 69 67 69 74  r a single digit
82f0: 20 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f   N */.        bO
8300: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  k = 1;.      }el
8310: 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20  se{.        bOk 
8320: 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  = 0==sqlite3Atoi
8330: 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d  64(&z[1], &i, n-
8340: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  1, SQLITE_UTF8);
8350: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
8360: 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b  estcase( i==0 );
8370: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8380: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74   i==1 );.      t
8390: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
83a0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
83b0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
83c0: 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20  BER]-1 );.      
83d0: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
83e0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
83f0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
8400: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69  MBER] );.      i
8410: 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31  f( bOk==0 || i<1
8420: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
8430: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
8440: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
8450: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8460: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8470: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
8480: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
8490: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
84b0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
84c0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
84d0: 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  BER]);.        r
84e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
84f0: 20 20 20 20 20 78 20 3d 20 28 79 6e 56 61 72 29       x = (ynVar)
8500: 69 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  i;.      if( x>p
8510: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
8520: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
8530: 56 61 72 20 3d 20 28 69 6e 74 29 78 3b 0a 20 20  Var = (int)x;.  
8540: 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20 31 3b        doAdd = 1;
8550: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8560: 20 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d   sqlite3VListNum
8570: 54 6f 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 70  ToName(pParse->p
8580: 56 4c 69 73 74 2c 20 78 29 3d 3d 30 20 29 7b 0a  VList, x)==0 ){.
8590: 20 20 20 20 20 20 20 20 64 6f 41 64 64 20 3d 20          doAdd = 
85a0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
85b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
85c0: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
85d0: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
85e0: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
85f0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
8600: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
8610: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
8620: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
8630: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
8640: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
8650: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
8660: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
8670: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
8680: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
8690: 20 20 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20     */.      x = 
86a0: 28 79 6e 56 61 72 29 73 71 6c 69 74 65 33 56 4c  (ynVar)sqlite3VL
86b0: 69 73 74 4e 61 6d 65 54 6f 4e 75 6d 28 70 50 61  istNameToNum(pPa
86c0: 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 7a 2c 20  rse->pVList, z, 
86d0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3d  n);.      if( x=
86e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20  =0 ){.        x 
86f0: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
8700: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 20  se->nVar);.     
8710: 20 20 20 64 6f 41 64 64 20 3d 20 31 3b 0a 20 20     doAdd = 1;.  
8720: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8730: 69 66 28 20 64 6f 41 64 64 20 29 7b 0a 20 20 20  if( doAdd ){.   
8740: 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
8750: 74 20 3d 20 73 71 6c 69 74 65 33 56 4c 69 73 74  t = sqlite3VList
8760: 41 64 64 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  Add(db, pParse->
8770: 70 56 4c 69 73 74 2c 20 7a 2c 20 6e 2c 20 78 29  pVList, z, n, x)
8780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
8790: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78  xpr->iColumn = x
87a0: 3b 0a 20 20 69 66 28 20 78 3e 64 62 2d 3e 61 4c  ;.  if( x>db->aL
87b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
87c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
87d0: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
87e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
87f0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
8800: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
8810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
8820: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
8830: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
8840: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
8850: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
8860: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8870: 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eNN(sqlite3 *db,
8880: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73   Expr *p){.  ass
8890: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f  ert( p!=0 );.  /
88a0: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
88b0: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
88c0: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
88d0: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
88e0: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
88f0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
8900: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
8910: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
8920: 75 65 3e 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65  ue>=0 );..  asse
8930: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
8940: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
8950: 6e 63 29 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e  nc) || p->y.pWin
8960: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
8970: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73  cFailed );.  ass
8980: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46  ert( p->op!=TK_F
8990: 55 4e 43 54 49 4f 4e 20 7c 7c 20 45 78 70 72 48  UNCTION || ExprH
89a0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
89b0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
89c0: 64 75 63 65 64 29 0a 20 20 20 20 20 20 20 20 20  duced).         
89d0: 20 7c 7c 20 70 2d 3e 79 2e 70 57 69 6e 3d 3d 30   || p->y.pWin==0
89e0: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
89f0: 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e  rty(p, EP_WinFun
8a00: 63 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  c) );.#ifdef SQL
8a10: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
8a20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8a30: 70 2c 20 45 50 5f 4c 65 61 66 29 20 26 26 20 21  p, EP_Leaf) && !
8a40: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8a50: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
8a60: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8a70: 70 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20  p->pLeft==0 );. 
8a80: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
8a90: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ight==0 );.    a
8aa0: 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 53 65 6c  ssert( p->x.pSel
8ab0: 65 63 74 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  ect==0 );.  }.#e
8ac0: 6e 64 69 66 0a 20 20 69 66 28 20 21 45 78 70 72  ndif.  if( !Expr
8ad0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 28  HasProperty(p, (
8ae0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
8af0: 4c 65 61 66 29 29 20 29 7b 0a 20 20 20 20 2f 2a  Leaf)) ){.    /*
8b00: 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f   The Expr.x unio
8b10: 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  n is never used 
8b20: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
8b30: 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20   as Expr.pRight 
8b40: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
8b50: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
8b60: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
8b70: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
8b80: 20 26 26 20 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45   && p->op!=TK_SE
8b90: 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 20 73 71  LECT_COLUMN ) sq
8ba0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8bb0: 4e 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  N(db, p->pLeft);
8bc0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67  .    if( p->pRig
8bd0: 68 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ht ){.      asse
8be0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
8bf0: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
8c00: 6e 63 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  nc) );.      sql
8c10: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e  ite3ExprDeleteNN
8c20: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
8c30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 45  .    }else if( E
8c40: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8c50: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
8c60: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
8c70: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
8c80: 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  y(p, EP_WinFunc)
8c90: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
8ca0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
8cb0: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
8cc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8cd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8ce0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78  tDelete(db, p->x
8cf0: 2e 70 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65 66  .pList);.#ifndef
8d00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
8d10: 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69 66  DOWFUNC.      if
8d20: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
8d30: 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  y(p, EP_WinFunc)
8d40: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8d50: 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28  te3WindowDelete(
8d60: 64 62 2c 20 70 2d 3e 79 2e 70 57 69 6e 29 3b 0a  db, p->y.pWin);.
8d70: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
8d80: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 45     }.  }.  if( E
8d90: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8da0: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
8db0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8dc0: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
8dd0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
8de0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74  roperty(p, EP_St
8df0: 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c  atic) ){.    sql
8e00: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
8e10: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20   p);.  }.}.void 
8e20: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8e30: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  e(sqlite3 *db, E
8e40: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
8e50: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
8e60: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  leteNN(db, p);.}
8e70: 0a 0a 2f 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69  ../* Invoke sqli
8e80: 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d  te3RenameExprUnm
8e90: 61 70 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  ap() and sqlite3
8ea0: 45 78 70 72 44 65 6c 65 74 65 28 29 20 6f 6e 20  ExprDelete() on 
8eb0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
8ec0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8ed0: 65 33 45 78 70 72 55 6e 6d 61 70 41 6e 64 44 65  e3ExprUnmapAndDe
8ee0: 6c 65 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  lete(Parse *pPar
8ef0: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
8f00: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
8f10: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
8f20: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
8f30: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
8f40: 70 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  p(pParse, p);.  
8f50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
8f60: 78 70 72 44 65 6c 65 74 65 4e 4e 28 70 50 61 72  xprDeleteNN(pPar
8f70: 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  se->db, p);.  }.
8f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8f90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
8fa0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
8fb0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
8fc0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
8fd0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
8fe0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
8ff0: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
9000: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
9010: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
9020: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
9030: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
9040: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
9050: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
9060: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
9070: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9080: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
9090: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
90a0: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
90b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
90c0: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
90d0: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
90e0: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
90f0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
9100: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70  }../*.** The dup
9110: 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f  edExpr*Size() ro
9120: 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75  utines each retu
9130: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
9140: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a   bytes required.
9150: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f  ** to store a co
9160: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
9170: 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f  ion or expressio
9180: 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69  n tree.  They di
9190: 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d  ffer in.** how m
91a0: 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  uch of the tree 
91b0: 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a  is measured..**.
91c0: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
91d0: 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20  StructSize()    
91e0: 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68   Size of only th
91f0: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
9200: 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78   .**     dupedEx
9210: 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20  prNodeSize()    
9220: 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20     Size of Expr 
9230: 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65  + space for toke
9240: 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  n.**     dupedEx
9250: 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20  prSize()        
9260: 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20     Expr + token 
9270: 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e  + subtree compon
9280: 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ents.**.********
9290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92d0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75  ***.**.** The du
92e0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
92f0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  e() function ret
9300: 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20  urns two values 
9310: 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20  OR-ed together: 
9320: 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61   .** (1) the spa
9330: 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
9340: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
9350: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c  pr structure onl
9360: 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68  y and .** (2) th
9370: 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74  e EP_xxx flags t
9380: 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61  hat indicate wha
9390: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
93a0: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a  size should be..
93b0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
93c0: 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f  lues is always o
93d0: 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
93e0: 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a    EXPR_FULLSIZE.
93f0: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44  **      EXPR_RED
9400: 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f  UCEDSIZE   | EP_
9410: 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20  Reduced.**      
9420: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
9430: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
9440: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  y.**.** The size
9450: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
9460: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  e can be found b
9470: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65  y masking the re
9480: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  turn value.** of
9490: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
94a0: 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66  th 0xfff.  The f
94b0: 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  lags can be foun
94c0: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
94d0: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
94e0: 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64   with EP_Reduced
94f0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a  |EP_TokenOnly..*
9500: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
9510: 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  ith flags==EXPRD
9520: 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20  UP_REDUCE, this 
9530: 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f  routines works o
9540: 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28  n full-size.** (
9550: 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20  unreduced) Expr 
9560: 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20  objects as they 
9570: 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  or originally co
9580: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
9590: 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69   parser..** Duri
95a0: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
95b0: 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e  alysis, extra in
95c0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d  formation is com
95d0: 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20  puted and moved 
95e0: 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61  into.** later pa
95f0: 72 74 73 20 6f 66 20 74 68 65 20 45 78 70 72 20  rts of the Expr 
9600: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
9610: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
9620: 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70  n might get chop
9630: 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68  ped.** off if th
9640: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9650: 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61  reduced.  Note a
9660: 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  lso that it does
9670: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20   not work to.** 
9680: 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f  make an EXPRDUP_
9690: 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61  REDUCE copy of a
96a0: 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73   reduced express
96b0: 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ion.  It is only
96c0: 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64   legal.** to red
96d0: 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65  uce a pristine e
96e0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66  xpression tree f
96f0: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20  rom the parser. 
9700: 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
9710: 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45  ion.** of dupedE
9720: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
9730: 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65  contain multiple
9740: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
9750: 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70  ents that attemp
9760: 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20  t.** to enforce 
9770: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
9780: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9790: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
97a0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
97b0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53  flags){.  int nS
97c0: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ize;.  assert( f
97d0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
97e0: 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30  DUCE || flags==0
97f0: 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20   ); /* Only one 
9800: 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77  flag value allow
9810: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
9820: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30  EXPR_FULLSIZE<=0
9830: 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74  xfff );.  assert
9840: 28 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52  ( (0xfff & (EP_R
9850: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
9860: 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66  nly))==0 );.  if
9870: 28 20 30 3d 3d 66 6c 61 67 73 20 7c 7c 20 70 2d  ( 0==flags || p-
9880: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f 43  >op==TK_SELECT_C
9890: 4f 4c 55 4d 4e 20 0a 23 69 66 6e 64 65 66 20 53  OLUMN .#ifndef S
98a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
98b0: 57 46 55 4e 43 0a 20 20 20 7c 7c 20 45 78 70 72  WFUNC.   || Expr
98c0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
98d0: 50 5f 57 69 6e 46 75 6e 63 29 0a 23 65 6e 64 69  P_WinFunc).#endi
98e0: 66 0a 20 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  f.  ){.    nSize
98f0: 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45   = EXPR_FULLSIZE
9900: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
9910: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
9920: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
9930: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
9940: 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ed) );.    asser
9950: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
9960: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
9970: 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65  in) ); .    asse
9980: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9990: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
99a0: 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ken) );.    asse
99b0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
99c0: 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64  erty(p, EP_NoRed
99d0: 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20  uce) );.    if( 
99e0: 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78  p->pLeft || p->x
99f0: 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  .pList ){.      
9a00: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44  nSize = EXPR_RED
9a10: 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65  UCEDSIZE | EP_Re
9a20: 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65  duced;.    }else
9a30: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9a40: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
9a50: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58        nSize = EX
9a60: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
9a70: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b   | EP_TokenOnly;
9a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9a90: 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  urn nSize;.}../*
9aa0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9ab0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 70  n returns the sp
9ac0: 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71  ace in bytes req
9ad0: 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
9ae0: 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74  he copy .** of t
9af0: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
9b00: 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  e and a copy of 
9b10: 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65  the Expr.u.zToke
9b20: 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68 61  n string (if tha
9b30: 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64  t.** string is d
9b40: 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74  efined.).*/.stat
9b50: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
9b60: 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70  NodeSize(Expr *p
9b70: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
9b80: 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65  int nByte = dupe
9b90: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
9ba0: 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66 66  p, flags) & 0xff
9bb0: 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  f;.  if( !ExprHa
9bc0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
9bd0: 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e  IntValue) && p->
9be0: 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
9bf0: 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
9c00: 53 74 72 6c 65 6e 33 30 4e 4e 28 70 2d 3e 75 2e  Strlen30NN(p->u.
9c10: 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20  zToken)+1;.  }. 
9c20: 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e   return ROUND8(n
9c30: 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Byte);.}../*.** 
9c40: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
9c50: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
9c60: 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  red to create a 
9c70: 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65  duplicate of the
9c80: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20   .** expression 
9c90: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
9ca0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
9cb0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
9cc0: 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63  t is a.** mask c
9cd0: 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55  ontaining EXPRDU
9ce0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a  P_XXX flags..**.
9cf0: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
9d00: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73  urned includes s
9d10: 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61  pace to create a
9d20: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
9d30: 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65  r struct.** itse
9d40: 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65  lf and the buffe
9d50: 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79  r referred to by
9d60: 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20   Expr.u.zToken, 
9d70: 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  if any..**.** If
9d80: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
9d90: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
9da0: 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
9db0: 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20   value includes 
9dc0: 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70  .** space to dup
9dd0: 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20  licate all Expr 
9de0: 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65  nodes in the tre
9df0: 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72  e formed by Expr
9e00: 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45  .pLeft .** and E
9e10: 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61  xpr.pRight varia
9e20: 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f  bles (but not fo
9e30: 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73  r any structures
9e40: 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a   pointed to or .
9e50: 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f  ** descended fro
9e60: 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69  m the Expr.x.pLi
9e70: 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65  st or Expr.x.pSe
9e80: 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e  lect variables).
9e90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9ea0: 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70  upedExprSize(Exp
9eb0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
9ec0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
9ed0: 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
9ee0: 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45    nByte = dupedE
9ef0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
9f00: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66  lags);.    if( f
9f10: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
9f20: 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79  UCE ){.      nBy
9f30: 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53  te += dupedExprS
9f40: 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c  ize(p->pLeft, fl
9f50: 61 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72  ags) + dupedExpr
9f60: 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20  Size(p->pRight, 
9f70: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
9f80: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65  }.  return nByte
9f90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9fa0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
9fb0: 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78  lar to sqlite3Ex
9fc0: 70 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20  prDup(), except 
9fd0: 74 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72  that if pzBuffer
9fe0: 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   .** is not NULL
9ff0: 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20   then *pzBuffer 
a000: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f  is assumed to po
a010: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
a020: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a  large enough .**
a030: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
a040: 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  py of expression
a050: 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f   p, the copies o
a060: 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a  f p->u.zToken.**
a070: 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29   (if applicable)
a080: 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73  , and the copies
a090: 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74   of the p->pLeft
a0a0: 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65   and p->pRight e
a0b0: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69  xpressions,.** i
a0c0: 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65  f any. Before re
a0d0: 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66  turning, *pzBuff
a0e0: 65 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  er is set to the
a0f0: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
a100: 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20   the.** portion 
a110: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  of the buffer co
a120: 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69  pied into by thi
a130: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
a140: 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72  tatic Expr *expr
a150: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
a160: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 64 75   Expr *p, int du
a170: 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42  pFlags, u8 **pzB
a180: 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a  uffer){.  Expr *
a190: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
a1a0: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
a1b0: 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c  rn */.  u8 *zAll
a1c0: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  oc;           /*
a1d0: 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 66 72   Memory space fr
a1e0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 75 69 6c  om which to buil
a1f0: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f  d Expr object */
a200: 0a 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61  .  u32 staticFla
a210: 67 3b 20 20 20 20 20 20 20 2f 2a 20 45 50 5f 53  g;       /* EP_S
a220: 74 61 74 69 63 20 69 66 20 73 70 61 63 65 20 6e  tatic if space n
a230: 6f 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ot obtained from
a240: 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73   malloc */..  as
a250: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
a260: 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20   assert( p );.  
a270: 61 73 73 65 72 74 28 20 64 75 70 46 6c 61 67 73  assert( dupFlags
a280: 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d  ==0 || dupFlags=
a290: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
a2a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 42  );.  assert( pzB
a2b0: 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46  uffer==0 || dupF
a2c0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
a2d0: 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  DUCE );..  /* Fi
a2e0: 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74  gure out where t
a2f0: 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20  o write the new 
a300: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20  Expr structure. 
a310: 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75 66 66 65  */.  if( pzBuffe
a320: 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20  r ){.    zAlloc 
a330: 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20  = *pzBuffer;.   
a340: 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50   staticFlag = EP
a350: 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65  _Static;.  }else
a360: 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73  {.    zAlloc = s
a370: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
a380: 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45 78 70  wNN(db, dupedExp
a390: 72 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67  rSize(p, dupFlag
a3a0: 73 29 29 3b 0a 20 20 20 20 73 74 61 74 69 63 46  s));.    staticF
a3b0: 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  lag = 0;.  }.  p
a3c0: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
a3d0: 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65  lloc;..  if( pNe
a3e0: 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20  w ){.    /* Set 
a3f0: 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20  nNewSize to the 
a400: 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  size allocated f
a410: 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65  or the structure
a420: 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20   pointed to.    
a430: 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73  ** by pNew. This
a440: 20 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f   is either EXPR_
a450: 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52  FULLSIZE, EXPR_R
a460: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20  EDUCEDSIZE or.  
a470: 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f    ** EXPR_TOKENO
a480: 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20  NLYSIZE. nToken 
a490: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
a4a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f  mber of bytes co
a4b0: 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79  nsumed.    ** by
a4c0: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
a4d0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72   p->u.zToken str
a4e0: 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  ing (if any)..  
a4f0: 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75    */.    const u
a500: 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53  nsigned nStructS
a510: 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  ize = dupedExprS
a520: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 64 75 70  tructSize(p, dup
a530: 46 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73  Flags);.    cons
a540: 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d  t int nNewSize =
a550: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 30   nStructSize & 0
a560: 78 66 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54  xfff;.    int nT
a570: 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 21 45  oken;.    if( !E
a580: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a590: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
a5a0: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
a5b0: 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20  .      nToken = 
a5c0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
a5d0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31  p->u.zToken) + 1
a5e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a5f0: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20     nToken = 0;. 
a600: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 75 70     }.    if( dup
a610: 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 61  Flags ){.      a
a620: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
a630: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
a640: 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20  uced)==0 );.    
a650: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
a660: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
a670: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a680: 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75 33 32  u32 nSize = (u32
a690: 29 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  )exprStructSize(
a6a0: 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  p);.      memcpy
a6b0: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a  (zAlloc, p, nSiz
a6c0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53  e);.      if( nS
a6d0: 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a  ize<EXPR_FULLSIZ
a6e0: 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d 65  E ){ .        me
a6f0: 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69  mset(&zAlloc[nSi
a700: 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c  ze], 0, EXPR_FUL
a710: 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20  LSIZE-nSize);.  
a720: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a730: 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52   /* Set the EP_R
a740: 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e  educed, EP_Token
a750: 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61  Only, and EP_Sta
a760: 74 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70  tic flags approp
a770: 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20  riately. */.    
a780: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pNew->flags &= ~
a790: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
a7a0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74  okenOnly|EP_Stat
a7b0: 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b  ic|EP_MemToken);
a7c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
a7d0: 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20   |= nStructSize 
a7e0: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
a7f0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20  _TokenOnly);.   
a800: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
a810: 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20  staticFlag;..   
a820: 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e   /* Copy the p->
a830: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c  u.zToken string,
a840: 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
a850: 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( nToken ){.  
a860: 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e      char *zToken
a870: 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65   = pNew->u.zToke
a880: 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c  n = (char*)&zAll
a890: 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20  oc[nNewSize];.  
a8a0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65      memcpy(zToke
a8b0: 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  n, p->u.zToken, 
a8c0: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a  nToken);.    }..
a8d0: 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e      if( 0==((p->
a8e0: 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67  flags|pNew->flag
a8f0: 73 29 20 26 20 28 45 50 5f 54 6f 6b 65 6e 4f 6e  s) & (EP_TokenOn
a900: 6c 79 7c 45 50 5f 4c 65 61 66 29 29 20 29 7b 0a  ly|EP_Leaf)) ){.
a910: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
a920: 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65   the pNew->x.pSe
a930: 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e  lect or pNew->x.
a940: 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f  pList member. */
a950: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
a960: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
a970: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
a980: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
a990: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
a9a0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
a9b0: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 64 75 70 46  >x.pSelect, dupF
a9c0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lags);.      }el
a9d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
a9e0: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69  ->x.pList = sqli
a9f0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
aa00: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 64  b, p->x.pList, d
aa10: 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  upFlags);.      
aa20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
aa30: 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c  Fill in pNew->pL
aa40: 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52  eft and pNew->pR
aa50: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ight. */.    if(
aa60: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
aa70: 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65  (pNew, EP_Reduce
aa80: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  d|EP_TokenOnly|E
aa90: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
aaa0: 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75      zAlloc += du
aab0: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
aac0: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
aad0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
aae0: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
aaf0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 4c  P_TokenOnly|EP_L
ab00: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
ab10: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
ab20: 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20  >pLeft ?.       
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
ab40: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
ab50: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
ab60: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20  UCE, &zAlloc) : 
ab70: 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
ab80: 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69  >pRight = p->pRi
ab90: 67 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20  ght ?.          
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
abb0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
abc0: 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ht, EXPRDUP_REDU
abd0: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
abe0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
abf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
ac00: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69  NDOWFUNC.      i
ac10: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
ac20: 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63  ty(p, EP_WinFunc
ac30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
ac40: 77 2d 3e 79 2e 70 57 69 6e 20 3d 20 73 71 6c 69  w->y.pWin = sqli
ac50: 74 65 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c  te3WindowDup(db,
ac60: 20 70 4e 65 77 2c 20 70 2d 3e 79 2e 70 57 69 6e   pNew, p->y.pWin
ac70: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
ac80: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
ac90: 74 79 28 70 4e 65 77 2c 20 45 50 5f 57 69 6e 46  ty(pNew, EP_WinF
aca0: 75 6e 63 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a  unc) );.      }.
acb0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
acc0: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
acd0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 7a   */.      if( pz
ace0: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
acf0: 20 20 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41    *pzBuffer = zA
ad00: 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lloc;.      }.  
ad10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
ad20: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
ad30: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
ad40: 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20 29 7b 0a  nly|EP_Leaf) ){.
ad50: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
ad60: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 5f  ->op==TK_SELECT_
ad70: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
ad80: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
ad90: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
ada0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
adb0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 70  >iColumn==0 || p
adc0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
add0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ade0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 20 7c   p->pRight==0  |
adf0: 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 70 2d 3e  | p->pRight==p->
ae00: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 20  pLeft );.       
ae10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ae20: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
ae30: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
ae40: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
ae50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ae60: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
ae70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
ae80: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
ae90: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
aea0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
aeb0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
aec0: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
aed0: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
aee0: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
aef0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
af00: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
af10: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
af20: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
af30: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
af40: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
af50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
af60: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
af70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
af80: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
af90: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
afa0: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
afb0: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
afc0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
afd0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
afe0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
aff0: 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   + sizeof(p->a[0
b000: 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29  ]) * (p->nCte-1)
b010: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
b020: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
b030: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
b040: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
b050: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
b060: 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e  pRet->nCte = p->
b070: 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  nCte;.      for(
b080: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
b090: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52  i++){.        pR
b0a0: 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  et->a[i].pSelect
b0b0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
b0c0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
b0d0: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
b0e0: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
b0f0: 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45  pCols = sqlite3E
b100: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
b110: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29  ->a[i].pCols, 0)
b120: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
b130: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
b140: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b150: 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b   p->a[i].zName);
b160: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b170: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
b180: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
b190: 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29 20  ne withDup(x,y) 
b1a0: 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  0.#endif..#ifnde
b1b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
b1c0: 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 54  NDOWFUNC./*.** T
b1d0: 68 65 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  he gatherSelectW
b1e0: 69 6e 64 6f 77 73 28 29 20 70 72 6f 63 65 64 75  indows() procedu
b1f0: 72 65 20 61 6e 64 20 69 74 73 20 68 65 6c 70 65  re and its helpe
b200: 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 67 61 74  r routine.** gat
b210: 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73  herSelectWindows
b220: 43 61 6c 6c 62 61 63 6b 28 29 20 61 72 65 20 75  Callback() are u
b230: 73 65 64 20 74 6f 20 73 63 61 6e 20 61 6c 6c 20  sed to scan all 
b240: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
b250: 2a 2a 20 61 6e 20 61 20 6e 65 77 6c 79 20 64 75  ** an a newly du
b260: 70 6c 69 63 61 74 65 64 20 53 45 4c 45 43 54 20  plicated SELECT 
b270: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 67 61  statement and ga
b280: 74 68 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  ther all of the 
b290: 57 69 6e 64 6f 77 0a 2a 2a 20 6f 62 6a 65 63 74  Window.** object
b2a0: 73 20 66 6f 75 6e 64 20 74 68 65 72 65 2c 20 61  s found there, a
b2b0: 73 73 65 6d 62 6c 69 6e 67 20 74 68 65 6d 20 6f  ssembling them o
b2c0: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
b2d0: 69 73 74 20 61 74 20 53 65 6c 65 63 74 2d 3e 70  ist at Select->p
b2e0: 57 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Win..*/.static i
b2f0: 6e 74 20 67 61 74 68 65 72 53 65 6c 65 63 74 57  nt gatherSelectW
b300: 69 6e 64 6f 77 73 43 61 6c 6c 62 61 63 6b 28 57  indowsCallback(W
b310: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
b320: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
b330: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
b340: 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 45 78  K_FUNCTION && Ex
b350: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
b360: 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  xpr, EP_WinFunc)
b370: 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
b380: 70 53 65 6c 65 63 74 20 3d 20 70 57 61 6c 6b 65  pSelect = pWalke
b390: 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->u.pSelect;.  
b3a0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d    Window *pWin =
b3b0: 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 3b 0a   pExpr->y.pWin;.
b3c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
b3d0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
b3e0: 49 73 57 69 6e 64 6f 77 46 75 6e 63 28 70 45 78  IsWindowFunc(pEx
b3f0: 70 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pr) );.    asser
b400: 74 28 20 70 57 69 6e 2d 3e 70 70 54 68 69 73 3d  t( pWin->ppThis=
b410: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
b420: 33 57 69 6e 64 6f 77 4c 69 6e 6b 28 70 53 65 6c  3WindowLink(pSel
b430: 65 63 74 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a  ect, pWin);.  }.
b440: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
b450: 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
b460: 69 6e 74 20 67 61 74 68 65 72 53 65 6c 65 63 74  int gatherSelect
b470: 57 69 6e 64 6f 77 73 53 65 6c 65 63 74 43 61 6c  WindowsSelectCal
b480: 6c 62 61 63 6b 28 57 61 6c 6b 65 72 20 2a 70 57  lback(Walker *pW
b490: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
b4a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d 70  ){.  return p==p
b4b0: 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63  Walker->u.pSelec
b4c0: 74 20 3f 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  t ? WRC_Continue
b4d0: 20 3a 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a   : WRC_Prune;.}.
b4e0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 61 74 68  static void gath
b4f0: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 28  erSelectWindows(
b500: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61  Select *p){.  Wa
b510: 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
b520: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 67 61 74 68  rCallback = gath
b530: 65 72 53 65 6c 65 63 74 57 69 6e 64 6f 77 73 43  erSelectWindowsC
b540: 61 6c 6c 62 61 63 6b 3b 0a 20 20 77 2e 78 53 65  allback;.  w.xSe
b550: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 67  lectCallback = g
b560: 61 74 68 65 72 53 65 6c 65 63 74 57 69 6e 64 6f  atherSelectWindo
b570: 77 73 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  wsSelectCallback
b580: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
b590: 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e  lback2 = 0;.  w.
b5a0: 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 77 2e  pParse = 0;.  w.
b5b0: 75 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20  u.pSelect = p;. 
b5c0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
b5d0: 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 23 65 6e  ct(&w, p);.}.#en
b5e0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
b5f0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
b600: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
b610: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
b620: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
b630: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
b640: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
b650: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
b660: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
b670: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
b680: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
b690: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
b6a0: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
b6b0: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
b6c0: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
b6d0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
b6e0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
b6f0: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
b700: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
b710: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
b720: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
b730: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
b740: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
b750: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
b760: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
b770: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
b780: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
b790: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
b7a0: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
b7b0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
b7c0: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
b7d0: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
b7e0: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
b7f0: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
b800: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
b810: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
b820: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
b830: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
b840: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
b850: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
b860: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
b870: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
b880: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
b890: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
b8a0: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
b8b0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
b8c0: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
b8d0: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
b8e0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
b8f0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
b900: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
b910: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
b920: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
b930: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
b940: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
b950: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
b960: 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  || flags==EXPRDU
b970: 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65  P_REDUCE );.  re
b980: 74 75 72 6e 20 70 20 3f 20 65 78 70 72 44 75 70  turn p ? exprDup
b990: 28 64 62 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30  (db, p, flags, 0
b9a0: 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72 4c 69 73  ) : 0;.}.ExprLis
b9b0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
b9c0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
b9d0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  b, ExprList *p, 
b9e0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78  int flags){.  Ex
b9f0: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
ba00: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
ba10: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
ba20: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
ba30: 0a 20 20 45 78 70 72 20 2a 70 50 72 69 6f 72 53  .  Expr *pPriorS
ba40: 65 6c 65 63 74 43 6f 6c 20 3d 20 30 3b 0a 20 20  electCol = 0;.  
ba50: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
ba60: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
ba70: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
ba80: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
ba90: 52 61 77 4e 4e 28 64 62 2c 20 73 71 6c 69 74 65  RawNN(db, sqlite
baa0: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
bab0: 2c 20 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  , p));.  if( pNe
bac0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
bad0: 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d  .  pNew->nExpr =
bae0: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 74   p->nExpr;.  pIt
baf0: 65 6d 20 3d 20 70 4e 65 77 2d 3e 61 3b 0a 20 20  em = pNew->a;.  
bb00: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
bb10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
bb20: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
bb30: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
bb40: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c  ){.    Expr *pOl
bb50: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
bb60: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ->pExpr;.    Exp
bb70: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
bb80: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
bb90: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
bba0: 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61  b, pOldExpr, fla
bbb0: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  gs);.    if( pOl
bbc0: 64 45 78 70 72 20 0a 20 20 20 20 20 26 26 20 70  dExpr .     && p
bbd0: 4f 6c 64 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  OldExpr->op==TK_
bbe0: 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 0a 20 20  SELECT_COLUMN.  
bbf0: 20 20 20 26 26 20 28 70 4e 65 77 45 78 70 72 20     && (pNewExpr 
bc00: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 21  = pItem->pExpr)!
bc10: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
bc20: 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70   assert( pNewExp
bc30: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c  r->iColumn==0 ||
bc40: 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66   i>0 );.      if
bc50: 28 20 70 4e 65 77 45 78 70 72 2d 3e 69 43 6f 6c  ( pNewExpr->iCol
bc60: 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
bc70: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 45 78    assert( pOldEx
bc80: 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 4f 6c 64 45  pr->pLeft==pOldE
bc90: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 3b 0a 20  xpr->pRight );. 
bca0: 20 20 20 20 20 20 20 70 50 72 69 6f 72 53 65 6c         pPriorSel
bcb0: 65 63 74 43 6f 6c 20 3d 20 70 4e 65 77 45 78 70  ectCol = pNewExp
bcc0: 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 45  r->pLeft = pNewE
bcd0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
bce0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bcf0: 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
bd00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
bd10: 20 70 49 74 65 6d 5b 2d 31 5d 2e 70 45 78 70 72   pItem[-1].pExpr
bd20: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
bd30: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 2d  ssert( pNewExpr-
bd40: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 74 65 6d 5b  >iColumn==pItem[
bd50: 2d 31 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75  -1].pExpr->iColu
bd60: 6d 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  mn+1 );.        
bd70: 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 53 65  assert( pPriorSe
bd80: 6c 65 63 74 43 6f 6c 3d 3d 70 49 74 65 6d 5b 2d  lectCol==pItem[-
bd90: 31 5d 2e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  1].pExpr->pLeft 
bda0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 45  );.        pNewE
bdb0: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 50 72  xpr->pLeft = pPr
bdc0: 69 6f 72 53 65 6c 65 63 74 43 6f 6c 3b 0a 20 20  iorSelectCol;.  
bdd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
bde0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
bdf0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
be00: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
be10: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
be20: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
be30: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
be40: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
be50: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 46 6c 61    pItem->sortFla
be60: 67 73 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  gs = pOldItem->s
be70: 6f 72 74 46 6c 61 67 73 3b 0a 20 20 20 20 70 49  ortFlags;.    pI
be80: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
be90: 20 20 20 70 49 74 65 6d 2d 3e 62 4e 75 6c 6c 73     pItem->bNulls
bea0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 4e 75   = pOldItem->bNu
beb0: 6c 6c 73 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  lls;.    pItem->
bec0: 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c  bSpanIsTab = pOl
bed0: 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  dItem->bSpanIsTa
bee0: 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53  b;.    pItem->bS
bef0: 6f 72 74 65 72 52 65 66 20 3d 20 70 4f 6c 64 49  orterRef = pOldI
bf00: 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 3b  tem->bSorterRef;
bf10: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20  .    pItem->u = 
bf20: 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d  pOldItem->u;.  }
bf30: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
bf40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73  }../*.** If curs
bf50: 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76  ors, triggers, v
bf60: 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
bf70: 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74  ies are all omit
bf80: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
bf90: 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  build, then none
bfa0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
bfb0: 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65  g routines, exce
bfc0: 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  pt for .** sqlit
bfd0: 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63  e3SelectDup(), c
bfe0: 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71  an be called. sq
bff0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
c000: 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a   is sometimes.**
c010: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e   called with a N
c020: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
c030: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
c040: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
c050: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
c060: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
c070: 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28   \. || !defined(
c080: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
c090: 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73  UERY).SrcList *s
c0a0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
c0b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
c0c0: 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  cList *p, int fl
c0d0: 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  ags){.  SrcList 
c0e0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
c0f0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61    int nByte;.  a
c100: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
c110: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
c120: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
c130: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
c140: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
c150: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
c160: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
c170: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
c180: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
c190: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
c1a0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
c1b0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
c1c0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
c1d0: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
c1e0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
c1f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
c200: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
c210: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
c220: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
c230: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
c240: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
c250: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
c260: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
c270: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70  tem->pSchema = p
c280: 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61  OldItem->pSchema
c290: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
c2a0: 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
c2b0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
c2c0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pOldItem->zDatab
c2d0: 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ase);.    pNewIt
c2e0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
c2f0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
c300: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
c310: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
c320: 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
c330: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
c340: 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  dItem->zAlias);.
c350: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67      pNewItem->fg
c360: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b   = pOldItem->fg;
c370: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
c380: 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65  Cursor = pOldIte
c390: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
c3a0: 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69  pNewItem->addrFi
c3b0: 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d  llSub = pOldItem
c3c0: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20  ->addrFillSub;. 
c3d0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67     pNewItem->reg
c3e0: 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65  Return = pOldIte
c3f0: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20  m->regReturn;.  
c400: 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e    if( pNewItem->
c410: 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
c420: 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d  {.      pNewItem
c430: 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20  ->u1.zIndexedBy 
c440: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c450: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c460: 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a  u1.zIndexedBy);.
c470: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
c480: 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70  em->pIBIndex = p
c490: 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65  OldItem->pIBInde
c4a0: 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49  x;.    if( pNewI
c4b0: 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
c4c0: 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  c ){.      pNewI
c4d0: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
c4e0: 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71   = .          sq
c4f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
c500: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75  (db, pOldItem->u
c510: 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67  1.pFuncArg, flag
c520: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  s);.    }.    pT
c530: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
c540: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
c550: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
c560: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
c570: 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20  ->nTabRef++;.   
c580: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
c590: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
c5a0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
c5b0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
c5c0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
c5d0: 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73  NewItem->pOn = s
c5e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
c5f0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c  , pOldItem->pOn,
c600: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
c610: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
c620: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
c630: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
c640: 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77  Using);.    pNew
c650: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20  Item->colUsed = 
c660: 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pOldItem->colUse
c670: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  d;.  }.  return 
c680: 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a  pNew;.}.IdList *
c690: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
c6a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
c6b0: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
c6c0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
c6d0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  i;.  assert( db!
c6e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
c6f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
c700: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
c710: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
c720: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
c730: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
c740: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
c750: 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a  ->nId = p->nId;.
c760: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
c770: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
c780: 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  (db, p->nId*size
c790: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
c7a0: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
c7b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
c7c0: 46 72 65 65 4e 4e 28 64 62 2c 20 70 4e 65 77 29  FreeNN(db, pNew)
c7d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
c7e0: 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68    }.  /* Note th
c7f0: 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73  at because the s
c800: 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  ize of the alloc
c810: 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d  ation for p->a[]
c820: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63   is not.  ** nec
c830: 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72  essarily a power
c840: 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33   of two, sqlite3
c850: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d  IdListAppend() m
c860: 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ay not be called
c870: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70  .  ** on the dup
c880: 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62  licate created b
c890: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
c8a0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
c8b0: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
c8c0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
c8d0: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
c8e0: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
c8f0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
c900: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
c910: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
c920: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
c930: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c940: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
c950: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
c960: 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64  Item->idx = pOld
c970: 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20  Item->idx;.  }. 
c980: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
c990: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
c9a0: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
c9b0: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 44   *db, Select *pD
c9c0: 75 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  up, int flags){.
c9d0: 20 20 53 65 6c 65 63 74 20 2a 70 52 65 74 20 3d    Select *pRet =
c9e0: 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e   0;.  Select *pN
c9f0: 65 78 74 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63  ext = 0;.  Selec
ca00: 74 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a  t **pp = &pRet;.
ca10: 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 0a 20 20    Select *p;..  
ca20: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
ca30: 0a 20 20 66 6f 72 28 70 3d 70 44 75 70 3b 20 70  .  for(p=pDup; p
ca40: 3b 20 70 3d 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  ; p=p->pPrior){.
ca50: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
ca60: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
ca70: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
ca80: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 20 69 66  of(*p) );.    if
ca90: 28 20 70 4e 65 77 3d 3d 30 20 29 20 62 72 65 61  ( pNew==0 ) brea
caa0: 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 45 4c  k;.    pNew->pEL
cab0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
cac0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
cad0: 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a  pEList, flags);.
cae0: 20 20 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d      pNew->pSrc =
caf0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
cb00: 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20  up(db, p->pSrc, 
cb10: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
cb20: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
cb30: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
cb40: 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b  >pWhere, flags);
cb50: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  .    pNew->pGrou
cb60: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
cb70: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
cb80: 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29  pGroupBy, flags)
cb90: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 48 61 76  ;.    pNew->pHav
cba0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
cbb0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76  rDup(db, p->pHav
cbc0: 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ing, flags);.   
cbd0: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
cbe0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
cbf0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64  tDup(db, p->pOrd
cc00: 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  erBy, flags);.  
cc10: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
cc20: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e  op;.    pNew->pN
cc30: 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20  ext = pNext;.   
cc40: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
cc50: 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69  0;.    pNew->pLi
cc60: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mit = sqlite3Exp
cc70: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  rDup(db, p->pLim
cc80: 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  it, flags);.    
cc90: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
cca0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 4f 66 66  ;.    pNew->iOff
ccb0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  set = 0;.    pNe
ccc0: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  w->selFlags = p-
ccd0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f  >selFlags & ~SF_
cce0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
ccf0: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65     pNew->addrOpe
cd00: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
cd10: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65     pNew->addrOpe
cd20: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
cd30: 20 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74     pNew->nSelect
cd40: 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74  Row = p->nSelect
cd50: 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  Row;.    pNew->p
cd60: 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28 64  With = withDup(d
cd70: 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 23 69  b, p->pWith);.#i
cd80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cd90: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
cda0: 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b   pNew->pWin = 0;
cdb0: 0a 20 20 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44  .    pNew->pWinD
cdc0: 65 66 6e 20 3d 20 73 71 6c 69 74 65 33 57 69 6e  efn = sqlite3Win
cdd0: 64 6f 77 4c 69 73 74 44 75 70 28 64 62 2c 20 70  dowListDup(db, p
cde0: 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20 20 20  ->pWinDefn);.   
cdf0: 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 26 26 20   if( p->pWin && 
ce00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ce10: 3d 3d 30 20 29 20 67 61 74 68 65 72 53 65 6c 65  ==0 ) gatherSele
ce20: 63 74 57 69 6e 64 6f 77 73 28 70 4e 65 77 29 3b  ctWindows(pNew);
ce30: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 77  .#endif.    pNew
ce40: 2d 3e 73 65 6c 49 64 20 3d 20 70 2d 3e 73 65 6c  ->selId = p->sel
ce50: 49 64 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 4e  Id;.    *pp = pN
ce60: 65 77 3b 0a 20 20 20 20 70 70 20 3d 20 26 70 4e  ew;.    pp = &pN
ce70: 65 77 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  ew->pPrior;.    
ce80: 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
ce90: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
cea0: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
ceb0: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
cec0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
ced0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66  Select *p, int f
cee0: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
cef0: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
cf00: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
cf10: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
cf20: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
cf30: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
cf40: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
cf50: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
cf60: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
cf70: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
cf80: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
cf90: 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 61 72 67  ** The pList arg
cfa0: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 69  ument must be ei
cfb0: 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 70  ther NULL or a p
cfc0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 45 78 70  ointer to an Exp
cfd0: 72 4c 69 73 74 0a 2a 2a 20 6f 62 74 61 69 6e 65  rList.** obtaine
cfe0: 64 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  d from a prior c
cff0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 78  all to sqlite3Ex
d000: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 29 2e 20  prListAppend(). 
d010: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
d020: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
d030: 20 77 69 74 68 20 61 6e 20 45 78 70 72 4c 69 73   with an ExprLis
d040: 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
d050: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
d060: 75 70 28 29 2e 0a 2a 2a 20 52 65 61 73 6f 6e 3a  up()..** Reason:
d070: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
d080: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
d090: 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  number of slots 
d0a0: 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 0a 2a 2a  in pList->a[].**
d0b0: 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
d0c0: 77 6f 2e 20 20 54 68 61 74 20 69 73 20 74 72 75  wo.  That is tru
d0d0: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 45 78 70  e for sqlite3Exp
d0e0: 72 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 65  rListAppend() re
d0f0: 74 75 72 6e 73 0a 2a 2a 20 62 75 74 20 69 73 20  turns.** but is 
d100: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
d110: 74 72 75 65 20 66 72 6f 6d 20 74 68 65 20 72 65  true from the re
d120: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
d130: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
d140: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  ()..**.** If a m
d150: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
d160: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
d170: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
d180: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
d190: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
d1a0: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
d1b0: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
d1c0: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
d1d0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
d1e0: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
d1f0: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
d200: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
d210: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
d220: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
d230: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
d240: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d250: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
d260: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
d270: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
d280: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
d290: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
d2a0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
d2b0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
d2c0: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
d2d0: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
d2e0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  LL */.){.  struc
d2f0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
d300: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
d310: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d320: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
d330: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
d340: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
d350: 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
d360: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
d370: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
d380: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
d390: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
d3a0: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
d3b0: 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20     pList->nExpr 
d3c0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
d3d0: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26   (pList->nExpr &
d3e0: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31   (pList->nExpr-1
d3f0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  ))==0 ){.    Exp
d400: 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  rList *pNew;.   
d410: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
d420: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69  bRealloc(db, pLi
d430: 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 73 69  st, .         si
d440: 7a 65 6f 66 28 2a 70 4c 69 73 74 29 2b 28 32 2a  zeof(*pList)+(2*
d450: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
d460: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 2a 73  List->nExpr-1)*s
d470: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
d480: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ]));.    if( pNe
d490: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  w==0 ){.      go
d4a0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
d4b0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
d4c0: 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  w;.  }.  pItem =
d4d0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
d4e0: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 61 73  ->nExpr++];.  as
d4f0: 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 73  sert( offsetof(s
d500: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
d510: 74 65 6d 2c 7a 4e 61 6d 65 29 3d 3d 73 69 7a 65  tem,zName)==size
d520: 6f 66 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  of(pItem->pExpr)
d530: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
d540: 66 73 65 74 6f 66 28 73 74 72 75 63 74 20 45 78  fsetof(struct Ex
d550: 70 72 4c 69 73 74 5f 69 74 65 6d 2c 70 45 78 70  prList_item,pExp
d560: 72 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  r)==0 );.  memse
d570: 74 28 26 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  t(&pItem->zName,
d580: 30 2c 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  0,sizeof(*pItem)
d590: 2d 6f 66 66 73 65 74 6f 66 28 73 74 72 75 63 74  -offsetof(struct
d5a0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2c 7a   ExprList_item,z
d5b0: 4e 61 6d 65 29 29 3b 0a 20 20 70 49 74 65 6d 2d  Name));.  pItem-
d5c0: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
d5d0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
d5e0: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
d5f0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
d600: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
d610: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
d620: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
d630: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
d640: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
d650: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
d660: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
d670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d  .}../*.** pColum
d680: 6e 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72  ns and pExpr for
d690: 6d 20 61 20 76 65 63 74 6f 72 20 61 73 73 69 67  m a vector assig
d6a0: 6e 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 70  nment which is p
d6b0: 61 72 74 20 6f 66 20 74 68 65 20 53 45 54 0a 2a  art of the SET.*
d6c0: 2a 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55  * clause of an U
d6d0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
d6e0: 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
d6f0: 2a 2a 20 20 20 20 20 20 20 20 28 61 2c 62 2c 63  **        (a,b,c
d700: 29 20 3d 20 28 65 78 70 72 31 2c 65 78 70 72 32  ) = (expr1,expr2
d710: 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72 3a 20 20  ,expr3).** Or:  
d720: 20 20 28 61 2c 62 2c 63 29 20 3d 20 28 53 45 4c    (a,b,c) = (SEL
d730: 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f 4d 20 2e  ECT x,y,z FROM .
d740: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ...).**.** For e
d750: 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
d760: 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d 65 6e  vector assignmen
d770: 74 2c 20 61 70 70 65 6e 64 20 6e 65 77 20 65 6e  t, append new en
d780: 74 72 69 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  tries to the.** 
d790: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
d7a0: 70 4c 69 73 74 2e 20 20 49 6e 20 74 68 65 20 63  pList.  In the c
d7b0: 61 73 65 20 6f 66 20 61 20 73 75 62 71 75 65 72  ase of a subquer
d7c0: 79 20 6f 6e 20 74 68 65 20 52 48 53 2c 20 61 70  y on the RHS, ap
d7d0: 70 65 6e 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43  pend.** TK_SELEC
d7e0: 54 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73  T_COLUMN express
d7f0: 69 6f 6e 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  ions..*/.ExprLis
d800: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
d810: 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 0a  stAppendVector(.
d820: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d830: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
d840: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
d850: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d860: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
d870: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
d880: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
d890: 4c 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  L */.  IdList *p
d8a0: 43 6f 6c 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a  Columns,      /*
d8b0: 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f   List of names o
d8c0: 66 20 4c 48 53 20 6f 66 20 74 68 65 20 61 73 73  f LHS of the ass
d8d0: 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  ignment */.  Exp
d8e0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
d8f0: 20 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 65 78      /* Vector ex
d900: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
d910: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
d920: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
d930: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d940: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
d950: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
d960: 20 69 46 69 72 73 74 20 3d 20 70 4c 69 73 74 20   iFirst = pList 
d970: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
d980: 20 30 3b 0a 20 20 2f 2a 20 70 43 6f 6c 75 6d 6e   0;.  /* pColumn
d990: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 4e 55  s can only be NU
d9a0: 4c 4c 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d  LL due to an OOM
d9b0: 20 62 75 74 20 61 6e 20 4f 4f 4d 20 77 69 6c 6c   but an OOM will
d9c0: 20 63 61 75 73 65 20 61 6e 0a 20 20 2a 2a 20 65   cause an.  ** e
d9d0: 78 69 74 20 70 72 69 6f 72 20 74 6f 20 74 68 69  xit prior to thi
d9e0: 73 20 72 6f 75 74 69 6e 65 20 62 65 69 6e 67 20  s routine being 
d9f0: 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 69 66 28  invoked */.  if(
da00: 20 4e 45 56 45 52 28 70 43 6f 6c 75 6d 6e 73 3d   NEVER(pColumns=
da10: 3d 30 29 20 29 20 67 6f 74 6f 20 76 65 63 74 6f  =0) ) goto vecto
da20: 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a  r_append_error;.
da30: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
da40: 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61 70 70   goto vector_app
da50: 65 6e 64 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a  end_error;..  /*
da60: 20 49 66 20 74 68 65 20 52 48 53 20 69 73 20 61   If the RHS is a
da70: 20 76 65 63 74 6f 72 2c 20 74 68 65 6e 20 77 65   vector, then we
da80: 20 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79   can immediately
da90: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
daa0: 61 74 20 0a 20 20 2a 2a 20 74 68 65 20 73 69 7a  at .  ** the siz
dab0: 65 20 6f 66 20 74 68 65 20 52 48 53 20 61 6e 64  e of the RHS and
dac0: 20 4c 48 53 20 6d 61 74 63 68 2e 20 20 42 75 74   LHS match.  But
dad0: 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 61   if the RHS is a
dae0: 20 53 45 4c 45 43 54 2c 20 0a 20 20 2a 2a 20 77   SELECT, .  ** w
daf0: 69 6c 64 63 61 72 64 73 20 28 22 2a 22 29 20 69  ildcards ("*") i
db00: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
db10: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6d   of the SELECT m
db20: 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
db30: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 77 65 20 63  before.  ** we c
db40: 61 6e 20 64 6f 20 74 68 65 20 73 69 7a 65 20 63  an do the size c
db50: 68 65 63 6b 2c 20 73 6f 20 64 65 66 65 72 20 74  heck, so defer t
db60: 68 65 20 73 69 7a 65 20 63 68 65 63 6b 20 75 6e  he size check un
db70: 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
db80: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
db90: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53 45  pExpr->op!=TK_SE
dba0: 4c 45 43 54 20 26 26 20 70 43 6f 6c 75 6d 6e 73  LECT && pColumns
dbb0: 2d 3e 6e 49 64 21 3d 28 6e 3d 73 71 6c 69 74 65  ->nId!=(n=sqlite
dbc0: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
dbd0: 70 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 73  pExpr)) ){.    s
dbe0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
dbf0: 50 61 72 73 65 2c 20 22 25 64 20 63 6f 6c 75 6d  Parse, "%d colum
dc00: 6e 73 20 61 73 73 69 67 6e 65 64 20 25 64 20 76  ns assigned %d v
dc10: 61 6c 75 65 73 22 2c 0a 20 20 20 20 20 20 20 20  alues",.        
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
dc30: 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e 29 3b 0a 20  umns->nId, n);. 
dc40: 20 20 20 67 6f 74 6f 20 76 65 63 74 6f 72 5f 61     goto vector_a
dc50: 70 70 65 6e 64 5f 65 72 72 6f 72 3b 0a 20 20 7d  ppend_error;.  }
dc60: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
dc70: 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 20 69 2b  Columns->nId; i+
dc80: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 53  +){.    Expr *pS
dc90: 75 62 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ubExpr = sqlite3
dca0: 45 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65  ExprForVectorFie
dcb0: 6c 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ld(pParse, pExpr
dcc0: 2c 20 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , i);.    assert
dcd0: 28 20 70 53 75 62 45 78 70 72 21 3d 30 20 7c 7c  ( pSubExpr!=0 ||
dce0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
dcf0: 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
dd00: 20 70 53 75 62 45 78 70 72 3d 3d 30 20 7c 7c 20   pSubExpr==0 || 
dd10: 70 53 75 62 45 78 70 72 2d 3e 69 54 61 62 6c 65  pSubExpr->iTable
dd20: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
dd30: 53 75 62 45 78 70 72 3d 3d 30 20 29 20 63 6f 6e  SubExpr==0 ) con
dd40: 74 69 6e 75 65 3b 0a 20 20 20 20 70 53 75 62 45  tinue;.    pSubE
dd50: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 43  xpr->iTable = pC
dd60: 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 3b 0a 20 20 20  olumns->nId;.   
dd70: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
dd80: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
dd90: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53  Parse, pList, pS
dda0: 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ubExpr);.    if(
ddb0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
ddc0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
ddd0: 45 78 70 72 3d 3d 69 46 69 72 73 74 2b 69 2b 31  Expr==iFirst+i+1
dde0: 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   );.      pList-
ddf0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
de00: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 75  1].zName = pColu
de10: 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  mns->a[i].zName;
de20: 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 73 2d  .      pColumns-
de30: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b  >a[i].zName = 0;
de40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
de50: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
de60: 6c 65 64 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  led && pExpr->op
de70: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 41  ==TK_SELECT && A
de80: 4c 57 41 59 53 28 70 4c 69 73 74 21 3d 30 29 20  LWAYS(pList!=0) 
de90: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 46 69  ){.    Expr *pFi
dea0: 72 73 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  rst = pList->a[i
deb0: 46 69 72 73 74 5d 2e 70 45 78 70 72 3b 0a 20 20  First].pExpr;.  
dec0: 20 20 61 73 73 65 72 74 28 20 70 46 69 72 73 74    assert( pFirst
ded0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
dee0: 74 28 20 70 46 69 72 73 74 2d 3e 6f 70 3d 3d 54  t( pFirst->op==T
def0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
df00: 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 2f 2a 20  );.     .    /* 
df10: 53 74 6f 72 65 20 74 68 65 20 53 45 4c 45 43 54  Store the SELECT
df20: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 70 52   statement in pR
df30: 69 67 68 74 20 73 6f 20 69 74 20 77 69 6c 6c 20  ight so it will 
df40: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 0a  be deleted when.
df50: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78      ** sqlite3Ex
df60: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 29 20 69  prListDelete() i
df70: 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  s called */.    
df80: 70 46 69 72 73 74 2d 3e 70 52 69 67 68 74 20 3d  pFirst->pRight =
df90: 20 70 45 78 70 72 3b 0a 20 20 20 20 70 45 78 70   pExpr;.    pExp
dfa0: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52  r = 0;..    /* R
dfb0: 65 6d 65 6d 62 65 72 20 74 68 65 20 73 69 7a 65  emember the size
dfc0: 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e 20 69   of the LHS in i
dfd0: 54 61 62 6c 65 20 73 6f 20 74 68 61 74 20 77 65  Table so that we
dfe0: 20 63 61 6e 20 63 68 65 63 6b 20 74 68 61 74 0a   can check that.
dff0: 20 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 61      ** the RHS a
e000: 6e 64 20 4c 48 53 20 73 69 7a 65 73 20 6d 61 74  nd LHS sizes mat
e010: 63 68 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67  ch during code g
e020: 65 6e 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  eneration. */.  
e030: 20 20 70 46 69 72 73 74 2d 3e 69 54 61 62 6c 65    pFirst->iTable
e040: 20 3d 20 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64   = pColumns->nId
e050: 3b 0a 20 20 7d 0a 0a 76 65 63 74 6f 72 5f 61 70  ;.  }..vector_ap
e060: 70 65 6e 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71  pend_error:.  sq
e070: 6c 69 74 65 33 45 78 70 72 55 6e 6d 61 70 41 6e  lite3ExprUnmapAn
e080: 64 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20  dDelete(pParse, 
e090: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
e0a0: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
e0b0: 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72  , pColumns);.  r
e0c0: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
e0d0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f  /*.** Set the so
e0e0: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  rt order for the
e0f0: 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e   last element on
e100: 20 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c   the given ExprL
e110: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
e120: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
e130: 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73  ortOrder(ExprLis
e140: 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f  t *p, int iSortO
e150: 72 64 65 72 2c 20 69 6e 74 20 65 4e 75 6c 6c 73  rder, int eNulls
e160: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
e170: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
e180: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
e190: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
e1a0: 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 0a   p->nExpr>0 );..
e1b0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
e1c0: 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20  _SO_UNDEFINED<0 
e1d0: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  && SQLITE_SO_ASC
e1e0: 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  ==0 && SQLITE_SO
e1f0: 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73  _DESC>0 );.  ass
e200: 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d  ert( iSortOrder=
e210: 3d 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46  =SQLITE_SO_UNDEF
e220: 49 4e 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  INED .       || 
e230: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  iSortOrder==SQLI
e240: 54 45 5f 53 4f 5f 41 53 43 20 0a 20 20 20 20 20  TE_SO_ASC .     
e250: 20 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d    || iSortOrder=
e260: 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20  =SQLITE_SO_DESC 
e270: 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
e280: 65 4e 75 6c 6c 73 3d 3d 53 51 4c 49 54 45 5f 53  eNulls==SQLITE_S
e290: 4f 5f 55 4e 44 45 46 49 4e 45 44 20 0a 20 20 20  O_UNDEFINED .   
e2a0: 20 20 20 20 7c 7c 20 65 4e 75 6c 6c 73 3d 3d 53      || eNulls==S
e2b0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 0a 20 20  QLITE_SO_ASC .  
e2c0: 20 20 20 20 20 7c 7c 20 65 4e 75 6c 6c 73 3d 3d       || eNulls==
e2d0: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 0a  SQLITE_SO_DESC .
e2e0: 20 20 29 3b 0a 0a 20 20 70 49 74 65 6d 20 3d 20    );..  pItem = 
e2f0: 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31  &p->a[p->nExpr-1
e300: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ];.  assert( pIt
e310: 65 6d 2d 3e 62 4e 75 6c 6c 73 3d 3d 30 20 29 3b  em->bNulls==0 );
e320: 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65  .  if( iSortOrde
e330: 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44  r==SQLITE_SO_UND
e340: 45 46 49 4e 45 44 20 29 7b 0a 20 20 20 20 69 53  EFINED ){.    iS
e350: 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
e360: 45 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 0a 20 20  E_SO_ASC;.  }.  
e370: 70 49 74 65 6d 2d 3e 73 6f 72 74 46 6c 61 67 73  pItem->sortFlags
e380: 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65   = (u8)iSortOrde
e390: 72 3b 0a 0a 20 20 69 66 28 20 65 4e 75 6c 6c 73  r;..  if( eNulls
e3a0: 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45  !=SQLITE_SO_UNDE
e3b0: 46 49 4e 45 44 20 29 7b 0a 20 20 20 20 70 49 74  FINED ){.    pIt
e3c0: 65 6d 2d 3e 62 4e 75 6c 6c 73 20 3d 20 31 3b 0a  em->bNulls = 1;.
e3d0: 20 20 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64      if( iSortOrd
e3e0: 65 72 21 3d 65 4e 75 6c 6c 73 20 29 7b 0a 20 20  er!=eNulls ){.  
e3f0: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 46      pItem->sortF
e400: 6c 61 67 73 20 7c 3d 20 4b 45 59 49 4e 46 4f 5f  lags |= KEYINFO_
e410: 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c 3b 0a 20  ORDER_BIGNULL;. 
e420: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e430: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
e440: 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65  st.a[].zName ele
e450: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
e460: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
e470: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
e480: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
e490: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
e4a0: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
e4b0: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
e4c0: 2e 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f  .  But pName sho
e4d0: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
e4e0: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
e4f0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
e500: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
e510: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e520: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
e530: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e540: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
e550: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e560: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e570: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e580: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
e590: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
e5a0: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
e5b0: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
e5c0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
e5d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
e5e0: 6d 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  me to be added *
e5f0: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
e600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e610: 72 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65  rue to cause the
e620: 20 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75   name to be dequ
e630: 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  oted */.){.  ass
e640: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
e650: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
e660: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
e670: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
e680: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
e690: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
e6a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
e6b0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
e6c0: 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
e6d0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
e6e0: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
e6f0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
e700: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
e710: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
e720: 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e  StrNDup(pParse->
e730: 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  db, pName->z, pN
e740: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28  ame->n);.    if(
e750: 20 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74   dequote ) sqlit
e760: 65 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d  e3Dequote(pItem-
e770: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
e780: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
e790: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
e7a0: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
e7b0: 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29  (pParse, (void*)
e7c0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 4e  pItem->zName, pN
e7d0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
e7e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
e7f0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53   ExprList.a[].zS
e800: 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  pan element of t
e810: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
e820: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
e830: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
e840: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
e850: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
e860: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
e870: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53  M error.  But pS
e880: 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  pan should never
e890: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
e8a0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
e8b0: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
e8c0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
e8d0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
e8e0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
e8f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e900: 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65  SetSpan(.  Parse
e910: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e920: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e930: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
e940: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
e950: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
e960: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
e970: 70 61 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  pan. */.  const 
e980: 63 68 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20  char *zStart,   
e990: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68    /* Start of th
e9a0: 65 20 73 70 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73  e span */.  cons
e9b0: 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 20 20  t char *zEnd    
e9c0: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
e9d0: 65 20 73 70 61 6e 20 2a 2f 0a 29 7b 0a 20 20 73  e span */.){.  s
e9e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e9f0: 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
ea00: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64  t( pList!=0 || d
ea10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
ea20: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
ea30: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
ea40: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
ea50: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
ea60: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d  [pList->nExpr-1]
ea70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
ea80: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
ea90: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
eaa0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70  e(db, pItem->zSp
eab0: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
eac0: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
ead0: 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74  bSpanDup(db, zSt
eae0: 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 7d 0a  art, zEnd);.  }.
eaf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
eb00: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
eb10: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
eb20: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
eb30: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
eb40: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
eb50: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
eb60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
eb70: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
eb80: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
eb90: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
eba0: 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  *pEList,.  const
ebb0: 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29   char *zObject.)
ebc0: 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61  {.  int mx = pPa
ebd0: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
ebe0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
ebf0: 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  UMN];.  testcase
ec00: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
ec10: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b  st->nExpr==mx );
ec20: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
ec30: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
ec40: 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20  Expr==mx+1 );.  
ec50: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
ec60: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29  List->nExpr>mx )
ec70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
ec80: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
ec90: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
eca0: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
ecb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
ecc0: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
ecd0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
ece0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
ecf0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
ed00: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
ed10: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
ed20: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
ed30: 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
ed40: 3e 6e 45 78 70 72 3b 0a 20 20 73 74 72 75 63 74  >nExpr;.  struct
ed50: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
ed60: 70 49 74 65 6d 20 3d 20 20 70 4c 69 73 74 2d 3e  pItem =  pList->
ed70: 61 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  a;.  assert( pLi
ed80: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
ed90: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
eda0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
edb0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
edc0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
edd0: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
ede0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
edf0: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
ee00: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
ee10: 6d 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d  m++;.  }while( -
ee20: 2d 69 3e 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  -i>0 );.  sqlite
ee30: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c  3DbFreeNN(db, pL
ee40: 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ist);.}.void sql
ee50: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
ee60: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
ee70: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
ee80: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20  {.  if( pList ) 
ee90: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
eea0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
eeb0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
eec0: 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61   bitwise-OR of a
eed0: 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69  ll Expr.flags fi
eee0: 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65  elds in the give
eef0: 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a  n.** ExprList..*
ef00: 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70  /.u32 sqlite3Exp
ef10: 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74  rListFlags(const
ef20: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
ef30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33  ){.  int i;.  u3
ef40: 32 20 6d 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  2 m = 0;.  asser
ef50: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
ef60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
ef70: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
ef80: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
ef90: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
efa0: 45 78 70 72 3b 0a 20 20 20 20 20 61 73 73 65 72  Expr;.     asser
efb0: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
efc0: 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e      m |= pExpr->
efd0: 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 72 65 74  flags;.  }.  ret
efe0: 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn m;.}../*.** 
eff0: 54 68 69 73 20 69 73 20 61 20 53 45 4c 45 43 54  This is a SELECT
f000: 2d 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66  -node callback f
f010: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
f020: 6e 20 77 61 6c 6b 65 72 20 74 68 61 74 0a 2a 2a  n walker that.**
f030: 20 61 6c 77 61 79 73 20 22 66 61 69 6c 73 22 2e   always "fails".
f040: 20 20 42 79 20 22 66 61 69 6c 22 20 69 6e 20 74    By "fail" in t
f050: 68 69 73 20 63 61 73 65 2c 20 77 65 20 6d 65 61  his case, we mea
f060: 6e 20 73 65 74 0a 2a 2a 20 70 57 61 6c 6b 65 72  n set.** pWalker
f070: 2d 3e 65 43 6f 64 65 20 74 6f 20 7a 65 72 6f 20  ->eCode to zero 
f080: 61 6e 64 20 61 62 6f 72 74 2e 0a 2a 2a 0a 2a 2a  and abort..**.**
f090: 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69   This callback i
f0a0: 73 20 75 73 65 64 20 62 79 20 6d 75 6c 74 69 70  s used by multip
f0b0: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 61  le expression wa
f0c0: 6c 6b 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lkers..*/.int sq
f0d0: 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 46  lite3SelectWalkF
f0e0: 61 69 6c 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ail(Walker *pWal
f0f0: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
f100: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
f110: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
f120: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65  d);.  pWalker->e
f130: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Code = 0;.  retu
f140: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a  rn WRC_Abort;.}.
f150: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
f160: 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  put expression i
f170: 73 20 61 6e 20 49 44 20 77 69 74 68 20 74 68 65  s an ID with the
f180: 20 6e 61 6d 65 20 22 74 72 75 65 22 20 6f 72 20   name "true" or 
f190: 22 66 61 6c 73 65 22 0a 2a 2a 20 74 68 65 6e 20  "false".** then 
f1a0: 63 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20  convert it into 
f1b0: 61 6e 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20  an TK_TRUEFALSE 
f1c0: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 6e 6f  term.  Return no
f1d0: 6e 2d 7a 65 72 6f 20 69 66 0a 2a 2a 20 74 68 65  n-zero if.** the
f1e0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 68 61 70 70   conversion happ
f1f0: 65 6e 65 64 2c 20 61 6e 64 20 7a 65 72 6f 20 69  ened, and zero i
f200: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
f210: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 0a 2a   is unaltered..*
f220: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
f230: 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 45  rIdToTrueFalse(E
f240: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61  xpr *pExpr){.  a
f250: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
f260: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 78 70 72  ==TK_ID || pExpr
f270: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
f280: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
f290: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
f2a0: 20 45 50 5f 51 75 6f 74 65 64 29 0a 20 20 20 26   EP_Quoted).   &
f2b0: 26 20 28 73 71 6c 69 74 65 33 53 74 72 49 43 6d  & (sqlite3StrICm
f2c0: 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  p(pExpr->u.zToke
f2d0: 6e 2c 20 22 74 72 75 65 22 29 3d 3d 30 0a 20 20  n, "true")==0.  
f2e0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53       || sqlite3S
f2f0: 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
f300: 7a 54 6f 6b 65 6e 2c 20 22 66 61 6c 73 65 22 29  zToken, "false")
f310: 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 70 45  ==0).  ){.    pE
f320: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55  xpr->op = TK_TRU
f330: 45 46 41 4c 53 45 3b 0a 20 20 20 20 45 78 70 72  EFALSE;.    Expr
f340: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
f350: 72 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  r, pExpr->u.zTok
f360: 65 6e 5b 34 5d 3d 3d 30 20 3f 20 45 50 5f 49 73  en[4]==0 ? EP_Is
f370: 54 72 75 65 20 3a 20 45 50 5f 49 73 46 61 6c 73  True : EP_IsFals
f380: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
f390: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
f3a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
f3b0: 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
f3c0: 61 20 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 45  a TK_TRUEFALSE E
f3d0: 78 70 72 20 6e 6f 64 65 2e 20 20 52 65 74 75 72  xpr node.  Retur
f3e0: 6e 20 31 20 69 66 20 69 74 20 69 73 20 54 52 55  n 1 if it is TRU
f3f0: 45 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74  E.** and 0 if it
f400: 20 69 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a 69 6e   is FALSE..*/.in
f410: 74 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  t sqlite3ExprTru
f420: 74 68 56 61 6c 75 65 28 63 6f 6e 73 74 20 45 78  thValue(const Ex
f430: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 70 45  pr *pExpr){.  pE
f440: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
f450: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 28 45 78  rSkipCollate((Ex
f460: 70 72 2a 29 70 45 78 70 72 29 3b 0a 20 20 61 73  pr*)pExpr);.  as
f470: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
f480: 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 29 3b  =TK_TRUEFALSE );
f490: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f4a0: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
f4b0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 74 72 75 65 22  >u.zToken,"true"
f4c0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73  )==0.       || s
f4d0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
f4e0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 66  xpr->u.zToken,"f
f4f0: 61 6c 73 65 22 29 3d 3d 30 20 29 3b 0a 20 20 72  alse")==0 );.  r
f500: 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 75 2e 7a  eturn pExpr->u.z
f510: 54 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 7d 0a 0a  Token[4]==0;.}..
f520: 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  /*.** If pExpr i
f530: 73 20 61 6e 20 41 4e 44 20 6f 72 20 4f 52 20 65  s an AND or OR e
f540: 78 70 72 65 73 73 69 6f 6e 2c 20 74 72 79 20 74  xpression, try t
f550: 6f 20 73 69 6d 70 6c 69 66 79 20 69 74 20 62 79  o simplify it by
f560: 20 65 6c 69 6d 69 6e 61 74 69 6e 67 0a 2a 2a 20   eliminating.** 
f570: 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 61  terms that are a
f580: 6c 77 61 79 73 20 74 72 75 65 20 6f 72 20 66 61  lways true or fa
f590: 6c 73 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  lse.  Return the
f5a0: 20 73 69 6d 70 6c 69 66 69 65 64 20 65 78 70 72   simplified expr
f5b0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 4f 72 20 72 65  ession..** Or re
f5c0: 74 75 72 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  turn the origina
f5d0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 66 20  l expression if 
f5e0: 6e 6f 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  no simplificatio
f5f0: 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  n is possible..*
f600: 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  *.** Examples:.*
f610: 2a 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30 29 20  *.**     (x<10) 
f620: 41 4e 44 20 74 72 75 65 20 20 20 20 20 20 20 20  AND true        
f630: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 28 78 3c          =>   (x<
f640: 31 30 29 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30  10).**     (x<10
f650: 29 20 41 4e 44 20 66 61 6c 73 65 20 20 20 20 20  ) AND false     
f660: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 66            =>   f
f670: 61 6c 73 65 0a 2a 2a 20 20 20 20 20 28 78 3c 31  alse.**     (x<1
f680: 30 29 20 41 4e 44 20 28 79 3d 32 32 20 4f 52 20  0) AND (y=22 OR 
f690: 66 61 6c 73 65 29 20 20 20 20 20 3d 3e 20 20 20  false)     =>   
f6a0: 28 78 3c 31 30 29 20 41 4e 44 20 28 79 3d 32 32  (x<10) AND (y=22
f6b0: 29 0a 2a 2a 20 20 20 20 20 28 78 3c 31 30 29 20  ).**     (x<10) 
f6c0: 41 4e 44 20 28 79 3d 32 32 20 4f 52 20 74 72 75  AND (y=22 OR tru
f6d0: 65 29 20 20 20 20 20 20 3d 3e 20 20 20 28 78 3c  e)      =>   (x<
f6e0: 31 30 29 0a 2a 2a 20 20 20 20 20 28 79 3d 32 32  10).**     (y=22
f6f0: 29 20 4f 52 20 74 72 75 65 20 20 20 20 20 20 20  ) OR true       
f700: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74            =>   t
f710: 72 75 65 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  rue.*/.Expr *sql
f720: 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69  ite3ExprSimplifi
f730: 65 64 41 6e 64 4f 72 28 45 78 70 72 20 2a 70 45  edAndOr(Expr *pE
f740: 78 70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  xpr){.  assert( 
f750: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 69 66  pExpr!=0 );.  if
f760: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f770: 41 4e 44 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  AND || pExpr->op
f780: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 45  ==TK_OR ){.    E
f790: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71  xpr *pRight = sq
f7a0: 6c 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66  lite3ExprSimplif
f7b0: 69 65 64 41 6e 64 4f 72 28 70 45 78 70 72 2d 3e  iedAndOr(pExpr->
f7c0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 45 78 70  pRight);.    Exp
f7d0: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
f7e0: 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69 65 64  e3ExprSimplified
f7f0: 41 6e 64 4f 72 28 70 45 78 70 72 2d 3e 70 4c 65  AndOr(pExpr->pLe
f800: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ft);.    if( Exp
f810: 72 41 6c 77 61 79 73 54 72 75 65 28 70 4c 65 66  rAlwaysTrue(pLef
f820: 74 29 20 7c 7c 20 45 78 70 72 41 6c 77 61 79 73  t) || ExprAlways
f830: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
f840: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
f850: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  Expr->op==TK_AND
f860: 20 3f 20 70 52 69 67 68 74 20 3a 20 70 4c 65 66   ? pRight : pLef
f870: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
f880: 20 45 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   ExprAlwaysTrue(
f890: 70 52 69 67 68 74 29 20 7c 7c 20 45 78 70 72 41  pRight) || ExprA
f8a0: 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74  lwaysFalse(pLeft
f8b0: 29 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  ) ){.      pExpr
f8c0: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
f8d0: 5f 41 4e 44 20 3f 20 70 4c 65 66 74 20 3a 20 70  _AND ? pLeft : p
f8e0: 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Right;.    }.  }
f8f0: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
f900: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  .}.../*.** These
f910: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
f920: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75  lker callbacks u
f930: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70  sed to check exp
f940: 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73  ressions to.** s
f950: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22  ee if they are "
f960: 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f  constant" for so
f970: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
f980: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a   constant.  The.
f990: 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  ** Walker.eCode 
f9a0: 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73  value determines
f9b0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f   the type of "co
f9c0: 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c  nstant" we are l
f9d0: 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a  ooking.** for..*
f9e0: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
f9f0: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
fa00: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
fa10: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
fa20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
fa30: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
fa40: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
fa50: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
fa60: 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71  ode==1.**     sq
fa70: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
fa80: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20  antNotJoin()    
fa90: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
faa0: 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20  eCode==2.**     
fab0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
fac0: 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  leConstant()    
fad0: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
fae0: 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20  ->eCode==3.**   
faf0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
fb00: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
fb10: 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b  n()        pWalk
fb20: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
fb30: 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63  5.**.** In all c
fb40: 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61  ases, the callba
fb50: 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65  cks set Walker.e
fb60: 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74  Code=0 and abort
fb70: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
fb80: 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74  on.** is found t
fb90: 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74  o not be a const
fba0: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ant..**.** The s
fbb0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
fbc0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
fbd0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61   is used for eva
fbe0: 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69  luating expressi
fbf0: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ons.** in a CREA
fc00: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
fc10: 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e  nt.  The Walker.
fc20: 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35  eCode value is 5
fc30: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
fc40: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
fc50: 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70  ema and 4 when p
fc60: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
fc70: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
fc80: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
fc90: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
fca0: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
fcb0: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
fcc0: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
fcd0: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
fce0: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
fcf0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
fd00: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
fd10: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
fd20: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
fd30: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
fd40: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
fd50: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
fd60: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
fd70: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
fd80: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
fd90: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
fda0: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
fdb0: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
fdc0: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
fdd0: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
fde0: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
fdf0: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
fe00: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
fe10: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73  Walker->eCode is
fe20: 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   2 then any term
fe30: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
fe40: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
fe50: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
fe60: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
fe70: 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64  of a left join d
fe80: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
fe90: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
fea0: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
feb0: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
fec0: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
fed0: 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78  ->eCode==2 && Ex
fee0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
fef0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
ff00: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
ff10: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
ff20: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
ff30: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
ff40: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
ff50: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
ff60: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
ff70: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
ff80: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
ff90: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
ffa0: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
ffb0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
ffc0: 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63  or 5 or the func
ffd0: 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20  tion has the.   
ffe0: 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ** SQLITE_FUNC_
fff0: 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20  CONST flag. */. 
10000 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
10010 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
10020 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34  Walker->eCode>=4
10030 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
10040 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
10050 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  stFunc) ){.     
10060 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
10070 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
10080 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
10090 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
100a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
100b0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
100c0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
100d0 44 3a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  D:.      /* Conv
100e0 65 72 74 20 22 74 72 75 65 22 20 6f 72 20 22 66  ert "true" or "f
100f0 61 6c 73 65 22 20 69 6e 20 61 20 44 45 46 41 55  alse" in a DEFAU
10100 4c 54 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 74  LT clause into t
10110 68 65 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 72  he.      ** appr
10120 6f 70 72 69 61 74 65 20 54 4b 5f 54 52 55 45 46  opriate TK_TRUEF
10130 41 4c 53 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ALSE operator */
10140 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
10150 65 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61  e3ExprIdToTrueFa
10160 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
10170 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
10180 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a  _Prune;.      }.
10190 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
101a0 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ru */.    case T
101b0 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
101c0 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
101d0 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
101e0 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
101f0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
10200 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
10210 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10220 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
10230 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
10240 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
10250 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
10260 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
10270 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
10280 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
10290 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
102a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
102b0 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20  r, EP_FixedCol) 
102c0 26 26 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  && pWalker->eCod
102d0 65 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=2 ){.        
102e0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
102f0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
10300 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
10310 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78 70  eCode==3 && pExp
10320 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b  r->iTable==pWalk
10330 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20  er->u.iCur ){.  
10340 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
10350 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
10360 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
10370 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20   through */.    
10380 63 61 73 65 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  case TK_IF_NULL_
10390 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ROW:.    case TK
103a0 5f 52 45 47 49 53 54 45 52 3a 0a 20 20 20 20 20  _REGISTER:.     
103b0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
103c0 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
103d0 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
103e0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
103f0 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 29  TK_IF_NULL_ROW )
10400 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d  ;.      pWalker-
10410 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
10420 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
10430 72 74 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  rt;.    case TK_
10440 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
10450 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
10460 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  de==5 ){.       
10470 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e   /* Silently con
10480 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61 6d  vert bound param
10490 65 74 65 72 73 20 74 68 61 74 20 61 70 70 65 61  eters that appea
104a0 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45 41  r inside of CREA
104b0 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  TE.        ** st
104c0 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20  atements into a 
104d0 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69 6e  NULL when parsin
104e0 67 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  g the CREATE sta
104f0 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74 0a  tement text out.
10500 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
10510 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
10520 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
10530 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
10540 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  NULL;.      }els
10550 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65  e if( pWalker->e
10560 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20  Code==4 ){.     
10570 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61     /* A bound pa
10580 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52 45  rameter in a CRE
10590 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ATE statement th
105a0 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
105b0 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71  om.        ** sq
105c0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
105d0 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72 20  causes an error 
105e0 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  */.        pWalk
105f0 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
10600 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
10610 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
10620 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
10630 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64 65  hrough */.    de
10640 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73  fault:.      tes
10650 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
10660 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f  ==TK_SELECT ); /
10670 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  * sqlite3SelectW
10680 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61 6c 6c  alkFail() disall
10690 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  ows */.      tes
106a0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
106b0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f  ==TK_EXISTS ); /
106c0 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  * sqlite3SelectW
106d0 61 6c 6b 46 61 69 6c 28 29 20 64 69 73 61 6c 6c  alkFail() disall
106e0 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ows */.      ret
106f0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
10700 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69  ;.  }.}.static i
10710 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45  nt exprIsConst(E
10720 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74  xpr *p, int init
10730 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29 7b  Flag, int iCur){
10740 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
10750 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61  .eCode = initFla
10760 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  g;.  w.xExprCall
10770 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49  back = exprNodeI
10780 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78  sConstant;.  w.x
10790 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
107a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
107b0 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65 66 20 53  lkFail;.#ifdef S
107c0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 77 2e  QLITE_DEBUG.  w.
107d0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
107e0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
107f0 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a 23 65 6e  WalkAssert2;.#en
10800 64 69 66 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d  dif.  w.u.iCur =
10810 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33   iCur;.  sqlite3
10820 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
10830 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
10840 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
10850 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
10860 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
10870 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
10880 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
10890 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
108a0 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
108b0 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
108c0 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
108d0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
108e0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
108f0 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
10900 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
10910 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
10920 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
10930 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
10940 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
10950 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
10960 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
10970 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
10980 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
10990 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
109a0 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a  Const(p, 1, 0);.
109b0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
109c0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
109d0 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
109e0 72 6f 20 69 66 0a 2a 2a 0a 2a 2a 20 20 20 28 31  ro if.**.**   (1
109f0 29 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  ) the expression
10a00 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 61 6e   is constant, an
10a10 64 0a 2a 2a 20 20 20 28 32 29 20 74 68 65 20 65  d.**   (2) the e
10a20 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6f  xpression does o
10a30 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
10a40 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
10a50 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61  se.**       of a
10a60 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e 64 0a   LEFT JOIN, and.
10a70 2a 2a 20 20 20 28 33 29 20 74 68 65 20 65 78 70  **   (3) the exp
10a80 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
10a90 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 45 50 5f   contain any EP_
10aa0 46 69 78 65 64 43 6f 6c 20 54 4b 5f 43 4f 4c 55  FixedCol TK_COLU
10ab0 4d 4e 0a 2a 2a 20 20 20 20 20 20 20 6f 70 65 72  MN.**       oper
10ac0 61 6e 64 73 20 63 72 65 61 74 65 64 20 62 79 20  ands created by 
10ad0 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f  the constant pro
10ae0 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a  pagation optimiz
10af0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ation..**.** Whe
10b00 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
10b10 65 74 75 72 6e 73 20 74 72 75 65 2c 20 69 74 20  eturns true, it 
10b20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
10b30 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
10b40 20 63 61 6e 20 62 65 20 61 64 64 65 64 20 74 6f   can be added to
10b50 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 43 6f   the pParse->pCo
10b60 6e 73 74 45 78 70 72 20 6c 69 73 74 20 61 6e 64  nstExpr list and
10b70 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20   evaluated once 
10b80 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 72 65 70  when.** the prep
10b90 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 73  ared statement s
10ba0 74 61 72 74 73 20 75 70 2e 20 20 53 65 65 20 73  tarts up.  See s
10bb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
10bc0 49 6e 69 74 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Init()..*/.int s
10bd0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
10be0 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72  tantNotJoin(Expr
10bf0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
10c00 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c  xprIsConst(p, 2,
10c10 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
10c20 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
10c30 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
10c40 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
10c50 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
10c60 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79  stant.** for any
10c70 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
10c80 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
10c90 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f  rsor iCur.  In o
10ca0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a  ther words, the.
10cb0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  ** expression mu
10cc0 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  st not refer to 
10cd0 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  any non-determin
10ce0 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e  istic function n
10cf0 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20  or any.** table 
10d00 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e  other than iCur.
10d10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
10d20 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
10d30 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  nt(Expr *p, int 
10d40 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  iCur){.  return 
10d50 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
10d60 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , iCur);.}.../*.
10d70 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ** sqlite3WalkEx
10d80 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73  pr() callback us
10d90 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  ed by sqlite3Exp
10da0 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  rIsConstantOrGro
10db0 75 70 42 79 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  upBy()..*/.stati
10dc0 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
10dd0 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
10de0 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  y(Walker *pWalke
10df0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
10e00 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
10e10 6f 75 70 42 79 20 3d 20 70 57 61 6c 6b 65 72 2d  oupBy = pWalker-
10e20 3e 75 2e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69  >u.pGroupBy;.  i
10e30 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  nt i;..  /* Chec
10e40 6b 20 69 66 20 70 45 78 70 72 20 69 73 20 69 64  k if pExpr is id
10e50 65 6e 74 69 63 61 6c 20 74 6f 20 61 6e 79 20 47  entical to any G
10e60 52 4f 55 50 20 42 59 20 74 65 72 6d 2e 20 49 66  ROUP BY term. If
10e70 20 73 6f 2c 20 63 6f 6e 73 69 64 65 72 0a 20 20   so, consider.  
10e80 2a 2a 20 69 74 20 63 6f 6e 73 74 61 6e 74 2e 20  ** it constant. 
10e90 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
10ea0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
10eb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
10ec0 20 2a 70 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e   *p = pGroupBy->
10ed0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
10ee0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
10ef0 6f 6d 70 61 72 65 28 30 2c 20 70 45 78 70 72 2c  ompare(0, pExpr,
10f00 20 70 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20   p, -1)<2 ){.   
10f10 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
10f20 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e  l = sqlite3ExprN
10f30 4e 43 6f 6c 6c 53 65 71 28 70 57 61 6c 6b 65 72  NCollSeq(pWalker
10f40 2d 3e 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  ->pParse, p);.  
10f50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
10f60 73 42 69 6e 61 72 79 28 70 43 6f 6c 6c 29 20 29  sBinary(pColl) )
10f70 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
10f80 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
10f90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10fa0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 70 45 78   /* Check if pEx
10fb0 70 72 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  pr is a sub-sele
10fc0 63 74 2e 20 49 66 20 73 6f 2c 20 63 6f 6e 73 69  ct. If so, consi
10fd0 64 65 72 20 69 74 20 76 61 72 69 61 62 6c 65 2e  der it variable.
10fe0 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61   */.  if( ExprHa
10ff0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
11000 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
11010 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
11020 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65  Code = 0;.    re
11030 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
11040 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 65 78    }..  return ex
11050 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
11060 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29  (pWalker, pExpr)
11070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
11080 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
11090 72 65 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ree passed as th
110a0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
110b0 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  . Return non-zer
110c0 6f 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72  o.** if the expr
110d0 65 73 73 69 6f 6e 20 63 6f 6e 73 69 73 74 73 20  ession consists 
110e0 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73  entirely of cons
110f0 74 61 6e 74 73 20 6f 72 20 63 6f 70 69 65 73 20  tants or copies 
11100 6f 66 20 74 65 72 6d 73 20 0a 2a 2a 20 69 6e 20  of terms .** in 
11110 70 47 72 6f 75 70 42 79 20 74 68 61 74 20 73 6f  pGroupBy that so
11120 72 74 20 77 69 74 68 20 74 68 65 20 42 49 4e 41  rt with the BINA
11130 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  RY collation seq
11140 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  uence..**.** Thi
11150 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
11160 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
11170 66 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  f a term of the 
11180 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 63 61  HAVING clause ca
11190 6e 0a 2a 2a 20 62 65 20 70 72 6f 6d 6f 74 65 64  n.** be promoted
111a0 20 69 6e 74 6f 20 74 68 65 20 57 48 45 52 45 20   into the WHERE 
111b0 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65  clause.  In orde
111c0 72 20 66 6f 72 20 73 75 63 68 20 61 20 70 72 6f  r for such a pro
111d0 6d 6f 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 2c 0a  motion to work,.
111e0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
111f0 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
11200 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74  e term must be t
11210 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20  he same for all 
11220 6d 65 6d 62 65 72 73 20 6f 66 0a 2a 2a 20 61 20  members of.** a 
11230 22 67 72 6f 75 70 22 2e 20 20 54 68 65 20 72 65  "group".  The re
11240 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
11250 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
11260 20 6d 75 73 74 20 62 65 20 42 49 4e 41 52 59 0a   must be BINARY.
11270 2a 2a 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ** assumes that 
11280 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 6c 61 74 69  no other collati
11290 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c  ng sequence will
112a0 20 68 61 76 65 20 61 20 66 69 6e 65 72 2d 67 72   have a finer-gr
112b0 61 69 6e 65 64 0a 2a 2a 20 67 72 6f 75 70 69 6e  ained.** groupin
112c0 67 20 74 68 61 6e 20 62 69 6e 61 72 79 2e 20 20  g than binary.  
112d0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 28  In other words (
112e0 41 3d 42 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61  A=B COLLATE bina
112f0 72 79 29 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 41  ry) implies.** A
11300 3d 42 20 69 6e 20 65 76 65 72 79 20 6f 74 68 65  =B in every othe
11310 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  r collating sequ
11320 65 6e 63 65 2e 20 20 54 68 65 20 72 65 71 75 69  ence.  The requi
11330 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 0a  rement that the.
11340 2a 2a 20 47 52 4f 55 50 20 42 59 20 62 65 20 42  ** GROUP BY be B
11350 49 4e 41 52 59 20 69 73 20 73 74 72 69 63 74 65  INARY is stricte
11360 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  r than necessary
11370 2e 20 20 49 74 20 77 6f 75 6c 64 20 61 6c 73 6f  .  It would also
11380 20 77 6f 72 6b 0a 2a 2a 20 74 6f 20 70 72 6f 6d   work.** to prom
11390 6f 74 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  ote HAVING claus
113a0 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
113b0 73 61 6d 65 20 61 6c 74 65 72 6e 61 74 69 76 65  same alternative
113c0 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
113d0 71 75 65 6e 63 65 20 61 73 20 74 68 65 20 47 52  quence as the GR
113e0 4f 55 50 20 42 59 20 74 65 72 6d 2c 20 62 75 74  OUP BY term, but
113f0 20 74 68 61 74 20 69 73 20 6d 75 63 68 20 68 61   that is much ha
11400 72 64 65 72 20 74 6f 20 63 68 65 63 6b 2c 0a 2a  rder to check,.*
11410 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * alternative co
11420 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11430 73 20 61 72 65 20 75 6e 63 6f 6d 6d 6f 6e 2c 20  s are uncommon, 
11440 61 6e 64 20 74 68 69 73 20 69 73 20 6f 6e 6c 79  and this is only
11450 20 61 6e 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74   an.** optimizat
11460 69 6f 6e 2c 20 73 6f 20 77 65 20 74 61 6b 65 20  ion, so we take 
11470 74 68 65 20 65 61 73 79 20 77 61 79 20 6f 75 74  the easy way out
11480 20 61 6e 64 20 73 69 6d 70 6c 79 20 72 65 71 75   and simply requ
11490 69 72 65 20 74 68 65 0a 2a 2a 20 47 52 4f 55 50  ire the.** GROUP
114a0 20 42 59 20 74 6f 20 75 73 65 20 74 68 65 20 42   BY to use the B
114b0 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6e 67 20  INARY collating 
114c0 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 69 6e 74  sequence..*/.int
114d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
114e0 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28  nstantOrGroupBy(
114f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
11500 78 70 72 20 2a 70 2c 20 45 78 70 72 4c 69 73 74  xpr *p, ExprList
11510 20 2a 70 47 72 6f 75 70 42 79 29 7b 0a 20 20 57   *pGroupBy){.  W
11520 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f  alker w;.  w.eCo
11530 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
11540 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
11550 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 4f 72  NodeIsConstantOr
11560 47 72 6f 75 70 42 79 3b 0a 20 20 77 2e 78 53 65  GroupBy;.  w.xSe
11570 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30  lectCallback = 0
11580 3b 0a 20 20 77 2e 75 2e 70 47 72 6f 75 70 42 79  ;.  w.u.pGroupBy
11590 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 77   = pGroupBy;.  w
115a0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
115b0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
115c0 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
115d0 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a  turn w.eCode;.}.
115e0 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
115f0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
11600 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
11610 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
11620 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
11630 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  * or a function 
11640 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61  call with consta
11650 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
11660 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74  eturn and 0 if t
11670 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20  here.** are any 
11680 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
11690 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
116a0 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
116b0 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
116c0 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
116d0 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
116e0 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
116f0 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
11700 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
11710 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
11720 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
11730 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
11740 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
11750 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69  on(Expr *p, u8 i
11760 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74  sInit){.  assert
11770 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69  ( isInit==0 || i
11780 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65  sInit==1 );.  re
11790 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
117a0 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29  (p, 4+isInit, 0)
117b0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
117c0 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
117d0 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c  _HINTS./*.** Wal
117e0 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
117f0 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
11800 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
11810 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  n contains a.** 
11820 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65  subquery of some
11830 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30   kind.  Return 0
11840 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
11850 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a   subqueries..*/.
11860 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
11870 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72 79 28  ontainsSubquery(
11880 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b  Expr *p){.  Walk
11890 65 72 20 77 3b 0a 20 20 77 2e 65 43 6f 64 65 20  er w;.  w.eCode 
118a0 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  = 1;.  w.xExprCa
118b0 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
118c0 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
118d0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
118e0 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
118f0 74 57 61 6c 6b 46 61 69 6c 3b 0a 23 69 66 64 65  tWalkFail;.#ifde
11900 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
11910 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
11920 63 6b 32 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ck2 = sqlite3Sel
11930 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 3b 0a  ectWalkAssert2;.
11940 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
11950 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
11960 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
11970 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  e==0;.}.#endif..
11980 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
11990 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20  ression p codes 
119a0 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
119b0 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
119c0 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
119d0 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
119e0 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
119f0 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
11a00 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
11a10 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
11a20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
11a30 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
11a40 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
11a50 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
11a60 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
11a70 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
11a80 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
11a90 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
11aa0 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
11ab0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
11ac0 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
11ad0 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63  Value){.  int rc
11ae0 20 3d 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45   = 0;.  if( NEVE
11af0 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
11b00 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20   0;  /* Used to 
11b10 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 6c 6c  only happen foll
11b20 6f 77 69 6e 67 20 6f 6e 20 4f 4f 4d 20 2a 2f 0a  owing on OOM */.
11b30 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72  .  /* If an expr
11b40 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74  ession is an int
11b50 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61  eger literal tha
11b60 74 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e  t fits in a sign
11b70 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69  ed 32-bit.  ** i
11b80 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65  nteger, then the
11b90 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
11ba0 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  g will have alre
11bb0 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a  ady been set */.
11bc0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
11bd0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28  =TK_INTEGER || (
11be0 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
11bf0 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20  tValue)!=0.     
11c00 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
11c10 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54  GetInt32(p->u.zT
11c20 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b  oken, &rc)==0 );
11c30 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ..  if( p->flags
11c40 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
11c50 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20  {.    *pValue = 
11c60 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  p->u.iValue;.   
11c70 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
11c80 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
11c90 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  {.    case TK_UP
11ca0 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  LUS: {.      rc 
11cb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  = sqlite3ExprIsI
11cc0 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
11cd0 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   pValue);.      
11ce0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
11cf0 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
11d00 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
11d10 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11d20 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
11d30 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
11d40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11d50 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d  v!=(-2147483647-
11d60 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  1) );.        *p
11d70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20  Value = -v;.    
11d80 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
11d90 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
11da0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
11db0 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  lt: break;.  }. 
11dc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11dd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  *.** Return FALS
11de0 45 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  E if there is no
11df0 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
11e00 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
11e10 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  be NULL..**.** I
11e20 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11e30 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f   might be NULL o
11e40 72 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  r if the express
11e50 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c  ion is too compl
11e60 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65  ex.** to tell re
11e70 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a  turn TRUE.  .**.
11e80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11e90 69 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70  is used as an op
11ea0 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73  timization, to s
11eb0 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70  kip OP_IsNull op
11ec0 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65  codes.** when we
11ed0 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c   know that a val
11ee0 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  ue cannot be NUL
11ef0 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c  L.  Hence, a fal
11f00 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28  se positive.** (
11f10 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77  returning TRUE w
11f20 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20  hen in fact the 
11f30 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e  expression can n
11f40 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69  ever be NULL) mi
11f50 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c  ght.** be a smal
11f60 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  l performance hi
11f70 74 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69  t but is otherwi
11f80 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e  se harmless.  On
11f90 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61   the other.** ha
11fa0 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61  nd, a false nega
11fb0 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20  tive (returning 
11fc0 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72  FALSE when the r
11fd0 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e  esult could be N
11fe0 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b  ULL).** will lik
11ff0 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ely result in an
12000 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65   incorrect answe
12010 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64  r.  So when in d
12020 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  oubt, return.** 
12030 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  TRUE..*/.int sql
12040 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
12050 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29  l(const Expr *p)
12060 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69  {.  u8 op;.  whi
12070 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
12080 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
12090 5f 55 4d 49 4e 55 53 20 29 7b 0a 20 20 20 20 70  _UMINUS ){.    p
120a0 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d   = p->pLeft;.  }
120b0 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
120c0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
120d0 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
120e0 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
120f0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
12100 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
12110 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
12120 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
12130 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
12140 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
12150 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
12160 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 72 65 74 75  LUMN:.      retu
12170 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
12180 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75  ty(p, EP_CanBeNu
12190 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ll) ||.         
121a0 20 20 20 20 70 2d 3e 79 2e 70 54 61 62 3d 3d 30      p->y.pTab==0
121b0 20 7c 7c 20 20 2f 2a 20 52 65 66 65 72 65 6e 63   ||  /* Referenc
121c0 65 20 74 6f 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  e to column of i
121d0 6e 64 65 78 20 6f 6e 20 65 78 70 72 65 73 73 69  ndex on expressi
121e0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
121f0 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d     (p->iColumn>=
12200 30 20 26 26 20 70 2d 3e 79 2e 70 54 61 62 2d 3e  0 && p->y.pTab->
12210 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d  aCol[p->iColumn]
12220 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20  .notNull==0);.  
12230 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
12240 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
12250 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
12260 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
12270 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
12280 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
12290 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
122a0 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
122b0 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
122c0 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
122d0 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
122e0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
122f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
12300 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
12310 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
12320 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
12330 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
12340 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
12350 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
12360 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
12370 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
12380 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
12390 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
123a0 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
123b0 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
123c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
123d0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
123e0 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
123f0 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
12400 20 20 75 38 20 6f 70 3b 0a 20 20 69 6e 74 20 75    u8 op;.  int u
12410 6e 61 72 79 4d 69 6e 75 73 20 3d 20 30 3b 0a 20  naryMinus = 0;. 
12420 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45   if( aff==SQLITE
12430 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75  _AFF_BLOB ) retu
12440 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 1;.  while( p
12450 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
12460 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
12470 55 53 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  US ){.    if( p-
12480 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
12490 20 75 6e 61 72 79 4d 69 6e 75 73 20 3d 20 31 3b   unaryMinus = 1;
124a0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66  .    p = p->pLef
124b0 74 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  t;.  }.  op = p-
124c0 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
124d0 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
124e0 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
124f0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
12500 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
12510 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
12520 66 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f>=SQLITE_AFF_NU
12530 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
12540 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
12550 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
12560 66 66 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff>=SQLITE_AFF_N
12570 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
12580 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
12590 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
125a0 20 21 75 6e 61 72 79 4d 69 6e 75 73 20 26 26 20   !unaryMinus && 
125b0 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
125c0 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
125d0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
125e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 21 75 6e        return !un
125f0 61 72 79 4d 69 6e 75 73 3b 0a 20 20 20 20 7d 0a  aryMinus;.    }.
12600 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
12610 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
12620 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
12630 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
12640 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
12650 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
12660 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  /.      return a
12670 66 66 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff>=SQLITE_AFF_N
12680 55 4d 45 52 49 43 20 26 26 20 70 2d 3e 69 43 6f  UMERIC && p->iCo
12690 6c 75 6d 6e 3c 30 3b 0a 20 20 20 20 7d 0a 20 20  lumn<0;.    }.  
126a0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
126b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
126c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
126d0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
126e0 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
126f0 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75  is a row-id colu
12700 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  mn name..*/.int 
12710 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63  sqlite3IsRowid(c
12720 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
12730 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
12740 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
12750 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
12760 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
12770 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  rICmp(z, "ROWID"
12780 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
12790 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
127a0 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d  rICmp(z, "OID")=
127b0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
127c0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
127d0 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20 52 48  .** pX is the RH
127e0 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61  S of an IN opera
127f0 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73 20 61  tor.  If pX is a
12800 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
12810 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62  t .** that can b
12820 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20  e simplified to 
12830 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 61  a direct table a
12840 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65 74 75  ccess, then retu
12850 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
12860 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  to the SELECT st
12870 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 58 20  atement.  If pX 
12880 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  is not a SELECT 
12890 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72  statement,.** or
128a0 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   if the SELECT s
128b0 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73 20 74  tatement needs t
128c0 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65 64 20  o be manifested 
128d0 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74  into a transient
128e0 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  .** table, then 
128f0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
12900 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12910 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61  MIT_SUBQUERY.sta
12920 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73 43 61  tic Select *isCa
12930 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
12940 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53 65 6c  Expr *pX){.  Sel
12950 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73  ect *p;.  SrcLis
12960 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
12970 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
12980 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
12990 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72  t i;.  if( !Expr
129a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
129b0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20  EP_xIsSelect) ) 
129c0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f  return 0;  /* No
129d0 74 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  t a subquery */.
129e0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
129f0 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72  perty(pX, EP_Var
12a00 53 65 6c 65 63 74 29 20 20 29 20 72 65 74 75 72  Select)  ) retur
12a10 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61  n 0;  /* Correla
12a20 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20  ted subq */.  p 
12a30 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  = pX->x.pSelect;
12a40 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
12a50 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
12a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
12a70 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
12a80 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  CT */.  if( p->s
12a90 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
12aa0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
12ab0 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74  ate) ){.    test
12ac0 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
12ad0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
12ae0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
12af0 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
12b00 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
12b10 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
12b20 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
12b30 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
12b40 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72  gregate );.    r
12b50 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44  eturn 0; /* No D
12b60 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
12b70 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
12b80 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
12b90 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
12ba0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20  GroupBy==0 );   
12bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
12bc0 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
12bd0 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
12be0 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
12bf0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12c00 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
12c10 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
12c20 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
12c30 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
12c40 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48      /* Has no WH
12c50 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
12c60 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
12c70 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
12c80 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  0 );.  if( pSrc-
12c90 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
12ca0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
12cb0 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   Single term in 
12cc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
12cd0 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
12ce0 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
12cf0 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20   0;     /* FROM 
12d00 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  is not a subquer
12d10 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70  y or view */.  p
12d20 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
12d30 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28  .pTab;.  assert(
12d40 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
12d50 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c  sert( pTab->pSel
12d60 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ect==0 );       
12d70 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
12d80 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65  use is not a vie
12d90 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72  w */.  if( IsVir
12da0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
12db0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
12dc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74   FROM clause not
12dd0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
12de0 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
12df0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65  ->pEList;.  asse
12e00 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
12e10 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43 54  .  /* All SELECT
12e20 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62 65   results must be
12e30 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f 0a 20 20 66   columns. */.  f
12e40 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
12e50 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12e60 20 20 20 45 78 70 72 20 2a 70 52 65 73 20 3d 20     Expr *pRes = 
12e70 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
12e80 70 72 3b 0a 20 20 20 20 69 66 28 20 70 52 65 73  pr;.    if( pRes
12e90 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
12ea0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
12eb0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54  assert( pRes->iT
12ec0 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d  able==pSrc->a[0]
12ed0 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20  .iCursor );  /* 
12ee0 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64  Not a correlated
12ef0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d   subquery */.  }
12f00 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 23  .  return p;.}.#
12f10 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12f20 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
12f30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12f40 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
12f50 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12f60 64 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74  de that checks t
12f70 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  he left-most col
12f80 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62  umn of index tab
12f90 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69  le iCur to see i
12fa0 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73  f.** it contains
12fb0 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65   any NULL entrie
12fc0 73 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65  s.  Cause the re
12fd0 67 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73  gister at regHas
12fe0 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a  Null to be set.*
12ff0 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * to a non-NULL 
13000 76 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f  value if iCur co
13010 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e  ntains no NULLs.
13020 20 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72    Cause register
13030 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74   regHasNull.** t
13040 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  o be set to NULL
13050 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
13060 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
13070 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  LL values..*/.st
13080 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
13090 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
130a0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75  Vdbe *v, int iCu
130b0 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c  r, int regHasNul
130c0 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b  l){.  int addr1;
130d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
130e0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
130f0 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  er, 0, regHasNul
13100 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  l);.  addr1 = sq
13110 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13120 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
13130 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
13140 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
13150 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13160 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c  Column, iCur, 0,
13170 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
13180 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
13190 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
131a0 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65  PEOFARG);.  Vdbe
131b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72  Comment((v, "fir
131c0 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22  st_entry_in(%d)"
131d0 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69  , iCur));.  sqli
131e0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
131f0 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 23 65 6e  v, addr1);.}.#en
13200 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
13210 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
13220 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  RY./*.** The arg
13230 75 6d 65 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f  ument is an IN o
13240 70 65 72 61 74 6f 72 20 77 69 74 68 20 61 20 6c  perator with a l
13250 69 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75  ist (not a subqu
13260 65 72 79 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ery) on the .** 
13270 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 2e  right-hand side.
13280 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
13290 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 63 6f   that list is co
132a0 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  nstant..*/.stati
132b0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 52  c int sqlite3InR
132c0 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  hsIsConstant(Exp
132d0 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78 70 72 20  r *pIn){.  Expr 
132e0 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20 72 65 73  *pLHS;.  int res
132f0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
13300 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 6e  rHasProperty(pIn
13310 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
13320 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d  );.  pLHS = pIn-
13330 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70  >pLeft;.  pIn->p
13340 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72 65 73 20  Left = 0;.  res 
13350 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  = sqlite3ExprIsC
13360 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20  onstant(pIn);.  
13370 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48  pIn->pLeft = pLH
13380 53 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  S;.  return res;
13390 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
133a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
133b0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d  s used by the im
133c0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
133d0 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65  the IN (...) ope
133e0 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58  rator..** The pX
133f0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
13400 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20  e expression on 
13410 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
13420 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 68 69 63  N operator, whic
13430 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 65 69  h.** might be ei
13440 74 68 65 72 20 61 20 6c 69 73 74 20 6f 66 20 65  ther a list of e
13450 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20  xpressions or a 
13460 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
13470 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
13480 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 66 69  routine is to fi
13490 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
134a0 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  -tree object tha
134b0 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  t can.** be used
134c0 20 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20   either to test 
134d0 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 69  for membership i
134e0 6e 20 74 68 65 20 52 48 53 20 73 65 74 20 6f 72  n the RHS set or
134f0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
13500 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65  ugh.** all membe
13510 72 73 20 6f 66 20 74 68 65 20 52 48 53 20 73 65  rs of the RHS se
13520 74 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c  t, skipping dupl
13530 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  icates..**.** A 
13540 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
13550 20 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6f   on the b-tree o
13560 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68  bject that is th
13570 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
13580 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20  operator.** and 
13590 70 58 2d 3e 69 54 61 62 6c 65 20 69 73 20 73 65  pX->iTable is se
135a0 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
135b0 66 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a  f that cursor..*
135c0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
135d0 64 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  d value of this 
135e0 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74  function indicat
135f0 65 73 20 74 68 65 20 62 2d 74 72 65 65 20 74 79  es the b-tree ty
13600 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  pe, as follows:.
13610 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  **.**   IN_INDEX
13620 5f 52 4f 57 49 44 20 20 20 20 20 20 2d 20 54 68  _ROWID      - Th
13630 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
13640 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
13650 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  e table..**   IN
13660 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
13670 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
13680 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  as opened on an 
13690 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  ascending index.
136a0 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
136b0 4e 44 45 58 5f 44 45 53 43 20 2d 20 54 68 65 20  NDEX_DESC - The 
136c0 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
136d0 64 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e  d on a descendin
136e0 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
136f0 5f 49 4e 44 45 58 5f 45 50 48 20 20 20 20 20 20  _INDEX_EPH      
13700 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
13710 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73  as opened on a s
13720 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64  pecially created
13730 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13750 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65  populated ephere
13760 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  mal table..**   
13770 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20  IN_INDEX_NOOP   
13780 20 20 20 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20      - No cursor 
13790 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20  was allocated.  
137a0 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  The IN operator 
137b0 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20 20 20 20  must be.**      
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137d0 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61     implemented a
137e0 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  s a sequence of 
137f0 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a  comparisons..**.
13800 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62  ** An existing b
13810 2d 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 75  -tree might be u
13820 73 65 64 20 69 66 20 74 68 65 20 52 48 53 20 65  sed if the RHS e
13830 78 70 72 65 73 73 69 6f 6e 20 70 58 20 69 73 20  xpression pX is 
13840 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71  a simple.** subq
13850 75 65 72 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a  uery such as:.**
13860 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
13870 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63 6f 6c 75 6d  column1>, <colum
13880 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20 3c 74 61 62  n2>... FROM <tab
13890 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le>.**.** If the
138a0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
138b0 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
138c0 74 20 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70  t or a more comp
138d0 6c 65 78 20 73 75 62 71 75 65 72 79 2c 20 74 68  lex subquery, th
138e0 65 6e 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72  en.** an ephemer
138f0 61 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e  al table might n
13900 65 65 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61  eed to be genera
13910 74 65 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53  ted from the RHS
13920 20 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d   and then.** pX-
13930 3e 69 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20  >iTable made to 
13940 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68  point to the eph
13950 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73  emeral table ins
13960 74 65 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78  tead of an.** ex
13970 69 73 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a  isting table..**
13980 0a 2a 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20  .** The inFlags 
13990 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63  parameter must c
139a0 6f 6e 74 61 69 6e 2c 20 61 74 20 61 20 6d 69 6e  ontain, at a min
139b0 69 6d 75 6d 2c 20 6f 6e 65 20 6f 66 20 74 68 65  imum, one of the
139c0 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45   bits.** IN_INDE
139d0 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20  X_MEMBERSHIP or 
139e0 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 75  IN_INDEX_LOOP bu
139f0 74 20 6e 6f 74 20 62 6f 74 68 2e 20 20 49 66 20  t not both.  If 
13a00 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73  inFlags contains
13a10 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
13a20 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68  BERSHIP, then th
13a30 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
13a40 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  e will be used f
13a50 6f 72 20 61 20 66 61 73 74 0a 2a 2a 20 6d 65 6d  or a fast.** mem
13a60 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57  bership test.  W
13a70 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58  hen the IN_INDEX
13a80 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74  _LOOP bit is set
13a90 2c 20 74 68 65 20 49 4e 20 69 6e 64 65 78 20 77  , the IN index w
13aa0 69 6c 6c 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  ill.** be used t
13ab0 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  o loop over all 
13ac0 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48  values of the RH
13ad0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
13ae0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ator..**.** When
13af0 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69   IN_INDEX_LOOP i
13b00 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
13b10 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
13b20 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a  sed to iterate.*
13b30 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 65  * through the se
13b40 74 20 6d 65 6d 62 65 72 73 29 20 74 68 65 6e 20  t members) then 
13b50 74 68 65 20 62 2d 74 72 65 65 20 6d 75 73 74 20  the b-tree must 
13b60 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c  not contain dupl
13b70 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70  icates..** An ep
13b80 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 77 69  heremal table wi
13b90 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 75 6e  ll be created un
13ba0 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
13bb0 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75  d columns are gu
13bc0 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
13bd0 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
13be0 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
13bf0 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
13c00 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f  RY KEY or due to
13c10 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e  .** a UNIQUE con
13c20 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78  straint or index
13c30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
13c40 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
13c50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
13c60 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
13c70 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
13c80 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
13c90 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e  p tests) then an
13ca0 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
13cb0 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
13cc0 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
13cd0 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49  s> is a single I
13ce0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
13cf0 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20  EY column or an 
13d00 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65  .** index can be
13d10 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20   found with the 
13d20 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d  specified <colum
13d30 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  ns> as its left-
13d40 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  most..**.** If t
13d50 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  he IN_INDEX_NOOP
13d60 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58  _OK and IN_INDEX
13d70 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20  _MEMBERSHIP are 
13d80 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20  both set and.** 
13d90 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
13da0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
13db0 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
13dc0 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68  ubquery) then th
13dd0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69  is.** routine mi
13de0 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20  ght decide that 
13df0 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65  creating an ephe
13e00 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72  meral b-tree for
13e10 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74   membership.** t
13e20 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78  esting is too ex
13e30 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75  pensive and retu
13e40 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  rn IN_INDEX_NOOP
13e50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
13e60 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   the.** calling 
13e70 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69  routine should i
13e80 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20  mplement the IN 
13e90 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61  operator using a
13ea0 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20   sequence.** of 
13eb0 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69  Eq or Ne compari
13ec0 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  son operations..
13ed0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62  **.** When the b
13ee0 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75  -tree is being u
13ef0 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  sed for membersh
13f00 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61  ip tests, the ca
13f10 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
13f20 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  * might need to 
13f30 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
13f40 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65  not the RHS side
13f50 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
13f60 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  tor.** contains 
13f70 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68  a NULL.  If prRh
13f80 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20  sHasNull is not 
13f90 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
13fa0 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nd .** if there 
13fb0 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68  is any chance th
13fc0 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67  at the (...) mig
13fd0 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c  ht contain a NUL
13fe0 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75  L value at.** ru
13ff0 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65  ntime, then a re
14000 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
14010 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69  ted and the regi
14020 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74  ster number writ
14030 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73  ten.** to *prRhs
14040 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72  HasNull. If ther
14050 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
14060 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f  hat the (...) co
14070 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c  ntains a.** NULL
14080 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72   value, then *pr
14090 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65  RhsHasNull is le
140a0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
140b0 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
140c0 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
140d0 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20  nd its location 
140e0 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73  stored in *prRhs
140f0 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a  HasNull, then.**
14100 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
14110 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c  at register will
14120 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   be NULL if the 
14130 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20  b-tree contains 
14140 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e  one or more.** N
14150 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20  ULL values, and 
14160 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20  it will be some 
14170 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
14180 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
14190 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c  tains no.** NULL
141a0 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   values..**.** I
141b0 66 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61  f the aiMap para
141c0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  meter is not NUL
141d0 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74  L, it must point
141e0 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e   to an array con
141f0 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65  taining.** one e
14200 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20  lement for each 
14210 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20  column returned 
14220 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  by the SELECT st
14230 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52  atement on the R
14240 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28  HS.** of the IN(
14250 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54  ...) operator. T
14260 68 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66  he i'th entry of
14270 20 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f   the array is po
14280 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
14290 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68  .** offset of th
142a0 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74  e index column t
142b0 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
142c0 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75  i'th column retu
142d0 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53  rned by the.** S
142e0 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70  ELECT. For examp
142f0 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  le, if the expre
14300 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  ssion and select
14310 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a  ed index are:.**
14320 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e  .**   (?,?,?) IN
14330 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63   (SELECT a, b, c
14340 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43   FROM t1).**   C
14350 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
14360 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a  N t1(b, c, a);.*
14370 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b  *.** then aiMap[
14380 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  ] is populated w
14390 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a  ith {2, 0, 1}..*
143a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
143b0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
143c0 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
143d0 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
143e0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
143f0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
14400 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
14410 20 2a 70 58 2c 20 20 20 20 20 20 20 20 20 20 20   *pX,           
14420 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
14430 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
14440 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 20 20   u32 inFlags,   
14450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14460 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 5f 4d  N_INDEX_LOOP, _M
14470 45 4d 42 45 52 53 48 49 50 2c 20 61 6e 64 2f 6f  EMBERSHIP, and/o
14480 72 20 5f 4e 4f 4f 50 5f 4f 4b 20 2a 2f 0a 20 20  r _NOOP_OK */.  
14490 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  int *prRhsHasNul
144a0 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  l,         /* Re
144b0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 4e  gister holding N
144c0 55 4c 4c 20 73 74 61 74 75 73 2e 20 20 53 65 65  ULL status.  See
144d0 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   notes */.  int 
144e0 2a 61 69 4d 61 70 2c 20 20 20 20 20 20 20 20 20  *aiMap,         
144f0 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
14500 67 20 66 72 6f 6d 20 49 6e 64 65 78 20 66 69 65  g from Index fie
14510 6c 64 73 20 74 6f 20 52 48 53 20 66 69 65 6c 64  lds to RHS field
14520 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  s */.  int *piTa
14530 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b               
14540 20 20 2f 2a 20 4f 55 54 3a 20 69 6e 64 65 78 20    /* OUT: index 
14550 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 53  to use */.){.  S
14560 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20  elect *p;       
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14580 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74       /* SELECT t
14590 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 49  o the right of I
145a0 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
145b0 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20  int eType = 0;  
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
145e0 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49   RHS table. IN_I
145f0 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20  NDEX_* */.  int 
14600 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
14610 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  Tab++;          
14620 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74    /* Cursor of t
14630 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a  he RHS table */.
14640 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71    int mustBeUniq
14650 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
14660 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14670 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20 75  if RHS must be u
14680 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20  nique */.  Vdbe 
14690 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
146a0 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20  dbe(pParse);    
146b0 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68   /* Virtual mach
146c0 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ine being coded 
146d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58  */..  assert( pX
146e0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
146f0 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20   mustBeUnique = 
14700 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e  (inFlags & IN_IN
14710 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20  DEX_LOOP)!=0;.. 
14720 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f   /* If the RHS o
14730 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f  f this IN(...) o
14740 70 65 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c  perator is a SEL
14750 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d  ECT, and if it m
14760 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65  atters .  ** whe
14770 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
14780 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f  SELECT result co
14790 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
147a0 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65  es, check whethe
147b0 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55  r.  ** or not NU
147c0 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70  LL is actually p
147d0 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20  ossible (it may 
147e0 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d  not be, for exam
147f0 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74  ple, due .  ** t
14800 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  o NOT NULL const
14810 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63  raints in the sc
14820 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c  hema). If no NUL
14830 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73  L values are pos
14840 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20  sible,.  ** set 
14850 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20  prRhsHasNull to 
14860 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  0 before continu
14870 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
14880 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28  rRhsHasNull && (
14890 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pX->flags & EP_x
148a0 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
148b0 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72   int i;.    Expr
148c0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
148d0 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  X->x.pSelect->pE
148e0 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
148f0 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
14900 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
14910 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
14920 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d  anBeNull(pEList-
14930 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62  >a[i].pExpr) ) b
14940 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14950 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e  if( i==pEList->n
14960 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72  Expr ){.      pr
14970 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a  RhsHasNull = 0;.
14980 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14990 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
149a0 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
149b0 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62  e or index can b
149c0 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73  e used to.  ** s
149d0 61 74 69 73 66 79 20 74 68 65 20 71 75 65 72 79  atisfy the query
149e0 2e 20 20 54 68 69 73 20 69 73 20 70 72 65 66 65  .  This is prefe
149f0 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74  rable to generat
14a00 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20  ing a new .  ** 
14a10 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
14a20 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
14a30 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70  e->nErr==0 && (p
14a40 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f   = isCandidateFo
14a50 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29  rInOpt(pX))!=0 )
14a60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
14a70 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a90 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
14aa0 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
14ab0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
14ae0 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69  e>. */.    i16 i
14af0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64    /* Database id
14b20 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  x for pTab */.  
14b30 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
14b40 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
14b50 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
14b60 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
14b70 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14b80 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
14b90 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
14ba0 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
14bb0 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
14bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14bd0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
14be0 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
14bf0 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
14c00 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
14c10 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14c20 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
14c30 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
14c40 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
14c50 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
14c60 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
14c70 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
14c80 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f      /* Code an O
14c90 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  P_Transaction an
14ca0 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66  d OP_TableLock f
14cb0 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  or <table>. */. 
14cc0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
14cd0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
14ce0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
14cf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
14d00 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
14d10 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
14d20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
14d30 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
14d40 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
14d50 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
14d60 61 73 73 65 72 74 28 76 29 3b 20 20 2f 2a 20 73  assert(v);  /* s
14d70 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
14d80 68 61 73 20 61 6c 77 61 79 73 20 62 65 65 6e 20  has always been 
14d90 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
14da0 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 78  d */.    if( nEx
14db0 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d  pr==1 && pEList-
14dc0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  >a[0].pExpr->iCo
14dd0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
14de0 2f 2a 20 54 68 65 20 22 78 20 49 4e 20 28 53 45  /* The "x IN (SE
14df0 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
14e00 74 61 62 6c 65 29 22 20 63 61 73 65 20 2a 2f 0a  table)" case */.
14e10 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
14e20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14e30 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
14e40 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
14e50 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73  age(v);..      s
14e60 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
14e70 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
14e80 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
14e90 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79  Read);.      eTy
14ea0 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
14eb0 57 49 44 3b 0a 20 20 20 20 20 20 45 78 70 6c 61  WID;.      Expla
14ec0 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
14ed0 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  rse, 0,.        
14ee0 20 20 20 20 22 55 53 49 4e 47 20 52 4f 57 49 44      "USING ROWID
14ef0 20 53 45 41 52 43 48 20 4f 4e 20 54 41 42 4c 45   SEARCH ON TABLE
14f00 20 25 73 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41   %s FOR IN-OPERA
14f10 54 4f 52 22 2c 70 54 61 62 2d 3e 7a 4e 61 6d 65  TOR",pTab->zName
14f20 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
14f30 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14f40 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
14f50 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
14f60 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14f80 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
14f90 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ble */.      int
14fa0 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31   affinity_ok = 1
14fb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a  ;.      int i;..
14fc0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
14fd0 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
14fe0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
14ff0 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61  ed to perform ea
15000 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  ch .      ** com
15010 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
15020 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
15030 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75  ity of each colu
15040 6d 6e 20 69 6e 20 74 61 62 6c 65 0a 20 20 20 20  mn in table.    
15050 20 20 2a 2a 20 6f 6e 20 74 68 65 20 52 48 53 20    ** on the RHS 
15060 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
15070 6f 72 2e 20 20 49 66 20 69 74 20 6e 6f 74 2c 20  or.  If it not, 
15080 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
15090 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 75  le to.      ** u
150a0 73 65 20 61 6e 79 20 69 6e 64 65 78 20 6f 66 20  se any index of 
150b0 74 68 65 20 52 48 53 20 74 61 62 6c 65 2e 20 20  the RHS table.  
150c0 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  */.      for(i=0
150d0 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66  ; i<nExpr && aff
150e0 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a  inity_ok; i++){.
150f0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
15100 68 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  hs = sqlite3Vect
15110 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
15120 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20  X->pLeft, i);.  
15130 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
15140 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
15150 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
15160 20 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66        char idxaf
15170 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  f = sqlite3Table
15180 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
15190 54 61 62 2c 69 43 6f 6c 29 3b 20 2f 2a 20 52 48  Tab,iCol); /* RH
151a0 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  S table */.     
151b0 20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d     char cmpaff =
151c0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
151d0 66 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64  ffinity(pLhs, id
151e0 78 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 74  xaff);.        t
151f0 65 73 74 63 61 73 65 28 20 63 6d 70 61 66 66 3d  estcase( cmpaff=
15200 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
15210 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
15220 63 61 73 65 28 20 63 6d 70 61 66 66 3d 3d 53 51  case( cmpaff==SQ
15230 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
15240 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
15250 20 63 6d 70 61 66 66 20 29 7b 0a 20 20 20 20 20   cmpaff ){.     
15260 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
15270 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  _AFF_BLOB:.     
15280 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15290 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
152a0 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
152b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
152c0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
152d0 69 74 79 28 29 20 6f 6e 6c 79 20 72 65 74 75 72  ity() only retur
152e0 6e 73 20 54 45 58 54 20 69 66 20 6f 6e 65 20 73  ns TEXT if one s
152f0 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 20  ide or the.     
15300 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
15310 68 61 73 20 6e 6f 20 61 66 66 69 6e 69 74 79 20  has no affinity 
15320 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 73 69  and the other si
15330 64 65 20 69 73 20 54 45 58 54 2e 20 20 48 65 6e  de is TEXT.  Hen
15340 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ce,.            
15350 2a 2a 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  ** the only way 
15360 66 6f 72 20 63 6d 70 61 66 66 20 74 6f 20 62 65  for cmpaff to be
15370 20 54 45 58 54 20 69 73 20 66 6f 72 20 69 64 78   TEXT is for idx
15380 61 66 66 20 74 6f 20 62 65 20 54 45 58 54 0a 20  aff to be TEXT. 
15390 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e             ** an
153a0 64 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20 6f  d for the term o
153b0 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
153c0 20 49 4e 20 74 6f 20 68 61 76 65 20 6e 6f 20 61   IN to have no a
153d0 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
153e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
153f0 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  idxaff==SQLITE_A
15400 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20  FF_TEXT );.     
15410 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15420 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
15430 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66 66  .            aff
15440 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74  inity_ok = sqlit
15450 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
15460 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20 20  ity(idxaff);.   
15470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
15480 20 20 20 20 20 20 69 66 28 20 61 66 66 69 6e 69        if( affini
15490 74 79 5f 6f 6b 20 29 7b 0a 20 20 20 20 20 20 20  ty_ok ){.       
154a0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
154b0 6e 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  n existing index
154c0 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72 6b 20   that will work 
154d0 66 6f 72 20 74 68 69 73 20 49 4e 20 6f 70 65 72  for this IN oper
154e0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ator */.        
154f0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
15500 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
15510 54 79 70 65 3d 3d 30 3b 20 70 49 64 78 3d 70 49  Type==0; pIdx=pI
15520 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
15530 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 6f        Bitmask co
15540 6c 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 43  lUsed;      /* C
15550 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
15560 64 65 78 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  dex used */.    
15570 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 43        Bitmask mC
15580 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ol;         /* M
15590 61 73 6b 20 66 6f 72 20 74 68 65 20 63 75 72 72  ask for the curr
155a0 65 6e 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ent column */.  
155b0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
155c0 2d 3e 6e 43 6f 6c 75 6d 6e 3c 6e 45 78 70 72 20  ->nColumn<nExpr 
155d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
155e0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
155f0 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
15600 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
15610 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
15620 6d 20 6e 43 6f 6c 75 6d 6e 20 69 73 20 42 4d 53  m nColumn is BMS
15630 2d 32 2c 20 6e 6f 74 20 42 4d 53 2d 31 2c 20 73  -2, not BMS-1, s
15640 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 6f  o that we can co
15650 6d 70 75 74 65 0a 20 20 20 20 20 20 20 20 20 20  mpute.          
15660 2a 2a 20 42 49 54 4d 41 53 4b 28 6e 45 78 70 72  ** BITMASK(nExpr
15670 29 20 77 69 74 68 6f 75 74 20 6f 76 65 72 66 6c  ) without overfl
15680 6f 77 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  owing */.       
15690 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64     testcase( pId
156a0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d  x->nColumn==BMS-
156b0 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  2 );.          t
156c0 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 6e  estcase( pIdx->n
156d0 43 6f 6c 75 6d 6e 3d 3d 42 4d 53 2d 31 20 29 3b  Column==BMS-1 );
156e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
156f0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 42 4d  Idx->nColumn>=BM
15700 53 2d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  S-1 ) continue;.
15710 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 75            if( mu
15720 73 74 42 65 55 6e 69 71 75 65 20 29 7b 0a 20 20  stBeUnique ){.  
15730 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
15740 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 78 70  dx->nKeyCol>nExp
15750 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  r.             |
15760 7c 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  |(pIdx->nColumn>
15770 6e 45 78 70 72 20 26 26 20 21 49 73 55 6e 69 71  nExpr && !IsUniq
15780 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 0a 20  ueIndex(pIdx)). 
15790 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
157a0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
157b0 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 69  inue;  /* This i
157c0 6e 64 65 78 20 69 73 20 6e 6f 74 20 75 6e 69 71  ndex is not uniq
157d0 75 65 20 6f 76 65 72 20 74 68 65 20 49 4e 20 52  ue over the IN R
157e0 48 53 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  HS columns */.  
157f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15800 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
15810 20 20 20 20 20 63 6f 6c 55 73 65 64 20 3d 20 30       colUsed = 0
15820 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 6f  ;   /* Columns o
15830 66 20 69 6e 64 65 78 20 75 73 65 64 20 73 6f 20  f index used so 
15840 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  far */.         
15850 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
15860 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
15870 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
15880 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46  = sqlite3VectorF
15890 69 65 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e  ieldSubexpr(pX->
158a0 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20  pLeft, i);.     
158b0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 68         Expr *pRh
158c0 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s = pEList->a[i]
158d0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
158e0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65      CollSeq *pRe
158f0 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  q = sqlite3Binar
15900 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
15910 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70 52  pParse, pLhs, pR
15920 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  hs);.           
15930 20 69 6e 74 20 6a 3b 0a 20 20 0a 20 20 20 20 20   int j;.  .     
15940 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15950 52 65 71 21 3d 30 20 7c 7c 20 70 52 68 73 2d 3e  Req!=0 || pRhs->
15960 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49  iColumn==XN_ROWI
15970 44 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  D || pParse->nEr
15980 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
15990 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70   for(j=0; j<nExp
159a0 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
159b0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
159c0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52  >aiColumn[j]!=pR
159d0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  hs->iColumn ) co
159e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
159f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
15a00 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b  dx->azColl[j] );
15a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
15a20 66 28 20 70 52 65 71 21 3d 30 20 26 26 20 73 71  f( pReq!=0 && sq
15a30 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52 65  lite3StrICmp(pRe
15a40 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e  q->zName, pIdx->
15a50 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 7b  azColl[j])!=0 ){
15a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15a70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
15a80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15a90 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15aa0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
15ab0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
15ac0 3d 6e 45 78 70 72 20 29 20 62 72 65 61 6b 3b 0a  =nExpr ) break;.
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c              mCol
15ae0 20 3d 20 4d 41 53 4b 42 49 54 28 6a 29 3b 0a 20   = MASKBIT(j);. 
15af0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d             if( m
15b00 43 6f 6c 20 26 20 63 6f 6c 55 73 65 64 20 29 20  Col & colUsed ) 
15b10 62 72 65 61 6b 3b 20 2f 2a 20 45 61 63 68 20 63  break; /* Each c
15b20 6f 6c 75 6d 6e 20 75 73 65 64 20 6f 6e 6c 79 20  olumn used only 
15b30 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  once */.        
15b40 20 20 20 20 63 6f 6c 55 73 65 64 20 7c 3d 20 6d      colUsed |= m
15b50 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
15b60 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d   if( aiMap ) aiM
15b70 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20  ap[i] = j;.     
15b80 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
15b90 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e      assert( i==n
15ba0 45 78 70 72 20 7c 7c 20 63 6f 6c 55 73 65 64 21  Expr || colUsed!
15bb0 3d 28 4d 41 53 4b 42 49 54 28 6e 45 78 70 72 29  =(MASKBIT(nExpr)
15bc0 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  -1) );.         
15bd0 20 69 66 28 20 63 6f 6c 55 73 65 64 3d 3d 28 4d   if( colUsed==(M
15be0 41 53 4b 42 49 54 28 6e 45 78 70 72 29 2d 31 29  ASKBIT(nExpr)-1)
15bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15c00 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
15c10 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
15c20 6d 65 61 6e 73 20 74 68 65 20 69 6e 64 65 78 20  means the index 
15c30 70 49 64 78 20 69 73 20 75 73 61 62 6c 65 20 2a  pIdx is usable *
15c40 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
15c50 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
15c60 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
15c70 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
15c80 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
15c90 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
15ca0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
15cb0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 22 55 53 49 4e 47 20 49 4e 44 45 58 20 25 73   "USING INDEX %s
15ce0 20 46 4f 52 20 49 4e 2d 4f 50 45 52 41 54 4f 52   FOR IN-OPERATOR
15cf0 22 2c 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ",pIdx->zName));
15d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
15d10 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15d20 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
15d30 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
15d40 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20   iDb);.         
15d50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
15d60 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
15d70 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
15d80 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
15d90 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
15da0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
15db0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49         assert( I
15dc0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
15dd0 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  SC == IN_INDEX_I
15de0 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20  NDEX_ASC+1 );.  
15df0 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
15e00 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
15e10 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f  _ASC + pIdx->aSo
15e20 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 20 20 0a 20  rtOrder[0];.  . 
15e30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
15e40 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 23  rRhsHasNull ){.#
15e50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15e60 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
15e70 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 20 20 20  MASK.           
15e80 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20 28 31     i64 mask = (1
15e90 3c 3c 6e 45 78 70 72 29 2d 31 3b 0a 20 20 20 20  <<nExpr)-1;.    
15ea0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15eb0 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
15ec0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65  v, OP_ColumnsUse
15ed0 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
15ee0 20 20 20 20 20 20 69 54 61 62 2c 20 30 2c 20 30        iTab, 0, 0
15ef0 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c 20 50 34  , (u8*)&mask, P4
15f00 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a  _INT64);.#endif.
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
15f20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b  rRhsHasNull = ++
15f30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15f40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15f50 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
15f60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15f70 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
15f80 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68  g(v, iTab, *prRh
15f90 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
15fa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15fc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15fd0 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
15fe0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
15ff0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64          } /* End
16000 20 6c 6f 6f 70 20 6f 76 65 72 20 69 6e 64 65 78   loop over index
16010 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 20 2f 2a  es */.      } /*
16020 20 45 6e 64 20 69 66 28 20 61 66 66 69 6e 69 74   End if( affinit
16030 79 5f 6f 6b 20 29 20 2a 2f 0a 20 20 20 20 7d 20  y_ok ) */.    } 
16040 2f 2a 20 45 6e 64 20 69 66 20 6e 6f 74 20 61 6e  /* End if not an
16050 20 72 6f 77 69 64 20 69 6e 64 65 78 20 2a 2f 0a   rowid index */.
16060 20 20 7d 20 2f 2a 20 45 6e 64 20 61 74 74 65 6d    } /* End attem
16070 70 74 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 75  pt to optimize u
16080 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 2a 2f  sing an index */
16090 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65  ..  /* If no pre
160a0 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69  existing index i
160b0 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  s available for 
160c0 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20  the IN clause.  
160d0 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  ** and IN_INDEX_
160e0 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77  NOOP is an allow
160f0 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e  ed reply.  ** an
16100 64 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  d the RHS of the
16110 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
16120 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75  a list, not a su
16130 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20  bquery.  ** and 
16140 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63  the RHS is not c
16150 6f 6e 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74  onstant or has t
16160 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d  wo or fewer term
16170 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20  s,.  ** then it 
16180 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65  is not worth cre
16190 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ating an ephemer
161a0 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c  al table to eval
161b0 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e  uate.  ** the IN
161c0 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74   operator so ret
161d0 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  urn IN_INDEX_NOO
161e0 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  P..  */.  if( eT
161f0 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e  ype==0.   && (in
16200 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
16210 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20  _NOOP_OK).   && 
16220 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
16230 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
16240 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74  t).   && (!sqlit
16250 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e  e3InRhsIsConstan
16260 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70  t(pX) || pX->x.p
16270 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a  List->nExpr<=2).
16280 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d    ){.    eType =
16290 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a   IN_INDEX_NOOP;.
162a0 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
162b0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  ==0 ){.    /* Co
162c0 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20  uld not find an 
162d0 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
162e0 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61  r index to use a
162f0 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65  s the RHS b-tree
16300 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c  ..    ** We will
16310 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74   have to generat
16320 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
16330 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a  able to do the j
16340 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ob..    */.    u
16350 33 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  32 savedNQueryLo
16360 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
16370 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  eryLoop;.    int
16380 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
16390 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  0;.    eType = I
163a0 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20  N_INDEX_EPH;.   
163b0 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49   if( inFlags & I
163c0 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a  N_INDEX_LOOP ){.
163d0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51        pParse->nQ
163e0 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20  ueryLoop = 0;.  
163f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68    }else if( prRh
16400 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  sHasNull ){.    
16410 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
16420 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  = rMayHaveNull =
16430 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
16440 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
16450 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
16460 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
16470 6f 64 65 52 68 73 4f 66 49 4e 28 70 50 61 72 73  odeRhsOfIN(pPars
16480 65 2c 20 70 58 2c 20 69 54 61 62 29 3b 0a 20 20  e, pX, iTab);.  
16490 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75    if( rMayHaveNu
164a0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
164b0 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
164c0 67 28 76 2c 20 69 54 61 62 2c 20 72 4d 61 79 48  g(v, iTab, rMayH
164d0 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  aveNull);.    }.
164e0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65      pParse->nQue
164f0 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51  ryLoop = savedNQ
16500 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 0a 0a 20  ueryLoop;.  }.. 
16510 20 69 66 28 20 61 69 4d 61 70 20 26 26 20 65 54   if( aiMap && eT
16520 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype!=IN_INDEX_IN
16530 44 45 58 5f 41 53 43 20 26 26 20 65 54 79 70 65  DEX_ASC && eType
16540 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  !=IN_INDEX_INDEX
16550 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74  _DESC ){.    int
16560 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73   i, n;.    n = s
16570 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
16580 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b  Size(pX->pLeft);
16590 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
165a0 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d  n; i++) aiMap[i]
165b0 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 2a 70 69 54   = i;.  }.  *piT
165c0 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 72 65 74  ab = iTab;.  ret
165d0 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e  urn eType;.}.#en
165e0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
165f0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16600 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  Y./*.** Argument
16610 20 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c   pExpr is an (?,
16620 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65   ?...) IN(...) e
16630 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20  xpression. This 
16640 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
16650 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
16660 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  ns a nul-termina
16670 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
16680 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66  ining .** the af
16690 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75  finities to be u
166a0 73 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  sed for each col
166b0 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  umn of the compa
166c0 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  rison..**.** It 
166d0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
166e0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
166f0 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ler to ensure th
16700 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  at the returned.
16710 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76 65  ** string is eve
16720 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
16730 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
16740 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  e()..*/.static c
16750 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e  har *exprINAffin
16760 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
16770 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
16780 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d  .  Expr *pLeft =
16790 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
167a0 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
167b0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
167c0 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65  e(pLeft);.  Sele
167d0 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70  ct *pSelect = (p
167e0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
167f0 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45  _xIsSelect) ? pE
16800 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a  xpr->x.pSelect :
16810 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74   0;.  char *zRet
16820 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ;..  assert( pEx
16830 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
16840 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65  .  zRet = sqlite
16850 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61  3DbMallocRaw(pPa
16860 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29  rse->db, nVal+1)
16870 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a  ;.  if( zRet ){.
16880 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
16890 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20  or(i=0; i<nVal; 
168a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
168b0 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56 65   *pA = sqlite3Ve
168c0 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
168d0 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  (pLeft, i);.    
168e0 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69 74    char a = sqlit
168f0 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
16900 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  A);.      if( pS
16910 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
16920 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74   zRet[i] = sqlit
16930 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
16940 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  y(pSelect->pELis
16950 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61  t->a[i].pExpr, a
16960 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16970 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20          zRet[i] 
16980 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
16990 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c   }.    zRet[nVal
169a0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
169b0 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
169c0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
169d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
169e0 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  ERY./*.** Load t
169f0 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
16a00 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
16a10 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rst argument wit
16a20 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d  h an error .** m
16a30 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66 6f  essage of the fo
16a40 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62  rm:.**.**   "sub
16a50 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73 20  -select returns 
16a60 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65  N columns - expe
16a70 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f  cted M".*/   .vo
16a80 69 64 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c  id sqlite3Subsel
16a90 65 63 74 45 72 72 6f 72 28 50 61 72 73 65 20 2a  ectError(Parse *
16aa0 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63 74  pParse, int nAct
16ab0 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63 74  ual, int nExpect
16ac0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
16ad0 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c  *zFmt = "sub-sel
16ae0 65 63 74 20 72 65 74 75 72 6e 73 20 25 64 20 63  ect returns %d c
16af0 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
16b00 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65 33  d %d";.  sqlite3
16b10 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16b20 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20   zFmt, nActual, 
16b30 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64  nExpect);.}.#end
16b40 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73  if../*.** Expres
16b50 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 61 20  sion pExpr is a 
16b60 76 65 63 74 6f 72 20 74 68 61 74 20 68 61 73 20  vector that has 
16b70 62 65 65 6e 20 75 73 65 64 20 69 6e 20 61 20 63  been used in a c
16b80 6f 6e 74 65 78 74 20 77 68 65 72 65 0a 2a 2a 20  ontext where.** 
16b90 69 74 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  it is not permit
16ba0 74 65 64 2e 20 49 66 20 70 45 78 70 72 20 69 73  ted. If pExpr is
16bb0 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 76 65   a sub-select ve
16bc0 63 74 6f 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ctor, this routi
16bd0 6e 65 20 0a 2a 2a 20 6c 6f 61 64 73 20 74 68 65  ne .** loads the
16be0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 77 69   Parse object wi
16bf0 74 68 20 61 20 6d 65 73 73 61 67 65 20 6f 66 20  th a message of 
16c00 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
16c10 20 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72 65    "sub-select re
16c20 74 75 72 6e 73 20 4e 20 63 6f 6c 75 6d 6e 73 20  turns N columns 
16c30 2d 20 65 78 70 65 63 74 65 64 20 31 22 0a 2a 2a  - expected 1".**
16c40 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 74 20 69 73  .** Or, if it is
16c50 20 61 20 72 65 67 75 6c 61 72 20 73 63 61 6c 61   a regular scala
16c60 72 20 76 65 63 74 6f 72 3a 0a 2a 2a 0a 2a 2a 20  r vector:.**.** 
16c70 20 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73    "row value mis
16c80 75 73 65 64 22 0a 2a 2f 20 20 20 0a 76 6f 69 64  used".*/   .void
16c90 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72   sqlite3VectorEr
16ca0 72 6f 72 4d 73 67 28 50 61 72 73 65 20 2a 70 50  rorMsg(Parse *pP
16cb0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
16cc0 72 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r){.#ifndef SQLI
16cd0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
16ce0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
16cf0 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
16d00 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
16d10 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
16d20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 78  pParse, pExpr->x
16d30 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
16d40 2d 3e 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 7d  ->nExpr, 1);.  }
16d50 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
16d60 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16d70 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
16d80 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
16d90 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
16da0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
16db0 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
16dc0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
16dd0 69 6c 6c 20 63 6f 6e 73 74 72 75 63 74 20 61 6e  ill construct an
16de0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
16df0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20   containing all 
16e00 74 65 72 6d 73 0a 2a 2a 20 69 6e 20 74 68 65 20  terms.** in the 
16e10 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
16e20 72 61 74 6f 72 2e 20 20 54 68 65 20 49 4e 20 6f  rator.  The IN o
16e30 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65 20 69  perator can be i
16e40 6e 20 65 69 74 68 65 72 20 6f 66 20 74 77 6f 0a  n either of two.
16e50 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  ** forms:.**.** 
16e60 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31      x IN (4,5,11
16e70 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  )              -
16e80 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
16e90 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74  th list on right
16ea0 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20  -hand side.**   
16eb0 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61    x IN (SELECT a
16ec0 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20   FROM b)     -- 
16ed0 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
16ee0 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
16ef0 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65   right.**.** The
16f00 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
16f10 20 69 73 20 74 68 65 20 49 4e 20 6f 70 65 72 61   is the IN opera
16f20 74 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72  tor.  The cursor
16f30 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a   number for the.
16f40 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20 65  ** constructed e
16f50 70 68 65 72 6d 65 72 61 6c 20 74 61 62 6c 65 20  phermeral table 
16f60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68  is returned.  Th
16f70 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
16f80 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61   ephemeral.** ta
16f90 62 6c 65 20 69 73 20 63 6f 6d 70 75 74 65 64 2c  ble is computed,
16fa0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
16fb0 65 72 20 69 73 20 61 6c 73 6f 20 73 74 6f 72 65  er is also store
16fc0 64 20 69 6e 20 70 45 78 70 72 2d 3e 69 54 61 62  d in pExpr->iTab
16fd0 6c 65 2c 0a 2a 2a 20 68 6f 77 65 76 65 72 20 74  le,.** however t
16fe0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
16ff0 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20   returned might 
17000 6e 6f 74 20 62 65 20 74 68 65 20 73 61 6d 65 2c  not be the same,
17010 20 61 73 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20   as it might.** 
17020 68 61 76 65 20 62 65 65 6e 20 64 75 70 6c 69 63  have been duplic
17030 61 74 65 64 20 75 73 69 6e 67 20 4f 50 5f 4f 70  ated using OP_Op
17040 65 6e 44 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  enDup..**.** If 
17050 74 68 65 20 4c 48 53 20 65 78 70 72 65 73 73 69  the LHS expressi
17060 6f 6e 20 28 22 78 22 20 69 6e 20 74 68 65 20 65  on ("x" in the e
17070 78 61 6d 70 6c 65 73 29 20 69 73 20 61 20 63 6f  xamples) is a co
17080 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 0a 2a  lumn value, or.*
17090 2a 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  * the SELECT sta
170a0 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
170b0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
170c0 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
170d0 20 6f 66 20 74 68 61 74 0a 2a 2a 20 63 6f 6c 75   of that.** colu
170e0 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
170f0 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
17100 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
17110 61 6e 64 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43  and the.** SELEC
17120 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
17130 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
17140 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
17150 79 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 66 20  y is used.** if 
17160 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
17170 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
17180 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
17190 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 27 78 27  f neither.** 'x'
171a0 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e   nor the SELECT.
171b0 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
171c0 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
171d0 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a  umeric affinity.
171e0 2a 2a 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76  ** is used..*/.v
171f0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 52  oid sqlite3CodeR
17200 68 73 4f 66 49 4e 28 0a 20 20 50 61 72 73 65 20  hsOfIN(.  Parse 
17210 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
17220 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
17230 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
17240 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
17250 20 20 2f 2a 20 54 68 65 20 49 4e 20 6f 70 65 72    /* The IN oper
17260 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ator */.  int iT
17270 61 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ab              
17280 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 63 75    /* Use this cu
17290 72 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  rsor number */.)
172a0 7b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65  {.  int addrOnce
172b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
172c0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
172d0 65 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75  e OP_Once instru
172e0 63 74 69 6f 6e 20 61 74 20 74 6f 70 20 2a 2f 0a  ction at top */.
172f0 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17310 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
17320 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
17330 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  truction */.  Ex
17340 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
17350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
17360 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
17370 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 4b 65 79  perator */.  Key
17380 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
17390 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20   0;      /* Key 
173a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
173b0 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20   int nVal;      
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
173d0 53 69 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70  Size of vector p
173e0 4c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  Left */.  Vdbe *
173f0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
17400 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
17410 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
17420 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
17430 6f 6e 20 2a 2f 0a 0a 20 20 76 20 3d 20 70 50 61  on */..  v = pPa
17440 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
17450 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20  sert( v!=0 );.. 
17460 20 2f 2a 20 54 68 65 20 65 76 61 6c 75 61 74 69   /* The evaluati
17470 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 6d 75 73  on of the IN mus
17480 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65 76  t be repeated ev
17490 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a 2a  ery time it.  **
174a0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
174b0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
174c0 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
174d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
174e0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
174f0 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
17500 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
17510 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
17520 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
17530 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
17540 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
17550 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
17560 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
17570 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
17580 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
17590 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
175a0 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
175b0 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 20  compute the RHS 
175c0 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 61  just once.  ** a
175d0 6e 64 20 72 65 75 73 65 20 69 74 20 6d 61 6e 79  nd reuse it many
175e0 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 69   names..  */.  i
175f0 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
17600 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
17610 72 53 65 6c 65 63 74 29 20 26 26 20 70 50 61 72  rSelect) && pPar
17620 73 65 2d 3e 69 53 65 6c 66 54 61 62 3d 3d 30 20  se->iSelfTab==0 
17630 29 7b 0a 20 20 20 20 2f 2a 20 52 65 75 73 65 20  ){.    /* Reuse 
17640 6f 66 20 74 68 65 20 52 48 53 20 69 73 20 61 6c  of the RHS is al
17650 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 2f 2a 20  lowed */.    /* 
17660 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
17670 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
17680 20 63 6f 64 65 64 2c 20 62 75 74 20 74 68 65 20   coded, but the 
17690 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20  previous code.  
176a0 20 20 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 68    ** might not h
176b0 61 76 65 20 62 65 65 6e 20 69 6e 76 6f 6b 65 64  ave been invoked
176c0 20 79 65 74 2c 20 73 6f 20 69 6e 76 6f 6b 65 20   yet, so invoke 
176d0 69 74 20 6e 6f 77 20 61 73 20 61 20 73 75 62 72  it now as a subr
176e0 6f 75 74 69 6e 65 2e 20 0a 20 20 20 20 2a 2f 0a  outine. .    */.
176f0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
17700 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17710 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20 20 20  P_Subrtn) ){.   
17720 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
17730 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
17740 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
17750 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17760 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
17770 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17780 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
17790 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
177a0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
177b0 2c 20 30 2c 20 22 52 45 55 53 45 20 4c 49 53 54  , 0, "REUSE LIST
177c0 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20   SUBQUERY %d",. 
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
177e0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 73  pr->x.pSelect->s
177f0 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 7d 0a  elId));.      }.
17800 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17810 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
17820 73 75 62 2c 20 70 45 78 70 72 2d 3e 79 2e 73 75  sub, pExpr->y.su
17830 62 2e 72 65 67 52 65 74 75 72 6e 2c 0a 20 20 20  b.regReturn,.   
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17850 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75       pExpr->y.su
17860 62 2e 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  b.iAddr);.      
17870 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17880 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
17890 20 69 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 54   iTab, pExpr->iT
178a0 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  able);.      sql
178b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
178c0 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20  (v, addrOnce);. 
178d0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
178e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e   }..    /* Begin
178f0 20 63 6f 64 69 6e 67 20 74 68 65 20 73 75 62 72   coding the subr
17900 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78  outine */.    Ex
17910 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
17920 78 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b  xpr, EP_Subrtn);
17930 0a 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75  .    pExpr->y.su
17940 62 2e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  b.regReturn = ++
17950 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
17960 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69    pExpr->y.sub.i
17970 41 64 64 72 20 3d 0a 20 20 20 20 20 20 73 71 6c  Addr =.      sql
17980 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17990 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
179a0 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65   pExpr->y.sub.re
179b0 67 52 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20  gReturn) + 1;.  
179c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
179d0 2c 20 22 72 65 74 75 72 6e 20 61 64 64 72 65 73  , "return addres
179e0 73 22 29 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f  s"));..    addrO
179f0 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nce = sqlite3Vdb
17a00 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
17a10 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
17a20 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(v);.  }..  /* 
17a30 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
17a40 74 68 69 73 20 69 73 20 61 20 76 65 63 74 6f 72  this is a vector
17a50 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
17a60 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
17a70 3e 70 4c 65 66 74 3b 0a 20 20 6e 56 61 6c 20 3d  >pLeft;.  nVal =
17a80 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
17a90 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 0a  orSize(pLeft);..
17aa0 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
17ab0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
17ac0 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6e  le that will con
17ad0 74 61 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  tain the content
17ae0 20 6f 66 0a 20 20 2a 2a 20 52 48 53 20 6f 66 20   of.  ** RHS of 
17af0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  the IN operator.
17b00 0a 20 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69  .  */.  pExpr->i
17b10 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
17b20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
17b30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
17b40 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45  penEphemeral, pE
17b50 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 56 61  xpr->iTable, nVa
17b60 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
17b70 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
17b80 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 69 66 28 20  _COMMENTS.  if( 
17b90 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
17ba0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
17bb0 65 63 74 29 20 29 7b 0a 20 20 20 20 56 64 62 65  ect) ){.    Vdbe
17bc0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 65 73  Comment((v, "Res
17bd0 75 6c 74 20 6f 66 20 53 45 4c 45 43 54 20 25 75  ult of SELECT %u
17be0 22 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  ", pExpr->x.pSel
17bf0 65 63 74 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20  ect->selId));.  
17c00 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 43  }else{.    VdbeC
17c10 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 52 48 53 20  omment((v, "RHS 
17c20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 22 29  of IN operator")
17c30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
17c40 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
17c50 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
17c60 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c  Parse->db, nVal,
17c70 20 31 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72   1);..  if( Expr
17c80 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17c90 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
17ca0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
17cb0 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  1:     expr IN (
17cc0 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20  SELECT ...).    
17cd0 2a 2a 0a 20 20 20 20 2a 2a 20 47 65 6e 65 72 61  **.    ** Genera
17ce0 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
17cf0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
17d00 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
17d10 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
17d20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
17d30 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
17d40 61 62 6f 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  above..    */.  
17d50 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
17d60 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  t = pExpr->x.pSe
17d70 6c 65 63 74 3b 0a 20 20 20 20 45 78 70 72 4c 69  lect;.    ExprLi
17d80 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65  st *pEList = pSe
17d90 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20  lect->pEList;.. 
17da0 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
17db0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
17dc0 22 25 73 4c 49 53 54 20 53 55 42 51 55 45 52 59  "%sLIST SUBQUERY
17dd0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 61 64   %d",.        ad
17de0 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52 52 45  drOnce?"":"CORRE
17df0 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 65 63 74  LATED ", pSelect
17e00 2d 3e 73 65 6c 49 64 0a 20 20 20 20 29 29 3b 0a  ->selId.    ));.
17e10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48      /* If the LH
17e20 53 20 61 6e 64 20 52 48 53 20 6f 66 20 74 68 65  S and RHS of the
17e30 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 6f 20   IN operator do 
17e40 6e 6f 74 20 6d 61 74 63 68 2c 20 74 68 61 74 0a  not match, that.
17e50 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 77 69 6c      ** error wil
17e60 6c 20 68 61 76 65 20 62 65 65 6e 20 63 61 75 67  l have been caug
17e70 68 74 20 6c 6f 6e 67 20 62 65 66 6f 72 65 20 77  ht long before w
17e80 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
17e90 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 41  nt. */.    if( A
17ea0 4c 57 41 59 53 28 70 45 4c 69 73 74 2d 3e 6e 45  LWAYS(pEList->nE
17eb0 78 70 72 3d 3d 6e 56 61 6c 29 20 29 7b 0a 20 20  xpr==nVal) ){.  
17ec0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
17ed0 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  est;.      int i
17ee0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
17ef0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
17f00 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 54  est, SRT_Set, iT
17f10 61 62 29 3b 0a 20 20 20 20 20 20 64 65 73 74 2e  ab);.      dest.
17f20 7a 41 66 66 53 64 73 74 20 3d 20 65 78 70 72 49  zAffSdst = exprI
17f30 4e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  NAffinity(pParse
17f40 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
17f50 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
17f60 3d 20 30 3b 0a 20 20 20 20 20 20 74 65 73 74 63  = 0;.      testc
17f70 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65  ase( pSelect->se
17f80 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
17f90 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
17fa0 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f  stcase( pKeyInfo
17fb0 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64  ==0 ); /* Caused
17fc0 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74   by OOM in sqlit
17fd0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29  e3KeyInfoAlloc()
17fe0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
17ff0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
18000 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
18010 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  st) ){.        s
18020 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
18030 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41  rse->db, dest.zA
18040 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  ffSdst);.       
18050 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
18060 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
18070 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
18080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
18090 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
180a0 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66  se->db, dest.zAf
180b0 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 61 73  fSdst);.      as
180c0 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d  sert( pKeyInfo!=
180d0 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c  0 ); /* OOM will
180e0 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65   cause exit afte
180f0 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  r sqlite3Select(
18100 29 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  ) */.      asser
18110 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
18120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
18130 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
18140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
18150 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
18160 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
18170 6f 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  o) );.      for(
18180 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  i=0; i<nVal; i++
18190 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
181a0 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74  *p = sqlite3Vect
181b0 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70  orFieldSubexpr(p
181c0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
181d0 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
181e0 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[i] = sqlite3Bi
181f0 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
18200 65 71 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  eq(.            
18210 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
18220 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20 20  t->a[i].pExpr.  
18230 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
18240 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
18250 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
18260 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a  >x.pList!=0) ){.
18270 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
18280 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
18290 6c 69 73 74 29 0a 20 20 20 20 2a 2a 0a 20 20 20  list).    **.   
182a0 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
182b0 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
182c0 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
182d0 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
182e0 61 6e 64 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  and.    ** store
182f0 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
18300 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
18310 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
18320 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
18330 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
18340 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
18350 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
18360 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
18370 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 20 63 6f 6c  not.    ** a col
18380 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
18390 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a   affinity..    *
183a0 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66 69 6e  /.    char affin
183b0 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ity;            
183c0 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  /* Affinity of t
183d0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
183e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   */.    int i;. 
183f0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
18400 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
18410 69 73 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ist;.    struct 
18420 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
18430 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72 31  Item;.    int r1
18440 2c 20 72 32 3b 0a 20 20 20 20 61 66 66 69 6e 69  , r2;.    affini
18450 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
18460 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
18470 0a 20 20 20 20 69 66 28 20 61 66 66 69 6e 69 74  .    if( affinit
18480 79 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  y<=SQLITE_AFF_NO
18490 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 66 66 69  NE ){.      affi
184a0 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
184b0 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20  F_BLOB;.    }.  
184c0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
184d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
184e0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
184f0 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
18500 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 70 4b 65  fo) );.      pKe
18510 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20  yInfo->aColl[0] 
18520 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
18530 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
18540 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
18550 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  }..    /* Loop t
18560 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
18570 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
18580 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 72 31 20  ist>. */.    r1 
18590 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
185a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
185b0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
185c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
185d0 0a 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74  .    for(i=pList
185e0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
185f0 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
18600 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
18610 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
18620 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20  Item->pExpr;..  
18630 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78      /* If the ex
18640 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
18650 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65  constant then we
18660 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20   will need to.  
18670 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
18680 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
18690 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
186a0 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
186b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
186c0 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65  ode only execute
186d0 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65  s once.  Because
186e0 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74   for a non-const
186f0 61 6e 74 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  ant.      ** exp
18700 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
18710 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
18720 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
18730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
18740 20 61 64 64 72 4f 6e 63 65 20 26 26 20 21 73 71   addrOnce && !sq
18750 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
18760 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
18770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18780 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
18790 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 20 20  ddrOnce);.      
187a0 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65    ExprClearPrope
187b0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 75  rty(pExpr, EP_Su
187c0 62 72 74 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  brtn);.        a
187d0 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20  ddrOnce = 0;.   
187e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
187f0 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
18800 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
18810 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
18820 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
18830 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
18840 65 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72  e(pParse, pE2, r
18850 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
18860 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18870 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 31  P_MakeRecord, r1
18880 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
18890 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ty, 1);.      sq
188a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
188b0 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
188c0 72 74 2c 20 69 54 61 62 2c 20 72 32 2c 20 72 31  rt, iTab, r2, r1
188d0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
188e0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
188f0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
18900 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
18910 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18920 72 73 65 2c 20 72 32 29 3b 0a 20 20 7d 0a 20 20  rse, r2);.  }.  
18930 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
18940 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18950 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
18960 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66   (void *)pKeyInf
18970 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
18980 20 20 7d 0a 20 20 69 66 28 20 61 64 64 72 4f 6e    }.  if( addrOn
18990 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ce ){.    sqlite
189a0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
189b0 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
189c0 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72 65  /* Subroutine re
189d0 74 75 72 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  turn */.    sqli
189e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
189f0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 45 78 70   OP_Return, pExp
18a00 72 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75  r->y.sub.regRetu
18a10 72 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rn);.    sqlite3
18a20 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
18a30 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41 64  pExpr->y.sub.iAd
18a40 64 72 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  dr-1, sqlite3Vdb
18a50 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
18a60 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  1);.    sqlite3C
18a70 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
18a80 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 7d 0a  (pParse);.  }.}.
18a90 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
18aa0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
18ab0 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  /../*.** Generat
18ac0 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
18ad0 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
18ae0 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
18af0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6f 72  expression.** or
18b00 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
18b10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
18b20 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
18b30 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
18b40 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
18b50 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
18b60 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
18b70 75 62 71 75 65 72 79 0a 2a 2a 0a 2a 2a 20 54 68  ubquery.**.** Th
18b80 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
18b90 72 20 69 73 20 74 68 65 20 53 45 4c 45 43 54 20  r is the SELECT 
18ba0 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
18bb0 6f 72 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  or to be coded..
18bc0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
18bd0 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
18be0 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 2e  olds the result.
18bf0 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f    For a multi-co
18c00 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 0a 2a 2a  lumn SELECT, .**
18c10 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
18c20 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69  tored in a conti
18c30 67 75 6f 75 73 20 61 72 72 61 79 20 6f 66 20 72  guous array of r
18c40 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
18c50 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
18c60 20 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72   is the register
18c70 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   of the left-mos
18c80 74 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e  t result column.
18c90 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
18ca0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
18cb0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
18cc0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
18cd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
18ce0 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20  Subselect(Parse 
18cf0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
18d00 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 61 64 64  Expr){.  int add
18d10 72 4f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20  rOnce = 0;      
18d20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18d30 6f 66 20 4f 50 5f 4f 6e 63 65 20 61 74 20 74 6f  of OP_Once at to
18d40 70 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  p of subroutine 
18d50 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20  */.  int rReg = 
18d60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18d70 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f   /* Register sto
18d80 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a  ring resulting *
18d90 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
18da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18db0 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
18dc0 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
18dd0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
18de0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
18df0 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69  * How to deal wi
18e00 74 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  th SELECT result
18e10 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20   */.  int nReg; 
18e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e30 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 74    /* Registers t
18e40 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
18e50 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20  Expr *pLimit;   
18e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18e70 65 77 20 6c 69 6d 69 74 20 65 78 70 72 65 73 73  ew limit express
18e80 69 6f 6e 20 2a 2f 0a 0a 20 20 56 64 62 65 20 2a  ion */..  Vdbe *
18e90 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
18ea0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
18eb0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
18ec0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
18ed0 58 49 53 54 53 20 29 3b 0a 20 20 74 65 73 74 63  XISTS );.  testc
18ee0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
18ef0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 61  TK_SELECT );.  a
18f00 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
18f10 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70  ==TK_EXISTS || p
18f20 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
18f30 45 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ECT );.  assert(
18f40 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
18f50 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
18f60 6c 65 63 74 29 20 29 3b 0a 20 20 70 53 65 6c 20  lect) );.  pSel 
18f70 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
18f80 63 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76  ct;..  /* The ev
18f90 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  aluation of the 
18fa0 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75  EXISTS/SELECT mu
18fb0 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
18fc0 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
18fd0 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
18fe0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
18ff0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
19000 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
19010 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
19020 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
19030 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
19040 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
19050 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
19060 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
19070 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
19080 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
19090 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
190a0 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
190b0 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
190c0 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
190d0 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
190e0 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
190f0 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
19100 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
19110 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
19120 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
19130 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
19140 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
19150 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
19160 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
19170 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  lect) ){.    /* 
19180 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
19190 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
191a0 20 63 6f 64 65 64 2c 20 74 68 65 6e 20 69 6e 76   coded, then inv
191b0 6f 6b 65 20 69 74 20 61 73 20 61 0a 20 20 20 20  oke it as a.    
191c0 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 2a  ** subroutine. *
191d0 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  /.    if( ExprHa
191e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
191f0 20 45 50 5f 53 75 62 72 74 6e 29 20 29 7b 0a 20   EP_Subrtn) ){. 
19200 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
19210 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
19220 2c 20 22 52 45 55 53 45 20 53 55 42 51 55 45 52  , "REUSE SUBQUER
19230 59 20 25 64 22 2c 20 70 53 65 6c 2d 3e 73 65 6c  Y %d", pSel->sel
19240 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Id));.      sqli
19250 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19260 20 4f 50 5f 47 6f 73 75 62 2c 20 70 45 78 70 72   OP_Gosub, pExpr
19270 2d 3e 79 2e 73 75 62 2e 72 65 67 52 65 74 75 72  ->y.sub.regRetur
19280 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
19290 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
192a0 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 29 3b 0a  ->y.sub.iAddr);.
192b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45 78        return pEx
192c0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
192d0 7d 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  }..    /* Begin 
192e0 63 6f 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  coding the subro
192f0 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 45 78 70  utine */.    Exp
19300 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
19310 70 72 2c 20 45 50 5f 53 75 62 72 74 6e 29 3b 0a  pr, EP_Subrtn);.
19320 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 73 75 62      pExpr->y.sub
19330 2e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  .regReturn = ++p
19340 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
19350 20 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 69 41   pExpr->y.sub.iA
19360 64 64 72 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  ddr =.      sqli
19370 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19380 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
19390 70 45 78 70 72 2d 3e 79 2e 73 75 62 2e 72 65 67  pExpr->y.sub.reg
193a0 52 65 74 75 72 6e 29 20 2b 20 31 3b 0a 20 20 20  Return) + 1;.   
193b0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
193c0 20 22 72 65 74 75 72 6e 20 61 64 64 72 65 73 73   "return address
193d0 22 29 29 3b 0a 0a 20 20 20 20 61 64 64 72 4f 6e  "));..    addrOn
193e0 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
193f0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
19400 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
19410 28 76 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  (v);.  }.  .  /*
19420 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67   For a SELECT, g
19430 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
19440 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66  put the values f
19450 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  or all columns o
19460 66 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  f.  ** the first
19470 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72   row into an arr
19480 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
19490 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 69  and return the i
194a0 6e 64 65 78 20 6f 66 0a 20 20 2a 2a 20 74 68 65  ndex of.  ** the
194b0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 2e   first register.
194c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
194d0 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c  is is an EXISTS,
194e0 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65   write an intege
194f0 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
19500 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20   or 1 (exists). 
19510 20 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73   ** into a regis
19520 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ter and return t
19530 68 61 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d  hat register num
19540 62 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ber..  **.  ** I
19550 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68  n both cases, th
19560 65 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65  e query is augme
19570 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54  nted with "LIMIT
19580 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 2a 2a 20   1".  Any .  ** 
19590 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69  preexisting limi
195a0 74 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69  t is discarded i
195b0 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e  n place of the n
195c0 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 2a 2f  ew LIMIT 1..  */
195d0 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
195e0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
195f0 22 25 73 53 43 41 4c 41 52 20 53 55 42 51 55 45  "%sSCALAR SUBQUE
19600 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  RY %d",.        
19610 61 64 64 72 4f 6e 63 65 3f 22 22 3a 22 43 4f 52  addrOnce?"":"COR
19620 52 45 4c 41 54 45 44 20 22 2c 20 70 53 65 6c 2d  RELATED ", pSel-
19630 3e 73 65 6c 49 64 29 29 3b 0a 20 20 6e 52 65 67  >selId));.  nReg
19640 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
19650 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e  _SELECT ? pSel->
19660 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  pEList->nExpr : 
19670 31 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  1;.  sqlite3Sele
19680 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
19690 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  , 0, pParse->nMe
196a0 6d 2b 31 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  m+1);.  pParse->
196b0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
196c0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
196d0 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
196e0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
196f0 5f 4d 65 6d 3b 0a 20 20 20 20 64 65 73 74 2e 69  _Mem;.    dest.i
19700 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
19710 61 72 6d 3b 0a 20 20 20 20 64 65 73 74 2e 6e 53  arm;.    dest.nS
19720 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  dst = nReg;.    
19730 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19740 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
19750 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 64   dest.iSDParm, d
19760 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52 65 67  est.iSDParm+nReg
19770 2d 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  -1);.    VdbeCom
19780 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
19790 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
197a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
197b0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
197c0 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 73 71 6c  _Exists;.    sql
197d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
197e0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
197f0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
19800 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19810 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
19820 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 7d 0a   result"));.  }.
19830 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 4c 69 6d    if( pSel->pLim
19840 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  it ){.    /* The
19850 20 73 75 62 71 75 65 72 79 20 61 6c 72 65 61 64   subquery alread
19860 79 20 68 61 73 20 61 20 6c 69 6d 69 74 2e 20 20  y has a limit.  
19870 49 66 20 74 68 65 20 70 72 65 2d 65 78 69 73 74  If the pre-exist
19880 69 6e 67 20 6c 69 6d 69 74 20 69 73 20 58 0a 20  ing limit is X. 
19890 20 20 20 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20     ** then make 
198a0 74 68 65 20 6e 65 77 20 6c 69 6d 69 74 20 58 3c  the new limit X<
198b0 3e 30 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  >0 so that the n
198c0 65 77 20 6c 69 6d 69 74 20 69 73 20 65 69 74 68  ew limit is eith
198d0 65 72 20 31 20 6f 72 20 30 20 2a 2f 0a 20 20 20  er 1 or 0 */.   
198e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
198f0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70  Parse->db;.    p
19900 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
19910 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
19920 45 52 2c 20 22 30 22 29 3b 0a 20 20 20 20 69 66  ER, "0");.    if
19930 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ( pLimit ){.    
19940 20 20 70 4c 69 6d 69 74 2d 3e 61 66 66 45 78 70    pLimit->affExp
19950 72 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  r = SQLITE_AFF_N
19960 55 4d 45 52 49 43 3b 0a 20 20 20 20 20 20 70 4c  UMERIC;.      pL
19970 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
19980 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e  xpr(pParse, TK_N
19990 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
199b0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
199c0 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e  , pSel->pLimit->
199d0 70 4c 65 66 74 2c 20 30 29 2c 20 70 4c 69 6d 69  pLeft, 0), pLimi
199e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
199f0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
19a00 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
19a10 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 53  ->pLeft);.    pS
19a20 65 6c 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  el->pLimit->pLef
19a30 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 7d 65  t = pLimit;.  }e
19a40 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
19a50 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65 2d 65  here is no pre-e
19a60 78 69 73 74 69 6e 67 20 6c 69 6d 69 74 20 61 64  xisting limit ad
19a70 64 20 61 20 6c 69 6d 69 74 20 6f 66 20 31 20 2a  d a limit of 1 *
19a80 2f 0a 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 73  /.    pLimit = s
19a90 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
19aa0 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  e->db, TK_INTEGE
19ab0 52 2c 20 22 31 22 29 3b 0a 20 20 20 20 70 53 65  R, "1");.    pSe
19ac0 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
19ad0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
19ae0 20 54 4b 5f 4c 49 4d 49 54 2c 20 70 4c 69 6d 69   TK_LIMIT, pLimi
19af0 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 53 65  t, 0);.  }.  pSe
19b00 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  l->iLimit = 0;. 
19b10 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
19b20 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
19b30 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 72   &dest) ){.    r
19b40 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
19b50 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72  Expr->iTable = r
19b60 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Reg = dest.iSDPa
19b70 72 6d 3b 0a 20 20 45 78 70 72 53 65 74 56 56 41  rm;.  ExprSetVVA
19b80 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
19b90 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
19ba0 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 7b 0a  if( addrOnce ){.
19bb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
19bc0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f  umpHere(v, addrO
19bd0 6e 63 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 75  nce);..    /* Su
19be0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
19bf0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
19c00 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
19c10 65 74 75 72 6e 2c 20 70 45 78 70 72 2d 3e 79 2e  eturn, pExpr->y.
19c20 73 75 62 2e 72 65 67 52 65 74 75 72 6e 29 3b 0a  sub.regReturn);.
19c30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19c40 68 61 6e 67 65 50 31 28 76 2c 20 70 45 78 70 72  hangeP1(v, pExpr
19c50 2d 3e 79 2e 73 75 62 2e 69 41 64 64 72 2d 31 2c  ->y.sub.iAddr-1,
19c60 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19c70 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20  entAddr(v)-1);. 
19c80 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
19c90 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
19ca0 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  se);.  }..  retu
19cb0 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69  rn rReg;.}.#endi
19cc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
19cd0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
19ce0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19cf0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
19d00 20 45 78 70 72 20 70 49 6e 20 69 73 20 61 6e 20   Expr pIn is an 
19d10 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  IN(...) expressi
19d20 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
19d30 6e 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  n checks that th
19d40 65 20 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74  e .** sub-select
19d50 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
19d60 68 65 20 49 4e 28 29 20 6f 70 65 72 61 74 6f 72  he IN() operator
19d70 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 75   has the same nu
19d80 6d 62 65 72 20 6f 66 20 0a 2a 2a 20 63 6f 6c 75  mber of .** colu
19d90 6d 6e 73 20 61 73 20 74 68 65 20 76 65 63 74 6f  mns as the vecto
19da0 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20 4f 72  r on the LHS. Or
19db0 2c 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  , if the RHS of 
19dc0 74 68 65 20 49 4e 28 29 20 69 73 20 6e 6f 74 20  the IN() is not 
19dd0 0a 2a 2a 20 61 20 73 75 62 2d 71 75 65 72 79 2c  .** a sub-query,
19de0 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 69 73   that the LHS is
19df0 20 61 20 76 65 63 74 6f 72 20 6f 66 20 73 69 7a   a vector of siz
19e00 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 1..*/.int sqli
19e10 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28 50  te3ExprCheckIN(P
19e20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
19e30 70 72 20 2a 70 49 6e 29 7b 0a 20 20 69 6e 74 20  pr *pIn){.  int 
19e40 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nVector = sqlite
19e50 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
19e60 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  pIn->pLeft);.  i
19e70 66 28 20 28 70 49 6e 2d 3e 66 6c 61 67 73 20 26  f( (pIn->flags &
19e80 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
19e90 7b 0a 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f  {.    if( nVecto
19ea0 72 21 3d 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63  r!=pIn->x.pSelec
19eb0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
19ec0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19ed0 33 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28  3SubselectError(
19ee0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 78 2e 70  pParse, pIn->x.p
19ef0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
19f00 6e 45 78 70 72 2c 20 6e 56 65 63 74 6f 72 29 3b  nExpr, nVector);
19f10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
19f20 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
19f30 66 28 20 6e 56 65 63 74 6f 72 21 3d 31 20 29 7b  f( nVector!=1 ){
19f40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74  .    sqlite3Vect
19f50 6f 72 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  orErrorMsg(pPars
19f60 65 2c 20 70 49 6e 2d 3e 70 4c 65 66 74 29 3b 0a  e, pIn->pLeft);.
19f70 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
19f80 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
19f90 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
19fa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19fb0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
19fc0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
19fd0 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
19fe0 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
19ff0 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
1a000 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
1a010 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
1a020 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
1a030 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
1a040 20 73 63 61 6c 61 72 20 6f 72 20 76 65 63 74 6f   scalar or vecto
1a050 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
1a060 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e  he .** right-han
1a070 64 20 73 69 64 65 20 28 52 48 53 29 20 69 73 20  d side (RHS) is 
1a080 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
1a090 20 6f 72 20 6d 6f 72 65 20 73 63 61 6c 61 72 20   or more scalar 
1a0a0 76 61 6c 75 65 73 2c 20 6f 72 20 61 0a 2a 2a 20  values, or a.** 
1a0b0 73 75 62 71 75 65 72 79 2e 20 20 49 66 20 74 68  subquery.  If th
1a0c0 65 20 52 48 53 20 69 73 20 61 20 73 75 62 71 75  e RHS is a subqu
1a0d0 65 72 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  ery, the number 
1a0e0 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
1a0f0 73 20 6d 75 73 74 0a 2a 2a 20 6d 61 74 63 68 20  s must.** match 
1a100 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
1a110 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 76 65 63  lumns in the vec
1a120 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 2e 20  tor on the LHS. 
1a130 20 49 66 20 74 68 65 20 52 48 53 20 69 73 0a 2a   If the RHS is.*
1a140 2a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  * a list of valu
1a150 65 73 2c 20 74 68 65 20 4c 48 53 20 6d 75 73 74  es, the LHS must
1a160 20 62 65 20 61 20 73 63 61 6c 61 72 2e 20 0a 2a   be a scalar. .*
1a170 2a 0a 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65 72  *.** The IN oper
1a180 61 74 6f 72 20 69 73 20 74 72 75 65 20 69 66 20  ator is true if 
1a190 74 68 65 20 4c 48 53 20 76 61 6c 75 65 20 69 73  the LHS value is
1a1a0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
1a1b0 6e 20 74 68 65 20 52 48 53 2e 0a 2a 2a 20 54 68  n the RHS..** Th
1a1c0 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73  e result is fals
1a1d0 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
1a1e0 64 65 66 69 6e 69 74 65 6c 79 20 6e 6f 74 20 69  definitely not i
1a1f0 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
1a200 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 4e 55  .** result is NU
1a210 4c 4c 20 69 66 20 74 68 65 20 70 72 65 73 65 6e  LL if the presen
1a220 63 65 20 6f 66 20 74 68 65 20 4c 48 53 20 69 6e  ce of the LHS in
1a230 20 74 68 65 20 52 48 53 20 63 61 6e 6e 6f 74 20   the RHS cannot 
1a240 62 65 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  be .** determine
1a250 64 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 2e 0a  d due to NULLs..
1a260 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a270 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
1a280 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  e that jumps to 
1a290 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
1a2a0 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
1a2b0 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
1a2c0 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
1a2d0 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
1a2e0 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
1a2f0 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
1a300 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
1a310 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
1a320 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
1a330 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
1a340 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
1a350 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
1a360 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2a  fall through..**
1a370 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65 70 61  .** See the sepa
1a380 72 61 74 65 20 69 6e 2d 6f 70 65 72 61 74 6f 72  rate in-operator
1a390 2e 6d 64 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .md documentatio
1a3a0 6e 20 66 69 6c 65 20 69 6e 20 74 68 65 20 63 61  n file in the ca
1a3b0 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74  nonical.** SQLit
1a3c0 65 20 73 6f 75 72 63 65 20 74 72 65 65 20 66 6f  e source tree fo
1a3d0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1a3e0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
1a3f0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
1a400 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61  ExprCodeIN(.  Pa
1a410 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1a420 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
1a430 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1a440 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1a450 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1a460 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20        /* The IN 
1a470 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1a480 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c  int destIfFalse,
1a490 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
1a4a0 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74  re if LHS is not
1a4b0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
1a4c0 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64  e RHS */.  int d
1a4d0 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20  estIfNull       
1a4e0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1a4f0 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   the results are
1a500 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20   unknown due to 
1a510 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULLs */.){.  in
1a520 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  t rRhsHasNull = 
1a530 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  0;  /* Register 
1a540 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20  that is true if 
1a550 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
1a560 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  L values */.  in
1a570 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
1a580 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
1a590 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
1a5a0 72 4c 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  rLhs;           
1a5b0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 28 73 29    /* Register(s)
1a5c0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 4c 48 53   holding the LHS
1a5d0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
1a5e0 20 72 4c 68 73 4f 72 69 67 3b 20 20 20 20 20 20   rLhsOrig;      
1a5f0 20 20 20 2f 2a 20 4c 48 53 20 76 61 6c 75 65 73     /* LHS values
1a600 20 70 72 69 6f 72 20 74 6f 20 72 65 6f 72 64 65   prior to reorde
1a610 72 69 6e 67 20 62 79 20 61 69 4d 61 70 5b 5d 20  ring by aiMap[] 
1a620 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
1a630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
1a640 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
1a650 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
1a660 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20  int *aiMap = 0; 
1a670 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f        /* Map fro
1a680 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20 74  m vector field t
1a690 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a  o index column *
1a6a0 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  /.  char *zAff =
1a6b0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66 66   0;       /* Aff
1a6c0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72  inity string for
1a6d0 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a   comparisons */.
1a6e0 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20    int nVector;  
1a6f0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1a700 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20 74  of vectors for t
1a710 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  his IN operator 
1a720 2a 2f 0a 20 20 69 6e 74 20 69 44 75 6d 6d 79 3b  */.  int iDummy;
1a730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75             /* Du
1a740 6d 6d 79 20 70 61 72 61 6d 65 74 65 72 20 74 6f  mmy parameter to
1a750 20 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28   exprCodeVector(
1a760 29 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  ) */.  Expr *pLe
1a770 66 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ft;          /* 
1a780 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
1a790 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
1a7a0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1a7b0 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f        /* loop co
1a7c0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 64  unter */.  int d
1a7d0 65 73 74 53 74 65 70 32 3b 20 20 20 20 20 20 20  estStep2;       
1a7e0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
1a7f0 70 20 77 68 65 6e 20 4e 55 4c 4c 73 20 73 65 65  p when NULLs see
1a800 6e 20 69 6e 20 73 74 65 70 20 32 20 2a 2f 0a 20  n in step 2 */. 
1a810 20 69 6e 74 20 64 65 73 74 53 74 65 70 36 20 3d   int destStep6 =
1a820 20 30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20   0;    /* Start 
1a830 6f 66 20 63 6f 64 65 20 66 6f 72 20 53 74 65 70  of code for Step
1a840 20 36 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72   6 */.  int addr
1a850 54 72 75 74 68 4f 70 3b 20 20 20 20 20 20 2f 2a  TruthOp;      /*
1a860 20 41 64 64 72 65 73 73 20 6f 66 20 6f 70 63 6f   Address of opco
1a870 64 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  de that determin
1a880 65 73 20 74 68 65 20 49 4e 20 69 73 20 74 72 75  es the IN is tru
1a890 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 4e  e */.  int destN
1a8a0 6f 74 4e 75 6c 6c 3b 20 20 20 20 20 20 2f 2a 20  otNull;      /* 
1a8b0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 20 63  Jump here if a c
1a8c0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6e 6f 74  omparison is not
1a8d0 20 74 72 75 65 20 69 6e 20 73 74 65 70 20 36 20   true in step 6 
1a8e0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
1a8f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
1a900 70 20 6f 66 20 74 68 65 20 73 74 65 70 2d 36 20  p of the step-6 
1a910 6c 6f 6f 70 20 2a 2f 20 0a 20 20 69 6e 74 20 69  loop */ .  int i
1a920 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
1a930 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 75 73 65   /* Index to use
1a940 20 2a 2f 0a 0a 20 20 70 4c 65 66 74 20 3d 20 70   */..  pLeft = p
1a950 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
1a960 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
1a970 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45  eckIN(pParse, pE
1a980 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  xpr) ) return;. 
1a990 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66   zAff = exprINAf
1a9a0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
1a9b0 45 78 70 72 29 3b 0a 20 20 6e 56 65 63 74 6f 72  Expr);.  nVector
1a9c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
1a9d0 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
1a9e0 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61 70 20  pLeft);.  aiMap 
1a9f0 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 44  = (int*)sqlite3D
1aa00 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  bMallocZero(.   
1aa10 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e     pParse->db, n
1aa20 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66 28 69  Vector*(sizeof(i
1aa30 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  nt) + sizeof(cha
1aa40 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20 20 69  r)) + 1.  );.  i
1aa50 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
1aa60 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
1aa70 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  to sqlite3ExprCo
1aa80 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72 6f 72 3b 0a  deIN_oom_error;.
1aa90 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
1aaa0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   compute the RHS
1aab0 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65  . After this ste
1aac0 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f  p, if anything o
1aad0 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49  ther than.  ** I
1aae0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
1aaf0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61  returned, the ta
1ab00 62 6c 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ble opened with 
1ab10 63 75 72 73 6f 72 20 69 54 61 62 0a 20 20 2a 2a  cursor iTab.  **
1ab20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
1ab30 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
1ab40 70 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e  p the RHS. If IN
1ab50 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72  _INDEX_NOOP is r
1ab60 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68  eturned,.  ** th
1ab70 65 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65  e RHS has not ye
1ab80 74 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a  t been coded.  *
1ab90 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
1aba0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
1abb0 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
1abc0 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70  * OOM detected p
1abd0 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75  rior to this rou
1abe0 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  tine */.  VdbeNo
1abf0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62  opComment((v, "b
1ac00 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b  egin IN expr"));
1ac10 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  .  eType = sqlit
1ac20 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50  e3FindInIndex(pP
1ac30 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20  arse, pExpr,.   
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac50 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44            IN_IND
1ac60 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20  EX_MEMBERSHIP | 
1ac70 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b  IN_INDEX_NOOP_OK
1ac80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1aca0 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1acb0 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52  IfNull ? 0 : &rR
1acc0 68 73 48 61 73 4e 75 6c 6c 2c 0a 20 20 20 20 20  hsHasNull,.     
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ace0 20 20 20 20 20 20 20 20 61 69 4d 61 70 2c 20 26          aiMap, &
1acf0 69 54 61 62 29 3b 0a 0a 20 20 61 73 73 65 72 74  iTab);..  assert
1ad00 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1ad10 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20  | nVector==1 || 
1ad20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1ad30 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  EPH.       || eT
1ad40 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e  ype==IN_INDEX_IN
1ad50 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65  DEX_ASC || eType
1ad60 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
1ad70 5f 44 45 53 43 20 0a 20 20 29 3b 0a 23 69 66 64  _DESC .  );.#ifd
1ad80 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ad90 20 20 2f 2a 20 43 6f 6e 66 69 72 6d 20 74 68 61    /* Confirm tha
1ada0 74 20 61 69 4d 61 70 5b 5d 20 63 6f 6e 74 61 69  t aiMap[] contai
1adb0 6e 73 20 6e 56 65 63 74 6f 72 20 69 6e 74 65 67  ns nVector integ
1adc0 65 72 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  er values betwee
1add0 6e 20 30 20 61 6e 64 0a 20 20 2a 2a 20 6e 56 65  n 0 and.  ** nVe
1ade0 63 74 6f 72 2d 31 2e 20 2a 2f 0a 20 20 66 6f 72  ctor-1. */.  for
1adf0 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
1ae00 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
1ae10 2c 20 63 6e 74 3b 0a 20 20 20 20 66 6f 72 28 63  , cnt;.    for(c
1ae20 6e 74 3d 6a 3d 30 3b 20 6a 3c 6e 56 65 63 74 6f  nt=j=0; j<nVecto
1ae30 72 3b 20 6a 2b 2b 29 20 69 66 28 20 61 69 4d 61  r; j++) if( aiMa
1ae40 70 5b 6a 5d 3d 3d 69 20 29 20 63 6e 74 2b 2b 3b  p[j]==i ) cnt++;
1ae50 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6e 74  .    assert( cnt
1ae60 3d 3d 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ==1 );.  }.#endi
1ae70 66 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  f..  /* Code the
1ae80 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e   LHS, the <expr>
1ae90 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
1aea0 20 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20   (...)". If the 
1aeb0 4c 48 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76  LHS is a .  ** v
1aec0 65 63 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69  ector, then it i
1aed0 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61  s stored in an a
1aee0 72 72 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20  rray of nVector 
1aef0 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
1af00 6e 67 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a  ng .  ** at r1..
1af10 20 20 2a 2a 0a 20 20 2a 2a 20 73 71 6c 69 74 65    **.  ** sqlite
1af20 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 6d  3FindInIndex() m
1af30 69 67 68 74 20 68 61 76 65 20 72 65 6f 72 64 65  ight have reorde
1af40 72 65 64 20 74 68 65 20 66 69 65 6c 64 73 20 6f  red the fields o
1af50 66 20 74 68 65 20 4c 48 53 20 76 65 63 74 6f 72  f the LHS vector
1af60 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  .  ** so that th
1af70 65 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 20  e fields are in 
1af80 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61  the same order a
1af90 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 69 6e  s an existing in
1afa0 64 65 78 2e 20 20 20 54 68 65 0a 20 20 2a 2a 20  dex.   The.  ** 
1afb0 61 69 4d 61 70 5b 5d 20 61 72 72 61 79 20 63 6f  aiMap[] array co
1afc0 6e 74 61 69 6e 73 20 61 20 6d 61 70 70 69 6e 67  ntains a mapping
1afd0 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
1afe0 61 6c 20 4c 48 53 20 66 69 65 6c 64 20 6f 72 64  al LHS field ord
1aff0 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66  er to.  ** the f
1b000 69 65 6c 64 20 6f 72 64 65 72 20 74 68 61 74 20  ield order that 
1b010 6d 61 74 63 68 65 73 20 74 68 65 20 52 48 53 20  matches the RHS 
1b020 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 72 4c  index..  */.  rL
1b030 68 73 4f 72 69 67 20 3d 20 65 78 70 72 43 6f 64  hsOrig = exprCod
1b040 65 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20  eVector(pParse, 
1b050 70 4c 65 66 74 2c 20 26 69 44 75 6d 6d 79 29 3b  pLeft, &iDummy);
1b060 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56  .  for(i=0; i<nV
1b070 65 63 74 6f 72 20 26 26 20 61 69 4d 61 70 5b 69  ector && aiMap[i
1b080 5d 3d 3d 69 3b 20 69 2b 2b 29 7b 7d 20 2f 2a 20  ]==i; i++){} /* 
1b090 41 72 65 20 4c 48 53 20 66 69 65 6c 64 73 20 72  Are LHS fields r
1b0a0 65 6f 72 64 65 72 65 64 3f 20 2a 2f 0a 20 20 69  eordered? */.  i
1b0b0 66 28 20 69 3d 3d 6e 56 65 63 74 6f 72 20 29 7b  f( i==nVector ){
1b0c0 0a 20 20 20 20 2f 2a 20 4c 48 53 20 66 69 65 6c  .    /* LHS fiel
1b0d0 64 73 20 61 72 65 20 6e 6f 74 20 72 65 6f 72 64  ds are not reord
1b0e0 65 72 65 64 20 2a 2f 0a 20 20 20 20 72 4c 68 73  ered */.    rLhs
1b0f0 20 3d 20 72 4c 68 73 4f 72 69 67 3b 0a 20 20 7d   = rLhsOrig;.  }
1b100 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  else{.    /* Nee
1b110 64 20 74 6f 20 72 65 6f 72 64 65 72 20 74 68 65  d to reorder the
1b120 20 4c 48 53 20 66 69 65 6c 64 73 20 61 63 63 6f   LHS fields acco
1b130 72 64 69 6e 67 20 74 6f 20 61 69 4d 61 70 20 2a  rding to aiMap *
1b140 2f 0a 20 20 20 20 72 4c 68 73 20 3d 20 73 71 6c  /.    rLhs = sql
1b150 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1b160 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72  (pParse, nVector
1b170 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1b180 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b  i<nVector; i++){
1b190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b1a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1b1b0 6f 70 79 2c 20 72 4c 68 73 4f 72 69 67 2b 69 2c  opy, rLhsOrig+i,
1b1c0 20 72 4c 68 73 2b 61 69 4d 61 70 5b 69 5d 2c 20   rLhs+aiMap[i], 
1b1d0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
1b1e0 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69   /* If sqlite3Fi
1b1f0 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20  ndInIndex() did 
1b200 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61  not find or crea
1b210 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  te an index that
1b220 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c   is.  ** suitabl
1b230 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  e for evaluating
1b240 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
1b250 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
1b260 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71  using a.  ** seq
1b270 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
1b280 73 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  sons..  **.  ** 
1b290 54 68 69 73 20 69 73 20 73 74 65 70 20 28 31 29  This is step (1)
1b2a0 20 69 6e 20 74 68 65 20 69 6e 2d 6f 70 65 72 61   in the in-opera
1b2b0 74 6f 72 2e 6d 64 20 6f 70 74 69 6d 69 7a 65 64  tor.md optimized
1b2c0 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 2a 2f   algorithm..  */
1b2d0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e  .  if( eType==IN
1b2e0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20  _INDEX_NOOP ){. 
1b2f0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
1b300 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
1b310 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  ist;.    CollSeq
1b320 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
1b330 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1b340 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1b350 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65  t);.    int labe
1b360 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lOk = sqlite3Vdb
1b370 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
1b380 65 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20  e);.    int r2, 
1b390 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69  regToFree;.    i
1b3a0 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30  nt regCkNull = 0
1b3b0 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
1b3c0 20 20 69 6e 74 20 62 4c 68 73 52 65 61 6c 3b 20    int bLhsReal; 
1b3d0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1b3e0 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 68 61  LHS of the IN ha
1b3f0 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 20  s REAL affinity 
1b400 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
1b410 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1b420 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1b430 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
1b440 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
1b450 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
1b460 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c   regCkNull = sql
1b470 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1b480 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1b490 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b4a0 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 4c  v, OP_BitAnd, rL
1b4b0 68 73 2c 20 72 4c 68 73 2c 20 72 65 67 43 6b 4e  hs, rLhs, regCkN
1b4c0 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ull);.    }.    
1b4d0 62 4c 68 73 52 65 61 6c 20 3d 20 73 71 6c 69 74  bLhsReal = sqlit
1b4e0 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1b4f0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3d 3d 53 51  Expr->pLeft)==SQ
1b500 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
1b510 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1b520 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69  pList->nExpr; ii
1b530 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  ++){.      if( b
1b540 4c 68 73 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  LhsReal ){.     
1b550 20 20 20 72 32 20 3d 20 72 65 67 54 6f 46 72 65     r2 = regToFre
1b560 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
1b570 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1b580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1b590 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1b5a0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
1b5b0 72 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  r, r2);.        
1b5c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b5d0 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  4(v, OP_Affinity
1b5e0 2c 20 72 32 2c 20 31 2c 20 30 2c 20 22 45 22 2c  , r2, 1, 0, "E",
1b5f0 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1b600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b610 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1b620 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1b630 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  e, pList->a[ii].
1b640 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65  pExpr, &regToFre
1b650 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1b660 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
1b670 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  && sqlite3ExprCa
1b680 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61  nBeNull(pList->a
1b690 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  [ii].pExpr) ){. 
1b6a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b6b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
1b6c0 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c  itAnd, regCkNull
1b6d0 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r2, regCkNull)
1b6e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b6f0 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  if( ii<pList->nE
1b700 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e  xpr-1 || destIfN
1b710 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
1b720 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b730 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1b740 20 4f 50 5f 45 71 2c 20 72 4c 68 73 2c 20 6c 61   OP_Eq, rLhs, la
1b750 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20  belOk, r2,.     
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
1b780 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1b790 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1b7a0 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69  rageIf(v, ii<pLi
1b7b0 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
1b7c0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b7d0 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73  geIf(v, ii==pLis
1b7e0 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
1b7f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b800 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41 66 66  ChangeP5(v, zAff
1b810 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
1b820 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
1b830 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  t( destIfNull==d
1b840 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20  estIfFalse );.  
1b850 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b860 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
1b870 2c 20 72 4c 68 73 2c 20 64 65 73 74 49 66 46 61  , rLhs, destIfFa
1b880 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8a0 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
1b8b0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
1b8c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b8d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b8e0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
1b8f0 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a  ff[0] | SQLITE_J
1b900 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1b910 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1b920 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1b930 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
1b940 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
1b950 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
1b960 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b970 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
1b980 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
1b990 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
1b9a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b9b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1b9c0 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
1b9d0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se);.    }.    s
1b9e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1b9f0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f  eLabel(v, labelO
1ba00 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  k);.    sqlite3R
1ba10 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1ba20 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  arse, regCkNull)
1ba30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74  ;.    goto sqlit
1ba40 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1ba50 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ished;.  }..  /*
1ba60 20 53 74 65 70 20 32 3a 20 43 68 65 63 6b 20 74   Step 2: Check t
1ba70 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
1ba80 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
1ba90 4c 4c 20 63 6f 6c 75 6d 6e 73 2e 20 20 49 66 20  LL columns.  If 
1baa0 74 68 65 0a 20 20 2a 2a 20 4c 48 53 20 64 6f 65  the.  ** LHS doe
1bab0 73 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 20  s contain NULLs 
1bac0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1bad0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 46  must be either F
1bae0 41 4c 53 45 20 6f 72 20 4e 55 4c 4c 2e 0a 20 20  ALSE or NULL..  
1baf0 2a 2a 20 57 65 20 77 69 6c 6c 20 74 68 65 6e 20  ** We will then 
1bb00 73 6b 69 70 20 74 68 65 20 62 69 6e 61 72 79 20  skip the binary 
1bb10 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 52 48  search of the RH
1bb20 53 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  S..  */.  if( de
1bb30 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
1bb40 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 64 65 73  False ){.    des
1bb50 74 53 74 65 70 32 20 3d 20 64 65 73 74 49 66 46  tStep2 = destIfF
1bb60 61 6c 73 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  alse;.  }else{. 
1bb70 20 20 20 64 65 73 74 53 74 65 70 32 20 3d 20 64     destStep2 = d
1bb80 65 73 74 53 74 65 70 36 20 3d 20 73 71 6c 69 74  estStep6 = sqlit
1bb90 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1bba0 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 66  pParse);.  }.  f
1bbb0 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f  or(i=0; i<nVecto
1bbc0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
1bbd0 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 56 65  r *p = sqlite3Ve
1bbe0 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70 72  ctorFieldSubexpr
1bbf0 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69  (pExpr->pLeft, i
1bc00 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
1bc10 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
1bc20 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  p) ){.      sqli
1bc30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1bc40 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 4c 68 73   OP_IsNull, rLhs
1bc50 2b 69 2c 20 64 65 73 74 53 74 65 70 32 29 3b 0a  +i, destStep2);.
1bc60 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1bc70 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ge(v);.    }.  }
1bc80 0a 0a 20 20 2f 2a 20 53 74 65 70 20 33 2e 20 20  ..  /* Step 3.  
1bc90 54 68 65 20 4c 48 53 20 69 73 20 6e 6f 77 20 6b  The LHS is now k
1bca0 6e 6f 77 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e  nown to be non-N
1bcb0 55 4c 4c 2e 20 20 44 6f 20 74 68 65 20 62 69 6e  ULL.  Do the bin
1bcc0 61 72 79 20 73 65 61 72 63 68 0a 20 20 2a 2a 20  ary search.  ** 
1bcd0 6f 66 20 74 68 65 20 52 48 53 20 75 73 69 6e 67  of the RHS using
1bce0 20 74 68 65 20 4c 48 53 20 61 73 20 61 20 70 72   the LHS as a pr
1bcf0 6f 62 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 20  obe.  If found, 
1bd00 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 20 20  the result is.  
1bd10 2a 2a 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  ** true..  */.  
1bd20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
1bd30 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
1bd40 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
1bd50 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65  , the RHS is the
1bd60 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20   ROWID of table 
1bd70 62 2d 74 72 65 65 20 61 6e 64 20 73 6f 20 77 65  b-tree and so we
1bd80 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 6b 6e 6f   also.    ** kno
1bd90 77 20 74 68 61 74 20 74 68 65 20 52 48 53 20 69  w that the RHS i
1bda0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 20 48 65 6e  s non-NULL.  Hen
1bdb0 63 65 2c 20 77 65 20 63 6f 6d 62 69 6e 65 20 73  ce, we combine s
1bdc0 74 65 70 73 20 33 20 61 6e 64 20 34 0a 20 20 20  teps 3 and 4.   
1bdd0 20 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c   ** into a singl
1bde0 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
1bdf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1be00 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
1be10 69 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66  id, iTab, destIf
1be20 46 61 6c 73 65 2c 20 72 4c 68 73 29 3b 0a 20 20  False, rLhs);.  
1be30 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1be40 29 3b 0a 20 20 20 20 61 64 64 72 54 72 75 74 68  );.    addrTruth
1be50 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
1be60 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
1be70 6f 29 3b 20 20 2f 2a 20 52 65 74 75 72 6e 20 54  o);  /* Return T
1be80 72 75 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  rue */.  }else{.
1be90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bea0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp4(v, OP_Affi
1beb0 6e 69 74 79 2c 20 72 4c 68 73 2c 20 6e 56 65 63  nity, rLhs, nVec
1bec0 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56  tor, 0, zAff, nV
1bed0 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ector);.    if( 
1bee0 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
1bef0 74 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  tIfNull ){.     
1bf00 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 53 74 65 70   /* Combine Step
1bf10 20 33 20 61 6e 64 20 53 74 65 70 20 35 20 69 6e   3 and Step 5 in
1bf20 74 6f 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  to a single opco
1bf30 64 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  de */.      sqli
1bf40 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1bf50 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
1bf60 20 69 54 61 62 2c 20 64 65 73 74 49 66 46 61 6c   iTab, destIfFal
1bf70 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1bf90 4c 68 73 2c 20 6e 56 65 63 74 6f 72 29 3b 20 56  Lhs, nVector); V
1bfa0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1bfb0 20 20 20 20 20 20 67 6f 74 6f 20 73 71 6c 69 74        goto sqlit
1bfc0 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69 6e  e3ExprCodeIN_fin
1bfd0 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ished;.    }.   
1bfe0 20 2f 2a 20 4f 72 64 69 6e 61 72 79 20 53 74 65   /* Ordinary Ste
1bff0 70 20 33 2c 20 66 6f 72 20 74 68 65 20 63 61 73  p 3, for the cas
1c000 65 20 77 68 65 72 65 20 46 41 4c 53 45 20 61 6e  e where FALSE an
1c010 64 20 4e 55 4c 4c 20 61 72 65 20 64 69 73 74 69  d NULL are disti
1c020 6e 63 74 20 2a 2f 0a 20 20 20 20 61 64 64 72 54  nct */.    addrT
1c030 72 75 74 68 4f 70 20 3d 20 73 71 6c 69 74 65 33  ruthOp = sqlite3
1c040 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1c050 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c   OP_Found, iTab,
1c060 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c080 20 20 20 20 20 20 20 20 20 20 72 4c 68 73 2c 20            rLhs, 
1c090 6e 56 65 63 74 6f 72 29 3b 20 56 64 62 65 43 6f  nVector); VdbeCo
1c0a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
1c0b0 20 20 2f 2a 20 53 74 65 70 20 34 2e 20 20 49 66    /* Step 4.  If
1c0c0 20 74 68 65 20 52 48 53 20 69 73 20 6b 6e 6f 77   the RHS is know
1c0d0 6e 20 74 6f 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c  n to be non-NULL
1c0e0 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20   and we did not 
1c0f0 66 69 6e 64 0a 20 20 2a 2a 20 61 6e 20 6d 61 74  find.  ** an mat
1c100 63 68 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68  ch on the search
1c110 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
1c120 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
1c130 46 41 4c 53 45 2e 0a 20 20 2a 2f 0a 20 20 69 66  FALSE..  */.  if
1c140 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26  ( rRhsHasNull &&
1c150 20 6e 56 65 63 74 6f 72 3d 3d 31 20 29 7b 0a 20   nVector==1 ){. 
1c160 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c170 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
1c180 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  ll, rRhsHasNull,
1c190 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1c1a0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1c1b0 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  v);.  }..  /* St
1c1c0 65 70 20 35 2e 20 20 49 66 20 77 65 20 64 6f 20  ep 5.  If we do 
1c1d0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
1c1e0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1c1f0 74 77 65 65 6e 20 4e 55 4c 4c 20 61 6e 64 0a 20  tween NULL and. 
1c200 20 2a 2a 20 46 41 4c 53 45 2c 20 74 68 65 6e 20   ** FALSE, then 
1c210 6a 75 73 74 20 72 65 74 75 72 6e 20 66 61 6c 73  just return fals
1c220 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e. .  */.  if( d
1c230 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74  estIfFalse==dest
1c240 49 66 4e 75 6c 6c 20 29 20 73 71 6c 69 74 65 33  IfNull ) sqlite3
1c250 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
1c260 49 66 46 61 6c 73 65 29 3b 0a 0a 20 20 2f 2a 20  IfFalse);..  /* 
1c270 53 74 65 70 20 36 3a 20 4c 6f 6f 70 20 74 68 72  Step 6: Loop thr
1c280 6f 75 67 68 20 72 6f 77 73 20 6f 66 20 74 68 65  ough rows of the
1c290 20 52 48 53 2e 20 20 43 6f 6d 70 61 72 65 20 65   RHS.  Compare e
1c2a0 61 63 68 20 72 6f 77 20 74 6f 20 74 68 65 20 4c  ach row to the L
1c2b0 48 53 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20  HS..  ** If any 
1c2c0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 4e 55  comparison is NU
1c2d0 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  LL, then the res
1c2e0 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 49 66  ult is NULL.  If
1c2f0 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6d 70 61 72   all.  ** compar
1c300 69 73 6f 6e 73 20 61 72 65 20 46 41 4c 53 45 20  isons are FALSE 
1c310 74 68 65 6e 20 74 68 65 20 66 69 6e 61 6c 20 72  then the final r
1c320 65 73 75 6c 74 20 69 73 20 46 41 4c 53 45 2e 0a  esult is FALSE..
1c330 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20    **.  ** For a 
1c340 73 63 61 6c 61 72 20 4c 48 53 2c 20 69 74 20 69  scalar LHS, it i
1c350 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
1c360 63 68 65 63 6b 20 6a 75 73 74 20 74 68 65 20 66  check just the f
1c370 69 72 73 74 20 72 6f 77 0a 20 20 2a 2a 20 6f 66  irst row.  ** of
1c380 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
1c390 20 69 66 28 20 64 65 73 74 53 74 65 70 36 20 29   if( destStep6 )
1c3a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1c3b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1c3c0 53 74 65 70 36 29 3b 0a 20 20 61 64 64 72 54 6f  Step6);.  addrTo
1c3d0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
1c3e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
1c3f0 6e 64 2c 20 69 54 61 62 2c 20 64 65 73 74 49 66  nd, iTab, destIf
1c400 46 61 6c 73 65 29 3b 0a 20 20 56 64 62 65 43 6f  False);.  VdbeCo
1c410 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
1c420 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20   nVector>1 ){.  
1c430 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c 20 3d 20    destNotNull = 
1c440 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1c450 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
1c460 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f  }else{.    /* Fo
1c470 72 20 6e 56 65 63 74 6f 72 3d 3d 31 2c 20 63 6f  r nVector==1, co
1c480 6d 62 69 6e 65 20 73 74 65 70 73 20 36 20 61 6e  mbine steps 6 an
1c490 64 20 37 20 62 79 20 69 6d 6d 65 64 69 61 74 65  d 7 by immediate
1c4a0 6c 79 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  ly returning.   
1c4b0 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65   ** FALSE if the
1c4c0 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73 6f   first compariso
1c4d0 6e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  n is not NULL */
1c4e0 0a 20 20 20 20 64 65 73 74 4e 6f 74 4e 75 6c 6c  .    destNotNull
1c4f0 20 3d 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a   = destIfFalse;.
1c500 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1c510 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
1c520 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
1c530 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1c540 0a 20 20 20 20 69 6e 74 20 72 33 20 3d 20 73 71  .    int r3 = sq
1c550 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1c560 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 20 3d  pParse);.    p =
1c570 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69   sqlite3VectorFi
1c580 65 6c 64 53 75 62 65 78 70 72 28 70 4c 65 66 74  eldSubexpr(pLeft
1c590 2c 20 69 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  , i);.    pColl 
1c5a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1c5b0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
1c5c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c5d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
1c5e0 75 6d 6e 2c 20 69 54 61 62 2c 20 69 2c 20 72 33  umn, iTab, i, r3
1c5f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1c600 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e  beAddOp4(v, OP_N
1c610 65 2c 20 72 4c 68 73 2b 69 2c 20 64 65 73 74 4e  e, rLhs+i, destN
1c620 6f 74 4e 75 6c 6c 2c 20 72 33 2c 0a 20 20 20 20  otNull, r3,.    
1c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c640 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
1c650 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
1c660 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1c670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1c680 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1c690 73 65 2c 20 72 33 29 3b 0a 20 20 7d 0a 20 20 73  se, r3);.  }.  s
1c6a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c6b0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1c6c0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 69  destIfNull);.  i
1c6d0 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 29 7b 0a  f( nVector>1 ){.
1c6e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1c6f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1c700 65 73 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20  estNotNull);.   
1c710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c720 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
1c730 54 61 62 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b  Tab, addrTop+1);
1c740 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1c750 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74  e(v);..    /* St
1c760 65 70 20 37 3a 20 20 49 66 20 77 65 20 72 65 61  ep 7:  If we rea
1c770 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  ch this point, w
1c780 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
1c790 72 65 73 75 6c 74 20 6d 75 73 74 0a 20 20 20 20  result must.    
1c7a0 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 2a 2f 0a  ** be false. */.
1c7b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c7c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1c7d0 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
1c7e0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
1c7f0 70 73 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72  ps here in order
1c800 20 74 6f 20 72 65 74 75 72 6e 20 74 72 75 65 2e   to return true.
1c810 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1c820 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1c830 72 54 72 75 74 68 4f 70 29 3b 0a 0a 73 71 6c 69  rTruthOp);..sqli
1c840 74 65 33 45 78 70 72 43 6f 64 65 49 4e 5f 66 69  te3ExprCodeIN_fi
1c850 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 4c  nished:.  if( rL
1c860 68 73 21 3d 72 4c 68 73 4f 72 69 67 20 29 20 73  hs!=rLhsOrig ) s
1c870 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1c880 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 4c 68  pReg(pParse, rLh
1c890 73 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  s);.  VdbeCommen
1c8a0 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78  t((v, "end IN ex
1c8b0 70 72 22 29 29 3b 0a 73 71 6c 69 74 65 33 45 78  pr"));.sqlite3Ex
1c8c0 70 72 43 6f 64 65 49 4e 5f 6f 6f 6d 5f 65 72 72  prCodeIN_oom_err
1c8d0 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
1c8e0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1c8f0 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  aiMap);.  sqlite
1c900 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
1c910 64 62 2c 20 7a 41 66 66 29 3b 0a 7d 0a 23 65 6e  db, zAff);.}.#en
1c920 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1c930 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
1c940 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c950 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1c960 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  NT./*.** Generat
1c970 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
1c980 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
1c990 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  he floating poin
1c9a0 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72  t.** value descr
1c9b0 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31  ibed by z[0..n-1
1c9c0 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
1c9d0 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iMem..**.** The 
1c9e0 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  z[] string will 
1c9f0 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20  probably not be 
1ca00 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
1ca10 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b    But the .** z[
1ca20 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20  n] character is 
1ca30 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1ca40 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
1ca50 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a  does not look.**
1ca60 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e   like the contin
1ca70 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75  uation of the nu
1ca80 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
1ca90 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64  void codeReal(Vd
1caa0 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
1cab0 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65  r *z, int negate
1cac0 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
1cad0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21  .  if( ALWAYS(z!
1cae0 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  =0) ){.    doubl
1caf0 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c  e value;.    sql
1cb00 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c  ite3AtoF(z, &val
1cb10 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ue, sqlite3Strle
1cb20 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
1cb30 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TF8);.    assert
1cb40 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  ( !sqlite3IsNaN(
1cb50 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65  value) ); /* The
1cb60 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20   new AtoF never 
1cb70 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20  returns NaN */. 
1cb80 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61     if( negateFla
1cb90 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
1cba0 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ue;.    sqlite3V
1cbb0 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
1cbc0 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65   OP_Real, 0, iMe
1cbd0 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75  m, 0, (u8*)&valu
1cbe0 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d  e, P4_REAL);.  }
1cbf0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1cc00 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
1cc10 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
1cc20 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
1cc30 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
1cc40 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
1cc50 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
1cc60 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72  iMem..**.** Expr
1cc70 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77  .u.zToken is alw
1cc80 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72  ays UTF8 and zer
1cc90 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f  o-terminated..*/
1cca0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
1ccb0 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a  eInteger(Parse *
1ccc0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1ccd0 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67  xpr, int negFlag
1cce0 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56  , int iMem){.  V
1ccf0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1cd00 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45  >pVdbe;.  if( pE
1cd10 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
1cd20 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
1cd30 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75  int i = pExpr->u
1cd40 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73  .iValue;.    ass
1cd50 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20  ert( i>=0 );.   
1cd60 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69   if( negFlag ) i
1cd70 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74   = -i;.    sqlit
1cd80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cd90 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69  OP_Integer, i, i
1cda0 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Mem);.  }else{. 
1cdb0 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36     int c;.    i6
1cdc0 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e  4 value;.    con
1cdd0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78  st char *z = pEx
1cde0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1cdf0 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
1ce00 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  ;.    c = sqlite
1ce10 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
1ce20 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69  , &value);.    i
1ce30 66 28 20 28 63 3d 3d 33 20 26 26 20 21 6e 65 67  f( (c==3 && !neg
1ce40 46 6c 61 67 29 20 7c 7c 20 28 63 3d 3d 32 29 20  Flag) || (c==2) 
1ce50 7c 7c 20 28 6e 65 67 46 6c 61 67 20 26 26 20 76  || (negFlag && v
1ce60 61 6c 75 65 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49  alue==SMALLEST_I
1ce70 4e 54 36 34 29 29 7b 0a 23 69 66 64 65 66 20 53  NT64)){.#ifdef S
1ce80 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1ce90 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
1cea0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1ceb0 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a  pParse, "oversiz
1cec0 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73  ed integer: %s%s
1ced0 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22  ", negFlag ? "-"
1cee0 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65   : "", z);.#else
1cef0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cf00 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52  OMIT_HEX_INTEGER
1cf10 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1cf20 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30  e3_strnicmp(z,"0
1cf30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",2)==0 ){.    
1cf40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1cf50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78  Msg(pParse, "hex
1cf60 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67   literal too big
1cf70 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67  : %s%s", negFlag
1cf80 3f 22 2d 22 3a 22 22 2c 7a 29 3b 0a 20 20 20 20  ?"-":"",z);.    
1cf90 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1cfa0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63       {.        c
1cfb0 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65  odeReal(v, z, ne
1cfc0 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  gFlag, iMem);.  
1cfd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1cfe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
1cff0 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c  ( negFlag ){ val
1d000 75 65 20 3d 20 63 3d 3d 33 20 3f 20 53 4d 41 4c  ue = c==3 ? SMAL
1d010 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61  LEST_INT64 : -va
1d020 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  lue; }.      sql
1d030 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
1d040 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p8(v, OP_Int64, 
1d050 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a  0, iMem, 0, (u8*
1d060 29 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36  )&value, P4_INT6
1d070 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  4);.    }.  }.}.
1d080 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1d090 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61  de that will loa
1d0a0 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  d into register 
1d0b0 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74  regOut a value t
1d0c0 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70  hat is.** approp
1d0d0 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49  riate for the iI
1d0e0 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20  dxCol-th column 
1d0f0 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
1d100 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1d110 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43  prCodeLoadIndexC
1d120 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
1d130 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20  pParse,  /* The 
1d140 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1d150 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1d160 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  ,    /* The inde
1d170 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69  x whose column i
1d180 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a  s to be loaded *
1d190 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
1d1a0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1d1b0 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  inting to a tabl
1d1c0 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  e row */.  int i
1d1d0 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68  IdxCol,    /* Th
1d1e0 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
1d1f0 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64  index to be load
1d200 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ed */.  int regO
1d210 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  ut      /* Store
1d220 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d   the index colum
1d230 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  n value in this 
1d240 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1d250 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70   i16 iTabCol = p
1d260 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49  Idx->aiColumn[iI
1d270 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54  dxCol];.  if( iT
1d280 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29  abCol==XN_EXPR )
1d290 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
1d2a0 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a  dx->aColExpr );.
1d2b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1d2c0 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70  ->aColExpr->nExp
1d2d0 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20  r>iIdxCol );.   
1d2e0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
1d2f0 62 20 3d 20 69 54 61 62 43 75 72 20 2b 20 31 3b  b = iTabCur + 1;
1d300 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1d310 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c  CodeCopy(pParse,
1d320 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
1d330 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70  >a[iIdxCol].pExp
1d340 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 20 20  r, regOut);.    
1d350 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1d360 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1d370 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1d380 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
1d390 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  le(pParse->pVdbe
1d3a0 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20  , pIdx->pTable, 
1d3b0 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20  iTabCur,.       
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
1d3e0 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCol, regOut);. 
1d3f0 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
1d400 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41  LITE_OMIT_GENERA
1d410 54 45 44 5f 43 4f 4c 55 4d 4e 53 0a 2f 2a 0a 2a  TED_COLUMNS./*.*
1d420 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d430 74 68 61 74 20 77 69 6c 6c 20 63 6f 6d 70 75 74  that will comput
1d440 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 67  e the value of g
1d450 65 6e 65 72 61 74 65 64 20 63 6f 6c 75 6d 6e 20  enerated column 
1d460 70 43 6f 6c 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  pCol.** and stor
1d470 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
1d480 72 65 67 69 73 74 65 72 20 72 65 67 4f 75 74 0a  register regOut.
1d490 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1d4a0 78 70 72 43 6f 64 65 47 65 6e 65 72 61 74 65 64  xprCodeGenerated
1d4b0 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
1d4c0 2a 70 50 61 72 73 65 2c 0a 20 20 43 6f 6c 75 6d  *pParse,.  Colum
1d4d0 6e 20 2a 70 43 6f 6c 2c 0a 20 20 69 6e 74 20 72  n *pCol,.  int r
1d4e0 65 67 4f 75 74 0a 29 7b 0a 20 20 73 71 6c 69 74  egOut.){.  sqlit
1d4f0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1d500 65 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 2c 20  e, pCol->pDflt, 
1d510 72 65 67 4f 75 74 29 3b 0a 20 20 69 66 28 20 70  regOut);.  if( p
1d520 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3e 3d 53  Col->affinity>=S
1d530 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
1d540 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1d550 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e  eAddOp4(pParse->
1d560 70 56 64 62 65 2c 20 4f 50 5f 41 66 66 69 6e 69  pVdbe, OP_Affini
1d570 74 79 2c 20 72 65 67 4f 75 74 2c 20 31 2c 20 30  ty, regOut, 1, 0
1d580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d590 20 20 20 20 20 20 20 20 26 70 43 6f 6c 2d 3e 61          &pCol->a
1d5a0 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 7d  ffinity, 1);.  }
1d5b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1d5c0 49 54 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41 54  ITE_OMIT_GENERAT
1d5d0 45 44 5f 43 4f 4c 55 4d 4e 53 20 2a 2f 0a 0a 2f  ED_COLUMNS */../
1d5e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1d5f0 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
1d600 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
1d610 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
1d620 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
1d630 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1d640 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
1d650 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  e(.  Vdbe *v,   
1d660 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1d670 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
1d680 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20  le *pTab,    /* 
1d690 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  The table contai
1d6a0 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a  ning the value *
1d6b0 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
1d6c0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1d6d0 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65   cursor.  Or the
1d6e0 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57   PK cursor for W
1d6f0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a  ITHOUT ROWID */.
1d700 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
1d710 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
1d720 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72  e column to extr
1d730 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  act */.  int reg
1d740 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72  Out      /* Extr
1d750 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  act the value in
1d760 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72  to this register
1d770 20 2a 2f 0a 29 7b 0a 20 20 43 6f 6c 75 6d 6e 20   */.){.  Column 
1d780 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
1d790 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   v!=0 );.  if( p
1d7a0 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Tab==0 ){.    sq
1d7b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d7c0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
1d7d0 61 62 43 75 72 2c 20 69 43 6f 6c 2c 20 72 65 67  abCur, iCol, reg
1d7e0 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
1d7f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
1d800 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62  <0 || iCol==pTab
1d810 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73  ->iPKey ){.    s
1d820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d830 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
1d840 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a  abCur, regOut);.
1d850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1d860 20 6f 70 3b 0a 20 20 20 20 69 6e 74 20 78 3b 0a   op;.    int x;.
1d870 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1d880 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
1d890 20 6f 70 20 3d 20 4f 50 5f 56 43 6f 6c 75 6d 6e   op = OP_VColumn
1d8a0 3b 0a 20 20 20 20 20 20 78 20 3d 20 69 43 6f 6c  ;.      x = iCol
1d8b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1d8c0 5f 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45 44 5f  _OMIT_GENERATED_
1d8d0 43 4f 4c 55 4d 4e 53 0a 20 20 20 20 7d 65 6c 73  COLUMNS.    }els
1d8e0 65 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 26 70  e if( (pCol = &p
1d8f0 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 29  Tab->aCol[iCol])
1d900 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ->colFlags & COL
1d910 46 4c 41 47 5f 56 49 52 54 55 41 4c 20 29 7b 0a  FLAG_VIRTUAL ){.
1d920 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61        Parse *pPa
1d930 72 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rse = sqlite3Vdb
1d940 65 50 61 72 73 65 72 28 76 29 3b 0a 20 20 20 20  eParser(v);.    
1d950 20 20 69 66 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46    if( pCol->colF
1d960 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 42  lags & COLFLAG_B
1d970 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
1d980 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1d990 50 61 72 73 65 2c 20 22 67 65 6e 65 72 61 74 65  Parse, "generate
1d9a0 64 20 63 6f 6c 75 6d 6e 20 6c 6f 6f 70 20 6f 6e  d column loop on
1d9b0 20 5c 22 25 73 5c 22 22 2c 20 70 43 6f 6c 2d 3e   \"%s\"", pCol->
1d9c0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  zName);.      }e
1d9d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1d9e0 20 73 61 76 65 64 53 65 6c 66 54 61 62 20 3d 20   savedSelfTab = 
1d9f0 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
1da00 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e  ;.        pCol->
1da10 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
1da20 4c 41 47 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  LAG_BUSY;.      
1da30 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54    pParse->iSelfT
1da40 61 62 20 3d 20 69 54 61 62 43 75 72 2b 31 3b 0a  ab = iTabCur+1;.
1da50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1da60 78 70 72 43 6f 64 65 47 65 6e 65 72 61 74 65 64  xprCodeGenerated
1da70 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
1da80 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
1da90 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53        pParse->iS
1daa0 65 6c 66 54 61 62 20 3d 20 73 61 76 65 64 53 65  elfTab = savedSe
1dab0 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20 70  lfTab;.        p
1dac0 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 3d  Col->colFlags &=
1dad0 20 7e 43 4f 4c 46 4c 41 47 5f 42 55 53 59 3b 0a   ~COLFLAG_BUSY;.
1dae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1daf0 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20  turn;.#endif.   
1db00 20 7d 65 6c 73 65 20 69 66 28 20 21 48 61 73 52   }else if( !HasR
1db10 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
1db20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
1db30 6f 6c 21 3d 73 71 6c 69 74 65 33 54 61 62 6c 65  ol!=sqlite3Table
1db40 43 6f 6c 75 6d 6e 54 6f 53 74 6f 72 61 67 65 28  ColumnToStorage(
1db50 70 54 61 62 2c 20 69 43 6f 6c 29 20 29 3b 0a 20  pTab, iCol) );. 
1db60 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
1db70 54 61 62 6c 65 43 6f 6c 75 6d 6e 54 6f 49 6e 64  TableColumnToInd
1db80 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72  ex(sqlite3Primar
1db90 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c  yKeyIndex(pTab),
1dba0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 6f 70   iCol);.      op
1dbb0 20 3d 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20   = OP_Column;.  
1dbc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78    }else{.      x
1dbd0 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43   = sqlite3TableC
1dbe0 6f 6c 75 6d 6e 54 6f 53 74 6f 72 61 67 65 28 70  olumnToStorage(p
1dbf0 54 61 62 2c 69 43 6f 6c 29 3b 0a 20 20 20 20 20  Tab,iCol);.     
1dc00 20 74 65 73 74 63 61 73 65 28 20 78 21 3d 69 43   testcase( x!=iC
1dc10 6f 6c 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  ol );.      op =
1dc20 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   OP_Column;.    
1dc30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1dc40 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
1dc50 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75  TabCur, x, regOu
1dc60 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  t);.    sqlite3C
1dc70 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
1dc80 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f  pTab, iCol, regO
1dc90 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ut);.  }.}../*.*
1dca0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1dcb0 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
1dcc0 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  t the iColumn-th
1dcd0 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20   column from.** 
1dce0 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73  table pTab and s
1dcf0 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
1dd00 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
1dd10 72 20 69 52 65 67 2e 20 0a 2a 2a 0a 2a 2a 20 54  r iReg. .**.** T
1dd20 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
1dd30 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70  open cursor to p
1dd40 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68  Tab in iTable wh
1dd50 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
1dd60 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49  ** is called.  I
1dd70 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e  f iColumn<0 then
1dd80 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
1dd90 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73  ed that extracts
1dda0 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69   the rowid..*/.i
1ddb0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1ddc0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50  deGetColumn(.  P
1ddd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1dde0 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
1ddf0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
1de00 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
1de10 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
1de20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1de30 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
1de40 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
1de50 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
1de60 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1de70 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
1de80 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1de90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1dea0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1deb0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
1dec0 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20  nt iReg,        
1ded0 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
1dee0 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35   here */.  u8 p5
1def0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1df00 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43  5 value for OP_C
1df10 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f  olumn + FLAGS */
1df20 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  .){.  assert( pP
1df30 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29  arse->pVdbe!=0 )
1df40 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1df50 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
1df60 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ble(pParse->pVdb
1df70 65 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c  e, pTab, iTable,
1df80 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
1df90 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20  .  if( p5 ){.   
1dfa0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1dfb0 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64  geP5(pParse->pVd
1dfc0 62 65 2c 20 70 35 29 3b 0a 20 20 7d 0a 20 20 72  be, p5);.  }.  r
1dfd0 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
1dfe0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1dff0 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65  de to move conte
1e000 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
1e010 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
1e020 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
1e030 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
1e040 31 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  1..*/.void sqlit
1e050 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
1e060 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1e070 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
1e080 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61  , int nReg){.  a
1e090 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54  ssert( iFrom>=iT
1e0a0 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b  o+nReg || iFrom+
1e0b0 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73  nReg<=iTo );.  s
1e0c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1e0d0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1e0e0 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
1e0f0 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 2f  iTo, nReg);.}../
1e100 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73  *.** Convert a s
1e110 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
1e120 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45   node to a TK_RE
1e130 47 49 53 54 45 52 20 72 65 66 65 72 65 6e 63 69  GISTER referenci
1e140 6e 67 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  ng.** register i
1e150 52 65 67 2e 20 20 54 68 65 20 63 61 6c 6c 65 72  Reg.  The caller
1e160 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
1e170 74 20 69 52 65 67 20 61 6c 72 65 61 64 79 20 63  t iReg already c
1e180 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63  ontains.** the c
1e190 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
1e1a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
1e1b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e1c0 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45  exprToRegister(E
1e1d0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1e1e0 69 52 65 67 29 7b 0a 20 20 45 78 70 72 20 2a 70  iReg){.  Expr *p
1e1f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1e200 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b 65  ipCollateAndLike
1e210 6c 79 28 70 45 78 70 72 29 3b 0a 20 20 70 2d 3e  ly(pExpr);.  p->
1e220 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  op2 = p->op;.  p
1e230 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
1e240 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20  ER;.  p->iTable 
1e250 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c  = iReg;.  ExprCl
1e260 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
1e270 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  P_Skip);.}../*.*
1e280 2a 20 45 76 61 6c 75 61 74 65 20 61 6e 20 65 78  * Evaluate an ex
1e290 70 72 65 73 73 69 6f 6e 20 28 65 69 74 68 65 72  pression (either
1e2a0 20 61 20 76 65 63 74 6f 72 20 6f 72 20 61 20 73   a vector or a s
1e2b0 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
1e2c0 29 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 74  ) and store.** t
1e2d0 68 65 20 72 65 73 75 6c 74 20 69 6e 20 63 6f 6e  he result in con
1e2e0 74 69 6e 67 75 6f 75 73 20 74 65 6d 70 6f 72 61  tinguous tempora
1e2f0 72 79 20 72 65 67 69 73 74 65 72 73 2e 20 20 52  ry registers.  R
1e300 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1e310 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  of.** the first 
1e320 72 65 67 69 73 74 65 72 20 75 73 65 64 20 74 6f  register used to
1e330 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1e340 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
1e350 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c 74 20  returned result 
1e360 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
1e370 6d 70 6f 72 61 72 79 20 73 63 61 6c 61 72 2c 20  mporary scalar, 
1e380 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a  then also write.
1e390 2a 2a 20 74 68 61 74 20 72 65 67 69 73 74 65 72  ** that register
1e3a0 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 69   number into *pi
1e3b0 46 72 65 65 61 62 6c 65 2e 20 20 49 66 20 74 68  Freeable.  If th
1e3c0 65 20 72 65 74 75 72 6e 65 64 20 72 65 73 75 6c  e returned resul
1e3d0 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 73  t register.** is
1e3e0 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
1e3f0 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
1e400 73 73 69 6f 6e 20 69 73 20 61 20 76 65 63 74 6f  ssion is a vecto
1e410 72 20 73 65 74 20 2a 70 69 46 72 65 65 61 62 6c  r set *piFreeabl
1e420 65 0a 2a 2a 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74  e.** to 0..*/.st
1e430 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64  atic int exprCod
1e440 65 56 65 63 74 6f 72 28 50 61 72 73 65 20 2a 70  eVector(Parse *p
1e450 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
1e460 69 6e 74 20 2a 70 69 46 72 65 65 61 62 6c 65 29  int *piFreeable)
1e470 7b 0a 20 20 69 6e 74 20 69 52 65 73 75 6c 74 3b  {.  int iResult;
1e480 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 20 3d  .  int nResult =
1e490 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
1e4a0 6f 72 53 69 7a 65 28 70 29 3b 0a 20 20 69 66 28  orSize(p);.  if(
1e4b0 20 6e 52 65 73 75 6c 74 3d 3d 31 20 29 7b 0a 20   nResult==1 ){. 
1e4c0 20 20 20 69 52 65 73 75 6c 74 20 3d 20 73 71 6c     iResult = sql
1e4d0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e4e0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 69 46 72  (pParse, p, piFr
1e4f0 65 65 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  eeable);.  }else
1e500 7b 0a 20 20 20 20 2a 70 69 46 72 65 65 61 62 6c  {.    *piFreeabl
1e510 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
1e520 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
1e530 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 4d  ){.#if SQLITE_OM
1e540 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1e550 20 20 69 52 65 73 75 6c 74 20 3d 20 30 3b 0a 23    iResult = 0;.#
1e560 65 6c 73 65 0a 20 20 20 20 20 20 69 52 65 73 75  else.      iResu
1e570 6c 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  lt = sqlite3Code
1e580 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
1e590 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , p);.#endif.   
1e5a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1e5b0 74 20 69 3b 0a 20 20 20 20 20 20 69 52 65 73 75  t i;.      iResu
1e5c0 6c 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  lt = pParse->nMe
1e5d0 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  m+1;.      pPars
1e5e0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
1e5f0 6c 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  lt;.      for(i=
1e600 30 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b  0; i<nResult; i+
1e610 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
1e620 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
1e630 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 2d  rable(pParse, p-
1e640 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
1e650 45 78 70 72 2c 20 69 2b 69 52 65 73 75 6c 74 29  Expr, i+iResult)
1e660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e670 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
1e680 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  sult;.}.../*.** 
1e690 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
1e6a0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
1e6b0 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
1e6c0 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
1e6d0 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70  ression.  Attemp
1e6e0 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  t to store the r
1e6f0 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
1e700 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20  er "target"..** 
1e710 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
1e720 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74  ter where result
1e730 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  s are stored..**
1e740 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f  .** With this ro
1e750 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20  utine, there is 
1e760 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  no guarantee tha
1e770 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a  t results will.*
1e780 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  * be stored in t
1e790 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
1e7a0 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72  lt might be stor
1e7b0 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ed in some other
1e7c0 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20  .** register if 
1e7d0 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74  it is convenient
1e7e0 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20   to do so.  The 
1e7f0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1e800 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74  .** must check t
1e810 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
1e820 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75  nd move the resu
1e830 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72  lts to the desir
1e840 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a  ed.** register..
1e850 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1e860 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72  prCodeTarget(Par
1e870 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1e880 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1e890 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
1e8a0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1e8b0 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65    /* The VM unde
1e8c0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1e8d0 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e8f0 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
1e900 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
1e910 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
1e920 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1e930 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
1e940 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20  ster inReg */.  
1e950 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
1e960 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
1e970 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
1e980 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
1e990 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
1e9a0 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20  egFree2 = 0;    
1e9b0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
1e9c0 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
1e9d0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1e9e0 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   */.  int r1, r2
1e9f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ea00 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73  /* Various regis
1ea10 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20  ter numbers */. 
1ea20 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20   Expr tempX;    
1ea30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1ea40 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69  mporary expressi
1ea50 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  on node */.  int
1ea60 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65   p5 = 0;..  asse
1ea70 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
1ea80 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
1ea90 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d  nMem );.  if( v=
1eaa0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1eab0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
1eac0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1ead0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1eae0 0a 65 78 70 72 5f 63 6f 64 65 5f 64 6f 6f 76 65  .expr_code_doove
1eaf0 72 3a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  r:.  if( pExpr==
1eb00 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
1eb10 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
1eb20 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
1eb30 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
1eb40 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1eb50 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
1eb60 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
1eb70 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
1eb80 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
1eb90 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1eba0 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
1ebb0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
1ebc0 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
1ebd0 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
1ebe0 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
1ebf0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ec00 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
1ec10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
1ec20 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
1ec30 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
1ec40 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
1ec50 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
1ec60 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1ec70 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
1ec80 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
1ec90 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1ecc0 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
1ecd0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1ece0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  n target;.      
1ecf0 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
1ed00 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
1ed10 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
1ed20 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
1ed30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1ed40 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UMN: {.      int
1ed50 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69   iTab = pExpr->i
1ed60 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28  Table;.      if(
1ed70 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1ed80 28 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64  (pExpr, EP_Fixed
1ed90 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
1eda0 2f 2a 20 54 68 69 73 20 43 4f 4c 55 4d 4e 20 65  /* This COLUMN e
1edb0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 61  xpression is rea
1edc0 6c 6c 79 20 61 20 63 6f 6e 73 74 61 6e 74 20 64  lly a constant d
1edd0 75 65 20 74 6f 20 57 48 45 52 45 20 63 6c 61 75  ue to WHERE clau
1ede0 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  se.        ** co
1edf0 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64 20 74  nstraints, and t
1ee00 68 61 74 20 63 6f 6e 73 74 61 6e 74 20 69 73 20  hat constant is 
1ee10 63 6f 64 65 64 20 62 79 20 74 68 65 20 70 45 78  coded by the pEx
1ee20 70 72 2d 3e 70 4c 65 66 74 0a 20 20 20 20 20 20  pr->pLeft.      
1ee30 20 20 2a 2a 20 65 78 70 72 65 73 73 73 69 6f 6e    ** expresssion
1ee40 2e 20 20 48 6f 77 65 76 65 72 2c 20 6d 61 6b 65  .  However, make
1ee50 20 73 75 72 65 20 74 68 65 20 63 6f 6e 73 74 61   sure the consta
1ee60 6e 74 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  nt has the corre
1ee70 63 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ct.        ** da
1ee80 74 61 74 79 70 65 20 62 79 20 61 70 70 6c 79 69  tatype by applyi
1ee90 6e 67 20 74 68 65 20 41 66 66 69 6e 69 74 79 20  ng the Affinity 
1eea0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1eeb0 75 6d 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 20  umn to the.     
1eec0 20 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 2e 0a     ** constant..
1eed0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1eee0 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20 73 71     int iReg = sq
1eef0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1ef00 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1ef10 72 2d 3e 70 4c 65 66 74 2c 74 61 72 67 65 74 29  r->pLeft,target)
1ef20 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 66  ;.        int af
1ef30 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  f = sqlite3Table
1ef40 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70  ColumnAffinity(p
1ef50 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c 20 70 45  Expr->y.pTab, pE
1ef60 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1ef70 20 20 20 20 20 20 20 69 66 28 20 61 66 66 3e 53         if( aff>S
1ef80 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
1ef90 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
1efa0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 41  ic const char zA
1efb0 66 66 5b 5d 20 3d 20 22 42 5c 30 30 30 43 5c 30  ff[] = "B\000C\0
1efc0 30 30 44 5c 30 30 30 45 22 3b 0a 20 20 20 20 20  00D\000E";.     
1efd0 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
1efe0 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3d 3d 27 41  ITE_AFF_BLOB=='A
1eff0 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ' );.          a
1f000 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 41 46  ssert( SQLITE_AF
1f010 46 5f 54 45 58 54 3d 3d 27 42 27 20 29 3b 0a 20  F_TEXT=='B' );. 
1f020 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 65           if( iRe
1f030 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20  g!=target ){.   
1f040 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f050 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f060 5f 53 43 6f 70 79 2c 20 69 52 65 67 2c 20 74 61  _SCopy, iReg, ta
1f070 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rget);.         
1f080 20 20 20 69 52 65 67 20 3d 20 74 61 72 67 65 74     iReg = target
1f090 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f0a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1f0b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1f0c0 41 66 66 69 6e 69 74 79 2c 20 69 52 65 67 2c 20  Affinity, iReg, 
1f0d0 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0f0 20 20 26 7a 41 66 66 5b 28 61 66 66 2d 27 42 27    &zAff[(aff-'B'
1f100 29 2a 32 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  )*2], P4_STATIC)
1f110 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f120 20 20 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b      return iReg;
1f130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f140 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20  f( iTab<0 ){.   
1f150 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
1f160 3e 69 53 65 6c 66 54 61 62 3c 30 20 29 7b 0a 20  >iSelfTab<0 ){. 
1f170 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 74 68 65           /* Othe
1f180 72 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  r columns in the
1f190 20 73 61 6d 65 20 72 6f 77 20 66 6f 72 20 43 48   same row for CH
1f1a0 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
1f1b0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1f1c0 67 65 6e 65 72 61 74 65 64 20 63 6f 6c 75 6d 6e  generated column
1f1d0 73 20 6f 72 20 66 6f 72 20 69 6e 73 65 72 74 69  s or for inserti
1f1e0 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20  ng into partial 
1f1f0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
1f200 20 2a 2a 20 54 68 65 20 72 6f 77 20 69 73 20 75   ** The row is u
1f210 6e 70 61 63 6b 65 64 20 69 6e 74 6f 20 72 65 67  npacked into reg
1f220 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
1f230 20 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   at.          **
1f240 20 30 2d 28 70 50 61 72 73 65 2d 3e 69 53 65 6c   0-(pParse->iSel
1f250 66 54 61 62 29 2e 20 20 54 68 65 20 72 6f 77 69  fTab).  The rowi
1f260 64 20 28 69 66 20 61 6e 79 29 20 69 73 20 69 6e  d (if any) is in
1f270 20 61 20 72 65 67 69 73 74 65 72 0a 20 20 20 20   a register.    
1f280 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61        ** immedia
1f290 74 65 6c 79 20 70 72 69 6f 72 20 74 6f 20 74 68  tely prior to th
1f2a0 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2e 0a  e first column..
1f2b0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1f2c0 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70         Column *p
1f2d0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 54  Col;.          T
1f2e0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78  able *pTab = pEx
1f2f0 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
1f300 20 20 20 20 20 20 69 6e 74 20 69 53 72 63 3b 0a        int iSrc;.
1f310 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
1f320 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
1f330 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  umn;.          a
1f340 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
1f350 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1f360 72 74 28 20 69 43 6f 6c 3e 3d 58 4e 5f 52 4f 57  rt( iCol>=XN_ROW
1f370 49 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ID );.          
1f380 61 73 73 65 72 74 28 20 69 43 6f 6c 3c 70 45 78  assert( iCol<pEx
1f390 70 72 2d 3e 79 2e 70 54 61 62 2d 3e 6e 43 6f 6c  pr->y.pTab->nCol
1f3a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
1f3b0 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
1f3c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1f3d0 31 2d 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54  1-pParse->iSelfT
1f3e0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ab;.          }.
1f3f0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
1f400 20 70 54 61 62 2d 3e 61 43 6f 6c 20 2b 20 69 43   pTab->aCol + iC
1f410 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ol;.          te
1f420 73 74 63 61 73 65 28 20 69 43 6f 6c 21 3d 73 71  stcase( iCol!=sq
1f430 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e  lite3TableColumn
1f440 54 6f 53 74 6f 72 61 67 65 28 70 54 61 62 2c 69  ToStorage(pTab,i
1f450 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Col) );.        
1f460 20 20 69 53 72 63 20 3d 20 73 71 6c 69 74 65 33    iSrc = sqlite3
1f470 54 61 62 6c 65 43 6f 6c 75 6d 6e 54 6f 53 74 6f  TableColumnToSto
1f480 72 61 67 65 28 70 54 61 62 2c 20 69 43 6f 6c 29  rage(pTab, iCol)
1f490 20 2d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66   - pParse->iSelf
1f4a0 54 61 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Tab;.#ifndef SQL
1f4b0 49 54 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41 54  ITE_OMIT_GENERAT
1f4c0 45 44 5f 43 4f 4c 55 4d 4e 53 0a 20 20 20 20 20  ED_COLUMNS.     
1f4d0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 63       if( pCol->c
1f4e0 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
1f4f0 47 5f 47 45 4e 45 52 41 54 45 44 20 29 7b 0a 20  G_GENERATED ){. 
1f500 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1f510 65 33 45 78 70 72 43 6f 64 65 47 65 6e 65 72 61  e3ExprCodeGenera
1f520 74 65 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  tedColumn(pParse
1f530 2c 20 70 43 6f 6c 2c 20 69 53 72 63 29 3b 0a 20  , pCol, iSrc);. 
1f540 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1f550 6e 20 69 53 72 63 3b 0a 20 20 20 20 20 20 20 20  n iSrc;.        
1f560 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
1f570 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45  * SQLITE_OMIT_GE
1f580 4e 45 52 41 54 45 44 5f 43 4f 4c 55 4d 4e 53 20  NERATED_COLUMNS 
1f590 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1f5a0 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
1f5b0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
1f5c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f5d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f5e0 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
1f5f0 53 72 63 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Src, target);.  
1f600 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f610 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
1f620 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
1f630 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1f640 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72 67       return targ
1f650 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  et;.          }e
1f660 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1f670 20 72 65 74 75 72 6e 20 69 53 72 63 3b 0a 20 20   return iSrc;.  
1f680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f6a0 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20     /* Coding an 
1f6b0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1f6c0 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  is part of an in
1f6d0 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e  dex where column
1f6e0 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20   names.         
1f6f0 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
1f700 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61   refer to the ta
1f710 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ble to which the
1f720 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a   index belongs *
1f730 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62  /.          iTab
1f740 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66   = pParse->iSelf
1f750 54 61 62 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  Tab - 1;.       
1f760 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1f770 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
1f780 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1f790 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f7a0 79 2e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  y.pTab,.        
1f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7c0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
1f7d0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72  olumn, iTab, tar
1f7e0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f800 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b      pExpr->op2);
1f810 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f820 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
1f830 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
1f840 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
1f850 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f860 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1f870 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f880 4b 5f 54 52 55 45 46 41 4c 53 45 3a 20 7b 0a 20  K_TRUEFALSE: {. 
1f890 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f8a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1f8b0 65 67 65 72 2c 20 73 71 6c 69 74 65 33 45 78 70  eger, sqlite3Exp
1f8c0 72 54 72 75 74 68 56 61 6c 75 65 28 70 45 78 70  rTruthValue(pExp
1f8d0 72 29 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r), target);.   
1f8e0 20 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74     return target
1f8f0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1f900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1f910 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63  TING_POINT.    c
1f920 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
1f930 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1f940 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1f950 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1f960 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  e) );.      code
1f970 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75  Real(v, pExpr->u
1f980 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67  .zToken, 0, targ
1f990 65 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  et);.      retur
1f9a0 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
1f9b0 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1f9c0 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
1f9d0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1f9e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1f9f0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1fa00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1fa10 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76  VdbeLoadString(v
1fa20 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70 72 2d  , target, pExpr-
1fa30 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1fa40 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
1fa50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1fa60 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
1fa70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fa80 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1fa90 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1faa0 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
1fab0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1fac0 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
1fad0 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
1fae0 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
1faf0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
1fb00 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
1fb10 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a     char *zBlob;.
1fb20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1fb30 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1fb40 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1fb50 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
1fb60 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
1fb70 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  ken[0]=='x' || p
1fb80 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1fb90 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
1fba0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1fbb0 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27  .zToken[1]=='\''
1fbc0 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70   );.      z = &p
1fbd0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32  Expr->u.zToken[2
1fbe0 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ];.      n = sql
1fbf0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
1fc00 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
1fc10 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b  t( z[n]=='\'' );
1fc20 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73  .      zBlob = s
1fc30 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
1fc40 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
1fc50 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
1fc60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1fc70 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32  (v, OP_Blob, n/2
1fc80 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c  , target, 0, zBl
1fc90 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ob, P4_DYNAMIC);
1fca0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61  .      return ta
1fcb0 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  rget;.    }.#end
1fcc0 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
1fcd0 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
1fce0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1fcf0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1fd00 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1fd10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fd20 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  Expr->u.zToken!=
1fd30 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1fd40 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1fd50 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  en[0]!=0 );.    
1fd60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fd70 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  Op2(v, OP_Variab
1fd80 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
1fd90 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
1fda0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e     if( pExpr->u.
1fdb0 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a  zToken[1]!=0 ){.
1fdc0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1fdd0 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 56  ar *z = sqlite3V
1fde0 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65 28 70 50  ListNumToName(pP
1fdf0 61 72 73 65 2d 3e 70 56 4c 69 73 74 2c 20 70 45  arse->pVList, pE
1fe00 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1fe10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1fe20 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1fe30 5d 3d 3d 27 3f 27 20 7c 7c 20 73 74 72 63 6d 70  ]=='?' || strcmp
1fe40 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1fe50 2c 20 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  , z)==0 );.     
1fe60 20 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73     pParse->pVLis
1fe70 74 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 49 6e 64  t[0] = 0; /* Ind
1fe80 69 63 61 74 65 20 56 4c 69 73 74 20 6d 61 79 20  icate VList may 
1fe90 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 65 6e 6c  no longer be enl
1fea0 61 72 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  arged */.       
1feb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
1fec0 6e 64 50 34 28 76 2c 20 28 63 68 61 72 2a 29 7a  ndP4(v, (char*)z
1fed0 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
1fee0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1fef0 72 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d  rn target;.    }
1ff00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
1ff10 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ISTER: {.      r
1ff20 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 69 54 61  eturn pExpr->iTa
1ff30 62 6c 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  ble;.    }.#ifnd
1ff40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1ff50 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
1ff60 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
1ff70 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
1ff80 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
1ff90 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
1ffa0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20   */.      inReg 
1ffb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1ffc0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1ffd0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
1ffe0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
1fff0 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29   inReg!=target )
20000 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20010 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20020 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
20030 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
20040 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
20050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
20060 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20070 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72  (v, OP_Cast, tar
20080 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
200a0 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
200b0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
200c0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 72 65 74  , 0));.      ret
200d0 75 72 6e 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d  urn inReg;.    }
200e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
200f0 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
20100 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
20110 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
20120 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  :.      op = (op
20130 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
20140 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
20150 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  p5 = SQLITE_NULL
20160 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c  EQ;.      /* fal
20170 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l-through */.   
20180 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
20190 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
201a0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
201b0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
201c0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
201d0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
201e0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
201f0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
20200 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
20210 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
20220 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
20230 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61   codeVectorCompa
20240 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
20250 2c 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35  , target, op, p5
20260 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
20270 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
20280 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
20290 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
202a0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
202b0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
202c0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
202d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
202e0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
202f0 20 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70          codeComp
20300 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
20310 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
20320 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
20330 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
20340 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
20350 7c 20 70 35 2c 0a 20 20 20 20 20 20 20 20 20 20  | p5,.          
20360 20 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74    ExprHasPropert
20370 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6d 6d 75  y(pExpr,EP_Commu
20380 74 65 64 29 29 3b 0a 20 20 20 20 20 20 20 20 61  ted));.        a
20390 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
203a0 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
203b0 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
203c0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
203d0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Lt);.        a
203e0 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
203f0 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
20400 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
20410 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
20420 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Le);.        a
20430 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
20440 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
20450 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
20460 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
20470 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Gt);.        a
20480 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
20490 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
204a0 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
204b0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
204c0 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Ge);.        a
204d0 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
204e0 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
204f0 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f  ==OP_Eq); VdbeCo
20500 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
20510 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61  P_Eq);.        a
20520 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
20530 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
20540 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
20550 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
20560 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74  P_Ne);.        t
20570 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20580 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
20590 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
205a0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
205b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
205c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
205d0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
205e0 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
205f0 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
20600 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
20610 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
20620 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
20630 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
20640 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
20650 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
20660 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
20670 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
20680 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
20690 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
206a0 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
206b0 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41  rt( TK_AND==OP_A
206c0 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  nd );           
206d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
206e0 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  K_AND );.      a
206f0 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
20700 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20  _Or );          
20710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
20720 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
20730 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
20740 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20  ==OP_Add );     
20750 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20760 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20  op==TK_PLUS );. 
20770 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
20780 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
20790 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61  ct );     testca
207a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53  se( op==TK_MINUS
207b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
207c0 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
207d0 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74  ainder );      t
207e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
207f0 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  REM );.      ass
20800 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
20810 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20  OP_BitAnd );    
20820 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20830 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
20840 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
20850 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
20860 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20870 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
20880 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20890 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76  TK_SLASH==OP_Div
208a0 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73  ide );       tes
208b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c  tcase( op==TK_SL
208c0 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ASH );.      ass
208d0 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d  ert( TK_LSHIFT==
208e0 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20  OP_ShiftLeft ); 
208f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20900 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_LSHIFT );.   
20910 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
20920 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
20930 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65  ght );  testcase
20940 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20  ( op==TK_RSHIFT 
20950 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20960 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
20970 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65  oncat );      te
20980 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43  stcase( op==TK_C
20990 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72  ONCAT );.      r
209a0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
209b0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
209c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
209d0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
209e0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
209f0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
20a00 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
20a10 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
20a20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20a30 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72  Op3(v, op, r2, r
20a40 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
20a50 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
20a60 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
20a70 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
20a80 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
20a90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
20aa0 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
20ab0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
20ac0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
20ad0 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eft;.      asser
20ae0 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  t( pLeft );.    
20af0 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
20b00 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
20b10 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
20b20 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  er(pParse, pLeft
20b30 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
20b40 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 72        return tar
20b50 67 65 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  get;.#ifndef SQL
20b60 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
20b70 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65  G_POINT.      }e
20b80 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
20b90 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
20ba0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
20bb0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20bc0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
20bd0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ue) );.        c
20be0 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74  odeReal(v, pLeft
20bf0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74  ->u.zToken, 1, t
20c00 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
20c10 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 23  return target;.#
20c20 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
20c30 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  e{.        tempX
20c40 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52  .op = TK_INTEGER
20c50 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
20c60 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61  flags = EP_IntVa
20c70 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  lue|EP_TokenOnly
20c80 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
20c90 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  u.iValue = 0;.  
20ca0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
20cb0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
20cc0 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
20cd0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
20ce0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
20cf0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
20d00 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
20d10 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
20d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20d30 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
20d40 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20  btract, r2, r1, 
20d50 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
20d60 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
20d70 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
20d80 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
20d90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
20da0 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
20db0 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
20dc0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
20dd0 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
20de0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
20df0 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
20e00 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
20e10 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20  NOT==OP_Not );  
20e20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20e30 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20   op==TK_NOT );. 
20e40 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
20e50 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
20e60 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
20e70 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
20e80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20e90 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
20ea0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20eb0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
20ec0 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
20ed0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
20ee0 20 63 61 73 65 20 54 4b 5f 54 52 55 54 48 3a 20   case TK_TRUTH: 
20ef0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54 72  {.      int isTr
20f00 75 65 3b 20 20 20 20 2f 2a 20 49 53 20 54 52 55  ue;    /* IS TRU
20f10 45 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45  E or IS NOT TRUE
20f20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 4e   */.      int bN
20f30 6f 72 6d 61 6c 3b 20 20 20 2f 2a 20 49 53 20 54  ormal;   /* IS T
20f40 52 55 45 20 6f 72 20 49 53 20 46 41 4c 53 45 20  RUE or IS FALSE 
20f50 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  */.      r1 = sq
20f60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
20f70 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
20f80 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
20f90 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
20fa0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
20fb0 29 3b 0a 20 20 20 20 20 20 69 73 54 72 75 65 20  );.      isTrue 
20fc0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 54 72 75  = sqlite3ExprTru
20fd0 74 68 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70  thValue(pExpr->p
20fe0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 62 4e  Right);.      bN
20ff0 6f 72 6d 61 6c 20 3d 20 70 45 78 70 72 2d 3e 6f  ormal = pExpr->o
21000 70 32 3d 3d 54 4b 5f 49 53 3b 0a 20 20 20 20 20  p2==TK_IS;.     
21010 20 74 65 73 74 63 61 73 65 28 20 69 73 54 72 75   testcase( isTru
21020 65 20 26 26 20 62 4e 6f 72 6d 61 6c 29 3b 0a 20  e && bNormal);. 
21030 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21       testcase( !
21040 69 73 54 72 75 65 20 26 26 20 62 4e 6f 72 6d 61  isTrue && bNorma
21050 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
21060 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
21070 2c 20 4f 50 5f 49 73 54 72 75 65 2c 20 72 31 2c  , OP_IsTrue, r1,
21080 20 69 6e 52 65 67 2c 20 21 69 73 54 72 75 65 2c   inReg, !isTrue,
21090 20 69 73 54 72 75 65 20 5e 20 62 4e 6f 72 6d 61   isTrue ^ bNorma
210a0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
210b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
210c0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
210d0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
210e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
210f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21100 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
21110 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
21120 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
21130 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
21140 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
21150 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
21160 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
21170 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
21180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21190 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
211a0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
211b0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
211c0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
211d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
211e0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
211f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
21200 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
21210 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
21220 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
21230 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
21240 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
21250 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
21260 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
21270 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
21280 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  TNULL);.      sq
21290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
212a0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
212b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
212c0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
212d0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
212e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
212f0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
21300 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
21310 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
21320 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
21330 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
21340 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
21350 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
21360 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
21370 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
21380 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
21390 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
213a0 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
213b0 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
213c0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
213d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
213e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
213f0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
21400 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
21410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
21420 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
21430 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
21440 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
21450 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
21460 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
21470 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
21480 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b        int nFarg;
21490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
214a0 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69  Number of functi
214b0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
214c0 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
214d0 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Def;         /* 
214e0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  The function def
214f0 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  inition object *
21500 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
21510 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f  ar *zId;       /
21520 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
21530 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  ame */.      u32
21540 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20   constMask = 0; 
21550 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66      /* Mask of f
21560 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
21570 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74  s that are const
21580 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ant */.      int
21590 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
215a0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
215b0 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ter */.      sql
215c0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
215d0 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
215e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
215f0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  on */.      u8 e
21600 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20  nc = ENC(db);   
21610 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
21620 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20  ncoding used by 
21630 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
21640 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
21650 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a  pColl = 0;    /*
21660 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   A collating seq
21670 75 65 6e 63 65 20 2a 2f 0a 0a 23 69 66 6e 64 65  uence */..#ifnde
21680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
21690 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 69  NDOWFUNC.      i
216a0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
216b0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69 6e  ty(pExpr, EP_Win
216c0 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
216d0 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 79   return pExpr->y
216e0 2e 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74  .pWin->regResult
216f0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
21700 0a 0a 20 20 20 20 20 20 69 66 28 20 43 6f 6e 73  ..      if( Cons
21710 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
21720 29 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  ) && sqlite3Expr
21730 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
21740 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
21750 20 20 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74      /* SQL funct
21760 69 6f 6e 73 20 63 61 6e 20 62 65 20 65 78 70 65  ions can be expe
21770 6e 73 69 76 65 2e 20 53 6f 20 74 72 79 20 74 6f  nsive. So try to
21780 20 6d 6f 76 65 20 63 6f 6e 73 74 61 6e 74 20 66   move constant f
21790 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 20  unctions.       
217a0 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 69   ** out of the i
217b0 6e 6e 65 72 20 6c 6f 6f 70 2c 20 65 76 65 6e 20  nner loop, even 
217c0 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 61 6e  if that means an
217d0 20 65 78 74 72 61 20 4f 50 5f 43 6f 70 79 2e 20   extra OP_Copy. 
217e0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
217f0 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  n sqlite3ExprCod
21800 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
21810 70 45 78 70 72 2c 20 2d 31 29 3b 0a 20 20 20 20  pExpr, -1);.    
21820 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
21830 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
21840 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
21850 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
21860 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
21870 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
21880 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
21890 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
218a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
218b0 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
218c0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
218d0 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67     }.      nFarg
218e0 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67   = pFarg ? pFarg
218f0 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
21900 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
21910 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
21920 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
21930 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70  );.      zId = p
21940 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
21950 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
21960 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
21970 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67 2c  (db, zId, nFarg,
21980 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65 66   enc, 0);.#ifdef
21990 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
219a0 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54  NKNOWN_SQL_FUNCT
219b0 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70 44  ION.      if( pD
219c0 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  ef==0 && pParse-
219d0 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
219e0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
219f0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
21a00 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e 46  b, "unknown", nF
21a10 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  arg, enc, 0);.  
21a20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21a30 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c     if( pDef==0 |
21a40 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a  | pDef->xFinaliz
21a50 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
21a60 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21a70 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
21a80 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22   function: %s()"
21a90 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
21aa0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
21ab0 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
21ac0 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d   a direct implem
21ad0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
21ae0 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43  built-in COALESC
21af0 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  E() and.      **
21b00 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69   IFNULL() functi
21b10 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ons.  This avoid
21b20 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76  s unnecessary ev
21b30 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20  aluation of.    
21b40 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70    ** arguments p
21b50 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f  ast the first no
21b60 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  n-NULL argument.
21b70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21b80 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
21b90 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21ba0 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
21bb0 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
21bc0 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
21bd0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
21be0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rse);.        as
21bf0 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29  sert( nFarg>=2 )
21c00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21c10 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
21c20 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
21c30 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
21c40 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
21c50 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
21c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21c70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21c80 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c  NotNull, target,
21c90 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
21ca0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
21cb0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
21cc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21cd0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
21ce0 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74  g->a[i].pExpr, t
21cf0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
21d00 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
21d10 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
21d20 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  l(v, endCoalesce
21d30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
21d40 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
21d50 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59   /* The UNLIKELY
21d60 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  () function is a
21d70 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73   no-op.  The res
21d80 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65  ult is the value
21d90 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
21da0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
21db0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21dc0 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
21dd0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
21de0 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20  C_UNLIKELY ){.  
21df0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
21e00 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg>=1 );.      
21e10 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
21e20 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
21e30 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
21e40 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
21e50 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  );.      }..#ifd
21e60 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
21e70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 41 46 46        /* The AFF
21e80 49 4e 49 54 59 28 29 20 66 75 6e 63 74 69 6f 6e  INITY() function
21e90 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20   evaluates to a 
21ea0 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
21eb0 72 69 62 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  ribes.      ** t
21ec0 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  he type affinity
21ed0 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
21ee0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
21ef0 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 66 0a 20  for testing of. 
21f00 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69       ** the SQLi
21f10 74 65 20 74 79 70 65 20 6c 6f 67 69 63 2e 0a 20  te type logic.. 
21f20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
21f30 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
21f40 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
21f50 41 46 46 49 4e 49 54 59 20 29 7b 0a 20 20 20 20  AFFINITY ){.    
21f60 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
21f70 61 7a 41 66 66 5b 5d 20 3d 20 7b 20 22 62 6c 6f  azAff[] = { "blo
21f80 62 22 2c 20 22 74 65 78 74 22 2c 20 22 6e 75 6d  b", "text", "num
21f90 65 72 69 63 22 2c 20 22 69 6e 74 65 67 65 72 22  eric", "integer"
21fa0 2c 20 22 72 65 61 6c 22 20 7d 3b 0a 20 20 20 20  , "real" };.    
21fb0 20 20 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20      char aff;.  
21fc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
21fd0 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg==1 );.      
21fe0 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45    aff = sqlite3E
21ff0 78 70 72 41 66 66 69 6e 69 74 79 28 70 46 61 72  xprAffinity(pFar
22000 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
22010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22020 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c  dbeLoadString(v,
22030 20 74 61 72 67 65 74 2c 20 0a 20 20 20 20 20 20   target, .      
22040 20 20 20 20 20 20 20 20 20 20 28 61 66 66 3c 3d            (aff<=
22050 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
22060 20 3f 20 22 6e 6f 6e 65 22 20 3a 20 61 7a 41 66   ? "none" : azAf
22070 66 5b 61 66 66 2d 53 51 4c 49 54 45 5f 41 46 46  f[aff-SQLITE_AFF
22080 5f 42 4c 4f 42 5d 29 3b 0a 20 20 20 20 20 20 20  _BLOB]);.       
22090 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a   return target;.
220a0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
220b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
220c0 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
220d0 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26        if( i<32 &
220e0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
220f0 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61  onstant(pFarg->a
22100 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
22110 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
22120 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  ( i==31 );.     
22130 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c       constMask |
22140 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a  = MASKBIT32(i);.
22150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22160 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
22170 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
22180 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d  FUNC_NEEDCOLL)!=
22190 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20  0 && !pColl ){. 
221a0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
221b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
221c0 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72  Seq(pParse, pFar
221d0 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  g->a[i].pExpr);.
221e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
221f0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72  }.      if( pFar
22200 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  g ){.        if(
22210 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20   constMask ){.  
22220 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61          r1 = pPa
22230 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
22240 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
22250 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20  Mem += nFarg;.  
22260 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22270 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
22280 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
22290 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a  pParse, nFarg);.
222a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
222b0 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68     /* For length
222c0 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20  () and typeof() 
222d0 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61  functions with a
222e0 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74   column argument
222f0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  ,.        ** set
22300 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65   the P5 paramete
22310 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75  r to the OP_Colu
22320 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46  mn opcode to OPF
22330 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20  LAG_LENGTHARG.  
22340 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c        ** or OPFL
22350 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73  AG_TYPEOFARG res
22360 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76  pectively, to av
22370 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
22380 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  data.        ** 
22390 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20  loading..       
223a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
223b0 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
223c0 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f   & (SQLITE_FUNC_
223d0 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55  LENGTH|SQLITE_FU
223e0 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29  NC_TYPEOF))!=0 )
223f0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  {.          u8 e
22400 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20  xprOp;.         
22410 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d   assert( nFarg==
22420 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  1 );.          a
22430 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b  ssert( pFarg->a[
22440 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  0].pExpr!=0 );. 
22450 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20           exprOp 
22460 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  = pFarg->a[0].pE
22470 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20  xpr->op;.       
22480 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54     if( exprOp==T
22490 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72  K_COLUMN || expr
224a0 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  Op==TK_AGG_COLUM
224b0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
224c0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
224d0 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46  FUNC_LENGTH==OPF
224e0 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b  LAG_LENGTHARG );
224f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
22500 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
22510 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f  _TYPEOF==OPFLAG_
22520 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20  TYPEOFARG );.   
22530 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
22540 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  e( pDef->funcFla
22550 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47  gs & OPFLAG_LENG
22560 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  THARG );.       
22570 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d       pFarg->a[0]
22580 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20  .pExpr->op2 = . 
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
225b0 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   & (OPFLAG_LENGT
225c0 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45  HARG|OPFLAG_TYPE
225d0 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20  OFARG);.        
225e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
225f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
22600 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
22610 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31  Parse, pFarg, r1
22620 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22640 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c       SQLITE_ECEL
22650 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c  _DUP|SQLITE_ECEL
22660 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20  _FACTOR);.      
22670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
22680 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  1 = 0;.      }.#
22690 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
226a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
226b0 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
226c0 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
226d0 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
226e0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
226f0 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
22700 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
22710 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
22720 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
22730 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
22740 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
22750 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
22760 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
22770 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
22780 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
22790 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
227a0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
227b0 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
227c0 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
227d0 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
227e0 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
227f0 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
22800 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
22810 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
22820 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
22830 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
22840 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
22850 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
22860 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
22870 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
22880 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
22890 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
228a0 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
228b0 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
228c0 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
228d0 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
228e0 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
228f0 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
22900 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
22910 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
22920 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
22930 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
22940 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22950 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20  if( nFarg>=2 && 
22960 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22970 70 45 78 70 72 2c 20 45 50 5f 49 6e 66 69 78 46  pExpr, EP_InfixF
22980 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
22990 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
229a0 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
229b0 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
229c0 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e  rg, pFarg->a[1].
229d0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
229e0 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20  lse if( nFarg>0 
229f0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
22a00 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
22a10 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
22a20 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
22a30 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
22a40 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
22a50 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  f.      if( pDef
22a60 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
22a70 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
22a80 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  LL ){.        if
22a90 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
22aa0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
22ab0 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
22ac0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
22ad0 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
22ae0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
22af0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
22b00 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
22b10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46  SQLITE_ENABLE_OF
22b20 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 20 20  FSET_SQL_FUNC.  
22b30 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
22b40 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
22b50 5f 46 55 4e 43 5f 4f 46 46 53 45 54 20 29 7b 0a  _FUNC_OFFSET ){.
22b60 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 41          Expr *pA
22b70 72 67 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rg = pFarg->a[0]
22b80 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
22b90 69 66 28 20 70 41 72 67 2d 3e 6f 70 3d 3d 54 4b  if( pArg->op==TK
22ba0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
22bb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22bc0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66  AddOp3(v, OP_Off
22bd0 73 65 74 2c 20 70 41 72 67 2d 3e 69 54 61 62 6c  set, pArg->iTabl
22be0 65 2c 20 70 41 72 67 2d 3e 69 43 6f 6c 75 6d 6e  e, pArg->iColumn
22bf0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
22c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22c10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22c20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
22c30 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
22c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
22c50 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
22c60 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
22c70 65 33 56 64 62 65 41 64 64 46 75 6e 63 74 69 6f  e3VdbeAddFunctio
22c80 6e 43 61 6c 6c 28 70 50 61 72 73 65 2c 20 63 6f  nCall(pParse, co
22c90 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72  nstMask, r1, tar
22ca0 67 65 74 2c 20 6e 46 61 72 67 2c 0a 20 20 20 20  get, nFarg,.    
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22cd0 44 65 66 2c 20 70 45 78 70 72 2d 3e 6f 70 32 29  Def, pExpr->op2)
22ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22cf0 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e  if( nFarg && con
22d00 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20  stMask==0 ){.   
22d10 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
22d20 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
22d30 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
22d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
22d50 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 20 20  eturn target;.  
22d60 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
22d70 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
22d80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
22d90 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
22da0 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
22db0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
22dc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
22dd0 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
22de0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
22df0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
22e00 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45     if( op==TK_SE
22e10 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20  LECT && (nCol = 
22e20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
22e30 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
22e40 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
22e50 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
22e60 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f  rror(pParse, nCo
22e70 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 1);.      }el
22e80 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
22e90 72 6e 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  rn sqlite3CodeSu
22ea0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
22eb0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
22ec0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22ed0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
22ee0 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  ELECT_COLUMN: {.
22ef0 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
22f00 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
22f10 65 66 74 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  eft->iTable==0 )
22f20 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
22f30 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d  >pLeft->iTable =
22f40 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
22f50 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
22f60 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
22f70 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
22f80 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
22f90 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c  ==0 || pExpr->pL
22fa0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  eft->op==TK_SELE
22fb0 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
22fc0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 30  pExpr->iTable!=0
22fd0 0a 20 20 20 20 20 20 20 26 26 20 70 45 78 70 72  .       && pExpr
22fe0 2d 3e 69 54 61 62 6c 65 21 3d 28 6e 20 3d 20 73  ->iTable!=(n = s
22ff0 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
23000 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  Size(pExpr->pLef
23010 74 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  t)).      ){.   
23020 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
23030 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
23040 20 63 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65   columns assigne
23050 64 20 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  d %d values",.  
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
23080 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 6e 29 3b  xpr->iTable, n);
23090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
230a0 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 4c 65  eturn pExpr->pLe
230b0 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78  ft->iTable + pEx
230c0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
230d0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
230e0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
230f0 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
23100 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
23110 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
23120 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
23130 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
23140 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
23150 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23160 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
23170 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
23180 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23190 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
231a0 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
231b0 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
231c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
231d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
231e0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
231f0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
23200 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
23210 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
23220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23230 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
23240 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
23250 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
23260 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
23270 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
23280 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23290 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a 23 65  target;.    }.#e
232a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
232b0 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
232c0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
232d0 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
232e0 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ND z.    **.    
232f0 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76  ** This is equiv
23300 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a  alent to.    **.
23310 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
23320 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20  ND x<=z.    **. 
23330 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65     ** X is store
23340 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66  d in pExpr->pLef
23350 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73  t..    ** Y is s
23360 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
23370 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
23380 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73  r..    ** Z is s
23390 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
233a0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
233b0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
233c0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
233d0 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
233e0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
233f0 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c  Expr, target, 0,
23400 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
23410 6e 20 74 61 72 67 65 74 3b 0a 20 20 20 20 7d 0a  n target;.    }.
23420 20 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e      case TK_SPAN
23430 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
23440 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
23450 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
23460 20 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72     pExpr = pExpr
23470 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 67  ->pLeft;.      g
23480 6f 74 6f 20 65 78 70 72 5f 63 6f 64 65 5f 64 6f  oto expr_code_do
23490 6f 76 65 72 3b 20 2f 2a 20 32 30 31 38 2d 30 34  over; /* 2018-04
234a0 2d 32 38 3a 20 50 72 65 76 65 6e 74 20 64 65 65  -28: Prevent dee
234b0 70 20 72 65 63 75 72 73 69 6f 6e 2e 20 4f 53 53  p recursion. OSS
234c0 46 75 7a 7a 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a  Fuzz. */.    }..
234d0 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
234e0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
234f0 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
23500 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
23510 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
23520 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
23530 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
23540 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
23550 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
23560 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
23570 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
23580 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
23590 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
235a0 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
235b0 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
235c0 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
235d0 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
235e0 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
235f0 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
23600 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
23610 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
23620 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
23630 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
23640 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
23650 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
23660 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
23670 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
23680 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
23690 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
236a0 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
236b0 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
236c0 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
236d0 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
236e0 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
236f0 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
23700 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
23710 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
23720 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
23730 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
23740 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
23750 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
23760 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
23770 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
23780 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
23790 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
237a0 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
237b0 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
237c0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
237d0 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
237e0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
237f0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
23800 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
23810 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
23820 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
23830 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
23840 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
23850 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
23860 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
23870 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
23880 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
23890 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
238a0 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
238b0 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
238c0 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
238d0 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
238e0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
238f0 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
23900 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
23910 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
23920 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
23930 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
23940 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
23950 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
23960 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
23970 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
23980 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
23990 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
239a0 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
239b0 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
239c0 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
239d0 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
239e0 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
239f0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
23a00 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
23a10 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
23a20 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  b;.      int iCo
23a30 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
23a40 6d 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  mn;.      int p1
23a50 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
23a60 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
23a70 29 20 2b 20 31 20 0a 20 20 20 20 20 20 20 20 20  ) + 1 .         
23a80 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 69              + (i
23a90 43 6f 6c 3e 3d 30 20 3f 20 73 71 6c 69 74 65 33  Col>=0 ? sqlite3
23aa0 54 61 62 6c 65 43 6f 6c 75 6d 6e 54 6f 53 74 6f  TableColumnToSto
23ab0 72 61 67 65 28 70 54 61 62 2c 20 69 43 6f 6c 29  rage(pTab, iCol)
23ac0 20 3a 20 2d 31 29 3b 0a 0a 20 20 20 20 20 20 61   : -1);..      a
23ad0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
23ae0 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
23af0 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
23b00 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
23b10 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 70 54  l>=-1 && iCol<pT
23b20 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
23b30 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
23b40 69 50 4b 65 79 3c 30 20 7c 7c 20 69 43 6f 6c 21  iPKey<0 || iCol!
23b50 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a  =pTab->iPKey );.
23b60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
23b70 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d  >=0 && p1<(pTab-
23b80 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20  >nCol*2+2) );.. 
23b90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23ba0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72  AddOp2(v, OP_Par
23bb0 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b  am, p1, target);
23bc0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
23bd0 6e 74 28 28 76 2c 20 22 72 5b 25 64 5d 3d 25 73  nt((v, "r[%d]=%s
23be0 2e 25 73 22 2c 20 74 61 72 67 65 74 2c 0a 20 20  .%s", target,.  
23bf0 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54        (pExpr->iT
23c00 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22  able ? "new" : "
23c10 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28  old"),.        (
23c20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
23c30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78   ? "rowid" : pEx
23c40 70 72 2d 3e 79 2e 70 54 61 62 2d 3e 61 43 6f 6c  pr->y.pTab->aCol
23c50 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 0a 20 20  [iCol].zName).  
23c60 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
23c70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
23c80 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
23c90 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
23ca0 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
23cb0 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
23cc0 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
23cd0 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
23ce0 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
23cf0 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
23d00 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
23d10 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20  really real..   
23d20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
23d30 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
23d40 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65  985-57662 SQLite
23d50 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
23d60 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a  e value back to.
23d70 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e        ** floatin
23d80 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74  g point when ext
23d90 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20  racting it from 
23da0 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  the record.  */.
23db0 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
23dc0 30 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  0 && pTab->aCol[
23dd0 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  iCol].affinity==
23de0 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
23df0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23e00 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
23e10 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c  OP_RealAffinity,
23e20 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
23e30 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  }.#endif.      b
23e40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
23e50 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52 3a   case TK_VECTOR:
23e60 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
23e70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
23e80 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75   "row value misu
23e90 73 65 64 22 29 3b 0a 20 20 20 20 20 20 62 72 65  sed");.      bre
23ea0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
23eb0 2a 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  * TK_IF_NULL_ROW
23ec0 20 45 78 70 72 20 6e 6f 64 65 73 20 61 72 65 20   Expr nodes are 
23ed0 69 6e 73 65 72 74 65 64 20 61 68 65 61 64 20 6f  inserted ahead o
23ee0 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 20 20  f expressions.  
23ef0 20 20 2a 2a 20 74 68 61 74 20 64 65 72 69 76 65    ** that derive
23f00 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 2d   from the right-
23f10 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 61 20  hand table of a 
23f20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 68 65 0a  LEFT JOIN.  The.
23f30 20 20 20 20 2a 2a 20 45 78 70 72 2e 69 54 61 62      ** Expr.iTab
23f40 6c 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  le value is the 
23f50 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 6f 72  table number for
23f60 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
23f70 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
23f80 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
23f90 6f 6e 6c 79 20 65 76 61 6c 75 61 74 65 64 20 69  only evaluated i
23fa0 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
23fb0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  not currently.  
23fc0 20 20 2a 2a 20 6f 6e 20 61 20 4c 45 46 54 20 4a    ** on a LEFT J
23fd0 4f 49 4e 20 4e 55 4c 4c 20 72 6f 77 2e 0a 20 20  OIN NULL row..  
23fe0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
23ff0 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3a 20 7b 0a  _IF_NULL_ROW: {.
24000 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 4e        int addrIN
24010 52 3b 0a 20 20 20 20 20 20 75 38 20 6f 6b 43 6f  R;.      u8 okCo
24020 6e 73 74 46 61 63 74 6f 72 20 3d 20 70 50 61 72  nstFactor = pPar
24030 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
24040 72 3b 0a 20 20 20 20 20 20 61 64 64 72 49 4e 52  r;.      addrINR
24050 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
24060 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 75 6c  dOp1(v, OP_IfNul
24070 6c 52 6f 77 2c 20 70 45 78 70 72 2d 3e 69 54 61  lRow, pExpr->iTa
24080 62 6c 65 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  ble);.      /* T
24090 65 6d 70 6f 72 61 72 69 6c 79 20 64 69 73 61 62  emporarily disab
240a0 6c 65 20 66 61 63 74 6f 72 69 6e 67 20 6f 66 20  le factoring of 
240b0 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
240c0 69 6f 6e 73 2c 20 73 69 6e 63 65 0a 20 20 20 20  ions, since.    
240d0 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
240e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 61 79   expressions may
240f0 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 63 6f   appear to be co
24100 6e 73 74 61 6e 74 2c 20 74 68 65 79 20 61 72 65  nstant, they are
24110 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65   not.      ** re
24120 61 6c 6c 79 20 63 6f 6e 73 74 61 6e 74 20 62 65  ally constant be
24130 63 61 75 73 65 20 74 68 65 79 20 6f 72 69 67 69  cause they origi
24140 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 72 69  nate from the ri
24150 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 20 20  ght-hand side.  
24160 20 20 20 20 2a 2a 20 6f 66 20 61 20 4c 45 46 54      ** of a LEFT
24170 20 4a 4f 49 4e 2e 20 2a 2f 0a 20 20 20 20 20 20   JOIN. */.      
24180 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
24190 61 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  actor = 0;.     
241a0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
241b0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
241c0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
241d0 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
241e0 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f      pParse->okCo
241f0 6e 73 74 46 61 63 74 6f 72 20 3d 20 6f 6b 43 6f  nstFactor = okCo
24200 6e 73 74 46 61 63 74 6f 72 3b 0a 20 20 20 20 20  nstFactor;.     
24210 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
24220 48 65 72 65 28 76 2c 20 61 64 64 72 49 4e 52 29  Here(v, addrINR)
24230 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24240 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
24250 64 64 72 49 4e 52 2c 20 69 6e 52 65 67 29 3b 0a  ddrINR, inReg);.
24260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24270 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
24280 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
24290 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
242a0 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
242b0 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
242c0 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
242d0 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
242e0 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
242f0 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
24300 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
24310 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
24320 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
24330 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
24340 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
24350 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
24360 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
24370 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
24380 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
24390 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
243a0 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
243b0 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
243c0 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
243d0 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
243e0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
243f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
24400 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
24410 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
24420 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
24430 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
24440 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t of pExpr->x.pL
24450 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e  ist if pExpr->x.
24460 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a  pList->nExpr is.
24470 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65      ** odd.  The
24480 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
24490 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d  nal.  If the num
244a0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
244b0 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a  in x.pList.    *
244c0 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20  * is even, then 
244d0 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64  Y is omitted and
244e0 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22   the "otherwise"
244f0 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
24500 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
24510 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
24520 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
24530 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
24540 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
24550 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
24560 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
24570 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
24580 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
24590 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
245a0 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
245b0 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
245c0 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
245d0 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
245e0 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
245f0 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
24600 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
24610 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
24620 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
24630 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24650 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
24660 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
24670 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
24680 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
24690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
246a0 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
246b0 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
246c0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
246d0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
246e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
246f0 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
24700 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
24710 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24730 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
24740 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
24750 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
24760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
24770 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
24780 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
24790 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
247a0 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
247b0 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
247c0 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
247d0 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
247e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
247f0 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
24800 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
24810 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24830 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73   /* The X expres
24840 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
24850 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20  pr *pTest = 0;  
24860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24870 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41  /* X==Ei (form A
24880 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f  ) or just Ei (fo
24890 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 45  rm B) */.      E
248a0 78 70 72 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20  xpr *pDel = 0;. 
248b0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
248c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
248d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
248e0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
248f0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
24900 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ct) && pExpr->x.
24910 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61  pList );.      a
24920 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70  ssert(pExpr->x.p
24930 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
24940 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
24950 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
24960 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d  .      aListelem
24970 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
24980 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69      nExpr = pELi
24990 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
249a0 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69   endLabel = sqli
249b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
249c0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
249d0 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
249e0 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
249f0 20 20 20 20 20 20 70 44 65 6c 20 3d 20 73 71 6c        pDel = sql
24a00 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
24a10 70 58 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pX, 0);.        
24a20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
24a30 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
24a40 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
24a50 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
24a60 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
24a70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24a80 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
24a90 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
24aa0 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52  .        exprToR
24ab0 65 67 69 73 74 65 72 28 70 44 65 6c 2c 20 65 78  egister(pDel, ex
24ac0 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70 50 61  prCodeVector(pPa
24ad0 72 73 65 2c 20 70 44 65 6c 2c 20 26 72 65 67 46  rse, pDel, &regF
24ae0 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ree1));.        
24af0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
24b00 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
24b10 20 6d 65 6d 73 65 74 28 26 6f 70 43 6f 6d 70 61   memset(&opCompa
24b20 72 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 70  re, 0, sizeof(op
24b30 43 6f 6d 70 61 72 65 29 29 3b 0a 20 20 20 20 20  Compare));.     
24b40 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20     opCompare.op 
24b50 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20  = TK_EQ;.       
24b60 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74   opCompare.pLeft
24b70 20 3d 20 70 44 65 6c 3b 0a 20 20 20 20 20 20 20   = pDel;.       
24b80 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70   pTest = &opComp
24b90 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  are;.        /* 
24ba0 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39  Ticket b351d95f9
24bb0 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31  cd5ef17e9d9dbae1
24bc0 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a  8f5ca8611190001:
24bd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
24be0 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65  value in regFree
24bf0 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70  1 might get SCop
24c00 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69  y-ed into the fi
24c10 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20  le result..     
24c20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75     ** So make su
24c30 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46  re that the regF
24c40 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73  ree1 register is
24c50 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20   not reused for 
24c60 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  other.        **
24c70 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f   purposes and po
24c80 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74  ssibly overwritt
24c90 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  en.  */.        
24ca0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
24cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
24cc0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20  i=0; i<nExpr-1; 
24cd0 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20  i=i+2){.        
24ce0 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20  if( pX ){.      
24cf0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73      assert( pTes
24d00 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
24d10 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67    opCompare.pRig
24d20 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ht = aListelem[i
24d30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
24d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24d50 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65    pTest = aListe
24d60 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
24d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24d80 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74  nextCase = sqlit
24d90 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
24da0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
24db0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
24dc0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
24dd0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
24de0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
24df0 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
24e00 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
24e10 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
24e20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
24e30 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
24e40 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
24e50 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
24e60 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
24e70 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se, aListelem[i+
24e80 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
24e90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
24ea0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e  e3VdbeGoto(v, en
24eb0 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  dLabel);.       
24ec0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
24ed0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74  lveLabel(v, next
24ee0 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Case);.      }. 
24ef0 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72 26       if( (nExpr&
24f00 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)!=0 ){.       
24f10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24f20 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
24f30 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70  >a[nExpr-1].pExp
24f40 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
24f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24f60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24f70 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
24f80 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
24f90 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
24fa0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
24fb0 44 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Del);.      sqli
24fc0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
24fd0 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
24fe0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
24ff0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
25000 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
25010 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
25020 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  SE: {.      asse
25030 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 45 78  rt( pExpr->affEx
25040 70 72 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  pr==OE_Rollback 
25050 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
25060 45 78 70 72 2d 3e 61 66 66 45 78 70 72 3d 3d 4f  Expr->affExpr==O
25070 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20  E_Abort.        
25080 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
25090 45 78 70 72 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  Expr==OE_Fail.  
250a0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
250b0 72 2d 3e 61 66 66 45 78 70 72 3d 3d 4f 45 5f 49  r->affExpr==OE_I
250c0 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20  gnore.      );. 
250d0 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
250e0 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b  ->pTriggerTab ){
250f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25100 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
25110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25120 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29          "RAISE()
25130 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
25140 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  d within a trigg
25150 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  er-program");.  
25160 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
25170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25180 28 20 70 45 78 70 72 2d 3e 61 66 66 45 78 70 72  ( pExpr->affExpr
25190 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
251a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79        sqlite3May
251b0 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
251c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
251d0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
251e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
251f0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
25200 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
25210 66 45 78 70 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65  fExpr==OE_Ignore
25220 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25230 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
25240 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50             v, OP
25250 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b  _Halt, SQLITE_OK
25260 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20  , OE_Ignore, 0, 
25270 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
25280 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
25290 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
252a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
252b0 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
252c0 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
252d0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
252e0 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20  T_TRIGGER,.     
252f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25300 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
25310 61 66 66 45 78 70 72 2c 20 70 45 78 70 72 2d 3e  affExpr, pExpr->
25320 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b  u.zToken, 0, 0);
25330 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
25340 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
25350 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
25360 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
25370 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
25380 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
25390 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
253a0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
253b0 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a  return inReg;.}.
253c0 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75  ./*.** Factor ou
253d0 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68  t the code of th
253e0 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
253f0 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61  on to initializa
25400 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  tion time..**.**
25410 20 49 66 20 72 65 67 44 65 73 74 3e 3d 30 20 74   If regDest>=0 t
25420 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
25430 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20  s always stored 
25440 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72  in that register
25450 20 61 6e 64 20 74 68 65 0a 2a 2a 20 72 65 73 75   and the.** resu
25460 6c 74 20 69 73 20 6e 6f 74 20 72 65 75 73 61 62  lt is not reusab
25470 6c 65 2e 20 20 49 66 20 72 65 67 44 65 73 74 3c  le.  If regDest<
25480 30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  0 then this rout
25490 69 6e 65 20 69 73 20 66 72 65 65 20 74 6f 20 0a  ine is free to .
254a0 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  ** store the val
254b0 75 65 20 77 68 65 72 65 65 76 65 72 20 69 74 20  ue whereever it 
254c0 77 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69  wants.  The regi
254d0 73 74 65 72 20 77 68 65 72 65 20 74 68 65 20 65  ster where the e
254e0 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 69 73  xpression .** is
254f0 20 73 74 6f 72 65 64 20 69 73 20 72 65 74 75 72   stored is retur
25500 6e 65 64 2e 20 20 57 68 65 6e 20 72 65 67 44 65  ned.  When regDe
25510 73 74 3c 30 2c 20 74 77 6f 20 69 64 65 6e 74 69  st<0, two identi
25520 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  cal expressions 
25530 77 69 6c 6c 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  will.** code to 
25540 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65  the same registe
25550 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
25560 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
25570 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25580 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
25590 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
255a0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
255b0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
255c0 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68   to code when th
255d0 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a  e VDBE initializ
255e0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  es */.  int regD
255f0 65 73 74 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  est       /* Sto
25600 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
25610 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
25620 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
25630 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e  p;.  assert( Con
25640 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
25650 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  e) );.  p = pPar
25660 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
25670 20 20 69 66 28 20 72 65 67 44 65 73 74 3c 30 20    if( regDest<0 
25680 26 26 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75  && p ){.    stru
25690 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
256a0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 69 6e 74   *pItem;.    int
256b0 20 69 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   i;.    for(pIte
256c0 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78  m=p->a, i=p->nEx
256d0 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b  pr; i>0; pItem++
256e0 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  , i--){.      if
256f0 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c  ( pItem->reusabl
25700 65 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  e && sqlite3Expr
25710 43 6f 6d 70 61 72 65 28 30 2c 70 49 74 65 6d 2d  Compare(0,pItem-
25720 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29  >pExpr,pExpr,-1)
25730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
25740 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69  eturn pItem->u.i
25750 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20  ConstExprReg;.  
25760 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25770 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
25780 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
25790 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  >db, pExpr, 0);.
257a0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
257b0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
257c0 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20  se, p, pExpr);. 
257d0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73   if( p ){.     s
257e0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
257f0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
25800 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  >a[p->nExpr-1];.
25810 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73       pItem->reus
25820 61 62 6c 65 20 3d 20 72 65 67 44 65 73 74 3c 30  able = regDest<0
25830 3b 0a 20 20 20 20 20 69 66 28 20 72 65 67 44 65  ;.     if( regDe
25840 73 74 3c 30 20 29 20 72 65 67 44 65 73 74 20 3d  st<0 ) regDest =
25850 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
25860 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69  .     pItem->u.i
25870 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72  ConstExprReg = r
25880 65 67 44 65 73 74 3b 0a 20 20 7d 0a 20 20 70 50  egDest;.  }.  pP
25890 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
258a0 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 72   = p;.  return r
258b0 65 67 44 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  egDest;.}../*.**
258c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
258d0 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78  o evaluate an ex
258e0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f  pression and sto
258f0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
25900 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
25910 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
25920 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
25930 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  here the results
25940 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  .** are stored..
25950 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67  **.** If the reg
25960 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
25970 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68  rary register th
25980 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f  at can be deallo
25990 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77  cated,.** then w
259a0 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20  rite its number 
259b0 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20  into *pReg.  If 
259c0 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73  the result regis
259d0 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20  ter is not.** a 
259e0 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20  temporary, then 
259f0 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72  set *pReg to zer
25a00 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  o..**.** If pExp
25a10 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c  r is a constant,
25a20 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
25a30 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74  ne might generat
25a40 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74  e this.** code t
25a50 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73  o fill the regis
25a60 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69  ter in the initi
25a70 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f  alization sectio
25a80 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45  n of the.** VDBE
25a90 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64   program, in ord
25aa0 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20  er to factor it 
25ab0 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75  out of the evalu
25ac0 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69  ation loop..*/.i
25ad0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
25ae0 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50  deTemp(Parse *pP
25af0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
25b00 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20  r, int *pReg){. 
25b10 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72   int r2;.  pExpr
25b20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
25b30 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b 65  ipCollateAndLike
25b40 6c 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  ly(pExpr);.  if(
25b50 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
25b60 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78  Parse).   && pEx
25b70 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
25b80 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65  TER.   && sqlite
25b90 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
25ba0 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20  otJoin(pExpr).  
25bb0 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20  ){.    *pReg  = 
25bc0 30 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69  0;.    r2 = sqli
25bd0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
25be0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
25bf0 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   -1);.  }else{. 
25c00 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
25c10 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
25c20 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20  arse);.    r2 = 
25c30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
25c40 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
25c50 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66  xpr, r1);.    if
25c60 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20  ( r2==r1 ){.    
25c70 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20    *pReg = r1;.  
25c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
25c90 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
25ca0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
25cb0 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20  ;.      *pReg = 
25cc0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
25cd0 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a  eturn r2;.}../*.
25ce0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
25cf0 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
25d00 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
25d10 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
25d20 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
25d30 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
25d40 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
25d50 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
25d60 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
25d70 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
25d80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
25d90 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
25da0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
25db0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
25dc0 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20    int inReg;..  
25dd0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
25de0 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
25df0 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e  se->nMem );.  in
25e00 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
25e10 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
25e20 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
25e30 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  t);.  assert( pP
25e40 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c  arse->pVdbe!=0 |
25e50 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
25e60 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
25e70 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
25e80 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
25e90 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  be ){.    sqlite
25ea0 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
25eb0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
25ec0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
25ed0 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  et);.  }.}../*.*
25ee0 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73 69 65  * Make a transie
25ef0 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  nt copy of expre
25f00 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
25f10 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75 73 69  then code it usi
25f20 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70  ng.** sqlite3Exp
25f30 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73 20 72  rCode().  This r
25f40 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73  outine works jus
25f50 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  t like sqlite3Ex
25f60 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65  prCode().** exce
25f70 70 74 20 74 68 61 74 20 74 68 65 20 69 6e 70 75  pt that the inpu
25f80 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
25f90 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
25fa0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76   unchanged..*/.v
25fb0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
25fc0 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70  odeCopy(Parse *p
25fd0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
25fe0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
25ff0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
26000 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
26010 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
26020 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
26030 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e   0);.  if( !db->
26040 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 73  mallocFailed ) s
26050 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
26060 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
26070 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  rget);.  sqlite3
26080 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
26090 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
260a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
260b0 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
260c0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
260d0 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
260e0 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
260f0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
26100 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
26110 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70  guaranteed to ap
26120 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73  pear.** in regis
26130 74 65 72 20 74 61 72 67 65 74 2e 20 20 49 66 20  ter target.  If 
26140 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
26150 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  s constant, then
26160 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
26170 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f   might choose to
26180 20 63 6f 64 65 20 74 68 65 20 65 78 70 72 65 73   code the expres
26190 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69  sion at initiali
261a0 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a  zation time..*/.
261b0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
261c0 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50  CodeFactorable(P
261d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
261e0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
261f0 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50  arget){.  if( pP
26200 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
26210 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33 45 78  tor && sqlite3Ex
26220 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
26230 6f 69 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20  oin(pExpr) ){.  
26240 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
26250 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
26260 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
26270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
26280 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
26290 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
262a0 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  et);.  }.}../*.*
262b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
262c0 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
262d0 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
262e0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
262f0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
26300 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
26310 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
26320 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
26330 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
26340 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
26350 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
26360 6c 75 61 74 65 64 2e 20 20 54 68 65 20 6e 75 6d  luated.  The num
26370 62 65 72 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ber returned wil
26380 6c 0a 2a 2a 20 75 73 75 61 6c 6c 79 20 62 65 20  l.** usually be 
26390 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 62 75 74  pList->nExpr but
263a0 20 6d 69 67 68 74 20 62 65 20 72 65 64 75 63 65   might be reduce
263b0 64 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c  d if SQLITE_ECEL
263c0 5f 4f 4d 49 54 52 45 46 0a 2a 2a 20 69 73 20 64  _OMITREF.** is d
263d0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  efined..**.** Th
263e0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  e SQLITE_ECEL_DU
263f0 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  P flag prevents 
26400 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72  the arguments fr
26410 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c  om being.** fill
26420 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70  ed using OP_SCop
26430 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74  y.  OP_Copy must
26440 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
26450 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
26460 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61  TE_ECEL_FACTOR a
26470 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63  rgument allows c
26480 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
26490 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f  s to be.** facto
264a0 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69  red out into ini
264b0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65  tialization code
264c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
264d0 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67  TE_ECEL_REF flag
264e0 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72   means that expr
264f0 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c  essions in the l
26500 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72  ist with.** Expr
26510 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72  List.a[].u.x.iOr
26520 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20  derByCol>0 have 
26530 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61  already been eva
26540 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65  luated and store
26550 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  d.** in register
26560 73 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64  s at srcReg, and
26570 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61   so the value ca
26580 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d  n be copied from
26590 20 74 68 65 72 65 2e 0a 2a 2a 20 49 66 20 53 51   there..** If SQ
265a0 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
265b0 46 20 69 73 20 61 6c 73 6f 20 73 65 74 2c 20 74  F is also set, t
265c0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 77  hen the values w
265d0 69 74 68 20 75 2e 78 2e 69 4f 72 64 65 72 42 79  ith u.x.iOrderBy
265e0 43 6f 6c 3e 30 0a 2a 2a 20 61 72 65 20 73 69 6d  Col>0.** are sim
265f0 70 6c 79 20 6f 6d 69 74 74 65 64 20 72 61 74 68  ply omitted rath
26600 65 72 20 74 68 61 6e 20 62 65 69 6e 67 20 63 6f  er than being co
26610 70 69 65 64 20 66 72 6f 6d 20 73 72 63 52 65 67  pied from srcReg
26620 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26630 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
26640 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
26650 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
26660 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
26670 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
26680 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
26690 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
266a0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
266b0 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
266c0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
266d0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
266e0 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f  srcReg,        /
266f0 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74 65  * Source registe
26700 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45  rs if SQLITE_ECE
26710 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c  L_REF */.  u8 fl
26720 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
26730 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66   SQLITE_ECEL_* f
26740 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lags */.){.  str
26750 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
26760 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
26770 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f  i, j, n;.  u8 co
26780 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20  pyOp = (flags & 
26790 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
267a0 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f   ? OP_Copy : OP_
267b0 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76  SCopy;.  Vdbe *v
267c0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
267d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
267e0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
267f0 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
26800 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
26810 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
26820 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
26830 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
26840 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
26850 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73  xpr;.  if( !Cons
26860 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
26870 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51  ) ) flags &= ~SQ
26880 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
26890 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
268a0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
268b0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
268c0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
268d0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
268e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
268f0 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
26900 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
26910 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65  pItem->bSorterRe
26920 66 20 29 7b 0a 20 20 20 20 20 20 69 2d 2d 3b 0a  f ){.      i--;.
26930 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d        n--;.    }
26940 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
26950 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
26960 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30  ITE_ECEL_REF)!=0
26970 20 26 26 20 28 6a 20 3d 20 70 49 74 65 6d 2d 3e   && (j = pItem->
26980 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
26990 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
269a0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
269b0 43 45 4c 5f 4f 4d 49 54 52 45 46 20 29 7b 0a 20  CEL_OMITREF ){. 
269c0 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20         i--;.    
269d0 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
269e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
269f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
26a00 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63  v, copyOp, j+src
26a10 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29  Reg-1, target+i)
26a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
26a30 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26  lse if( (flags &
26a40 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
26a50 54 4f 52 29 21 3d 30 0a 20 20 20 20 20 20 20 20  TOR)!=0.        
26a60 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
26a70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
26a80 69 6e 28 70 45 78 70 72 29 0a 20 20 20 20 29 7b  in(pExpr).    ){
26a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26aa0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
26ab0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
26ac0 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  et+i);.    }else
26ad0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65  {.      int inRe
26ae0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
26af0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
26b00 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  , pExpr, target+
26b10 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  i);.      if( in
26b20 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b  Reg!=target+i ){
26b30 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
26b40 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  *pOp;.        if
26b50 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70  ( copyOp==OP_Cop
26b60 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  y.         && (p
26b70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65  Op=sqlite3VdbeGe
26b80 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63  tOp(v, -1))->opc
26b90 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  ode==OP_Copy.   
26ba0 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
26bb0 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65  +pOp->p3+1==inRe
26bc0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  g.         && pO
26bd0 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p2+pOp->p3+1=
26be0 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20  =target+i.      
26bf0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
26c00 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20  Op->p3++;.      
26c10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26c20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26c30 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
26c40 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
26c50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26c60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
26c70 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
26c80 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
26c90 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f   for a BETWEEN o
26ca0 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  perator..**.**  
26cb0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
26cc0 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  D z.**.** The ab
26cd0 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ove is equivalen
26ce0 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78  t to .**.**    x
26cf0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a  >=y AND x<=z.**.
26d00 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
26d10 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
26d20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
26d30 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
26d40 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66  * elimination of
26d50 20 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 4a   x..**.** The xJ
26d60 75 6d 70 49 66 20 70 61 72 61 6d 65 74 65 72 20  umpIf parameter 
26d70 64 65 74 65 72 6d 69 6e 65 73 20 64 65 74 61 69  determines detai
26d80 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 55 4c  ls:.**.**    NUL
26d90 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
26da0 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 62       Store the b
26db0 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 69 6e  oolean result in
26dc0 20 72 65 67 5b 64 65 73 74 5d 0a 2a 2a 20 20 20   reg[dest].**   
26dd0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
26de0 75 65 3a 20 20 20 20 20 20 4a 75 6d 70 20 74 6f  ue:      Jump to
26df0 20 64 65 73 74 20 69 66 20 74 72 75 65 0a 2a 2a   dest if true.**
26e00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
26e10 66 46 61 6c 73 65 3a 20 20 20 20 20 4a 75 6d 70  fFalse:     Jump
26e20 20 74 6f 20 64 65 73 74 20 69 66 20 66 61 6c 73   to dest if fals
26e30 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 75 6d 70  e.**.** The jump
26e40 49 66 4e 75 6c 6c 20 70 61 72 61 6d 65 74 65 72  IfNull parameter
26e50 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 78   is ignored if x
26e60 4a 75 6d 70 49 66 20 69 73 20 4e 55 4c 4c 2e 0a  JumpIf is NULL..
26e70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
26e80 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
26e90 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
26ea0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
26eb0 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
26ec0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
26ed0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
26ee0 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
26ef0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
26f00 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
26f10 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
26f20 6e 61 74 69 6f 6e 20 6f 72 20 73 74 6f 72 61 67  nation or storag
26f30 65 20 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  e location */.  
26f40 76 6f 69 64 20 28 2a 78 4a 75 6d 70 29 28 50 61  void (*xJump)(Pa
26f50 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69  rse*,Expr*,int,i
26f60 6e 74 29 2c 20 2f 2a 20 41 63 74 69 6f 6e 20 74  nt), /* Action t
26f70 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 69 6e 74 20  o take */.  int 
26f80 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
26f90 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
26fa0 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
26fb0 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78   NULL */.){.  Ex
26fc0 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20  pr exprAnd;     
26fd0 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  /* The AND opera
26fe0 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44  tor in  x>=y AND
26ff0 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72   x<=z  */.  Expr
27000 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a   compLeft;    /*
27010 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d   The  x>=y  term
27020 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52   */.  Expr compR
27030 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20  ight;   /* The  
27040 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x<=z  term */.  
27050 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
27060 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75  ; /* Temporary u
27070 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  se register */. 
27080 20 45 78 70 72 20 2a 70 44 65 6c 20 3d 20 30 3b   Expr *pDel = 0;
27090 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
270a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
270b0 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74  memset(&compLeft
270c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
270d0 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f  ));.  memset(&co
270e0 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65  mpRight, 0, size
270f0 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d  of(Expr));.  mem
27100 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c  set(&exprAnd, 0,
27110 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
27120 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
27130 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
27140 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
27150 20 29 3b 0a 20 20 70 44 65 6c 20 3d 20 73 71 6c   );.  pDel = sql
27160 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
27170 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
27180 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
27190 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
271a0 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20     exprAnd.op = 
271b0 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 65 78 70 72  TK_AND;.    expr
271c0 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
271d0 70 4c 65 66 74 3b 0a 20 20 20 20 65 78 70 72 41  pLeft;.    exprA
271e0 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d  nd.pRight = &com
271f0 70 52 69 67 68 74 3b 0a 20 20 20 20 63 6f 6d 70  pRight;.    comp
27200 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
27210 0a 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c  .    compLeft.pL
27220 65 66 74 20 3d 20 70 44 65 6c 3b 0a 20 20 20 20  eft = pDel;.    
27230 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
27240 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
27250 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
27260 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
27270 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 63 6f 6d 70   TK_LE;.    comp
27280 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 70 44  Right.pLeft = pD
27290 65 6c 3b 0a 20 20 20 20 63 6f 6d 70 52 69 67 68  el;.    compRigh
272a0 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
272b0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
272c0 70 45 78 70 72 3b 0a 20 20 20 20 65 78 70 72 54  pExpr;.    exprT
272d0 6f 52 65 67 69 73 74 65 72 28 70 44 65 6c 2c 20  oRegister(pDel, 
272e0 65 78 70 72 43 6f 64 65 56 65 63 74 6f 72 28 70  exprCodeVector(p
272f0 50 61 72 73 65 2c 20 70 44 65 6c 2c 20 26 72 65  Parse, pDel, &re
27300 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 69 66  gFree1));.    if
27310 28 20 78 4a 75 6d 70 20 29 7b 0a 20 20 20 20 20  ( xJump ){.     
27320 20 78 4a 75 6d 70 28 70 50 61 72 73 65 2c 20 26   xJump(pParse, &
27330 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
27340 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
27350 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
27360 4d 61 72 6b 20 74 68 65 20 65 78 70 72 65 73 73  Mark the express
27370 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 66 72 6f  ion is being fro
27380 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
27390 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
273a0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 74  in.      ** so t
273b0 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 45  hat the sqlite3E
273c0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 29 20  xprCodeTarget() 
273d0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74  routine will not
273e0 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 6f 76 65   attempt to move
273f0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 6e 74  .      ** it int
27400 6f 20 74 68 65 20 50 61 72 73 65 2e 70 43 6f 6e  o the Parse.pCon
27410 73 74 45 78 70 72 20 6c 69 73 74 2e 20 20 57 65  stExpr list.  We
27420 20 73 68 6f 75 6c 64 20 75 73 65 20 61 20 6e 65   should use a ne
27430 77 20 62 69 74 20 66 6f 72 20 74 68 69 73 2c 0a  w bit for this,.
27440 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 63 6c 61        ** for cla
27450 72 69 74 79 2c 20 62 75 74 20 77 65 20 61 72 65  rity, but we are
27460 20 6f 75 74 20 6f 66 20 62 69 74 73 20 69 6e 20   out of bits in 
27470 74 68 65 20 45 78 70 72 2e 66 6c 61 67 73 20 66  the Expr.flags f
27480 69 65 6c 64 20 73 6f 20 77 65 0a 20 20 20 20 20  ield so we.     
27490 20 2a 2a 20 68 61 76 65 20 74 6f 20 72 65 75 73   ** have to reus
274a0 65 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  e the EP_FromJoi
274b0 6e 20 62 69 74 2e 20 20 42 75 6d 6d 65 72 2e 20  n bit.  Bummer. 
274c0 2a 2f 0a 20 20 20 20 20 20 70 44 65 6c 2d 3e 66  */.      pDel->f
274d0 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a  lags |= EP_FromJ
274e0 6f 69 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oin;.      sqlit
274f0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
27500 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
27510 64 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 7d 0a  d, dest);.    }.
27520 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
27530 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
27540 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 7d  , regFree1);.  }
27550 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
27560 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
27570 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
27580 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
27590 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
275a0 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65  e( xJump==sqlite
275b0 33 45 78 70 72 49 66 54 72 75 65 20 20 26 26 20  3ExprIfTrue  && 
275c0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
275d0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
275e0 20 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d    testcase( xJum
275f0 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 66  p==sqlite3ExprIf
27600 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49 66 4e  True  && jumpIfN
27610 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
27620 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
27630 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69  ase( xJump==sqli
27640 74 65 33 45 78 70 72 49 66 54 72 75 65 20 20 26  te3ExprIfTrue  &
27650 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
27660 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
27670 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 78 4a  ;.  testcase( xJ
27680 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78 70 72  ump==sqlite3Expr
27690 49 66 54 72 75 65 20 20 26 26 20 6a 75 6d 70 49  IfTrue  && jumpI
276a0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
276b0 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
276c0 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d 73 71  tcase( xJump==sq
276d0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
276e0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
276f0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
27700 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
27710 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33 45 78  xJump==sqlite3Ex
27720 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a 75 6d  prIfFalse && jum
27730 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
27740 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
27750 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70 3d 3d  estcase( xJump==
27760 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
27770 73 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  se && jumpIfNull
27780 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
27790 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
277a0 28 20 78 4a 75 6d 70 3d 3d 73 71 6c 69 74 65 33  ( xJump==sqlite3
277b0 45 78 70 72 49 66 46 61 6c 73 65 20 26 26 20 6a  ExprIfFalse && j
277c0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
277d0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
277e0 20 74 65 73 74 63 61 73 65 28 20 78 4a 75 6d 70   testcase( xJump
277f0 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
27800 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
27810 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
27820 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
27830 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
27840 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
27850 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
27860 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
27870 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
27880 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
27890 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
278a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
278b0 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
278c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
278d0 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
278e0 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
278f0 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
27900 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
27910 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
27920 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
27930 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
27940 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
27950 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
27960 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
27970 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
27980 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
27990 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
279a0 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
279b0 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
279c0 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
279d0 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
279e0 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
279f0 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
27a00 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
27a10 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
27a20 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
27a30 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
27a40 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
27a50 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
27a60 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
27a70 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
27a80 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
27a90 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
27aa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
27ab0 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
27ac0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
27ad0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
27ae0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
27af0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
27b00 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
27b10 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
27b20 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
27b30 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
27b40 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
27b50 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
27b60 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
27b70 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
27b80 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
27b90 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
27ba0 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
27bb0 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
27bc0 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
27bd0 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ler */.  if( NEV
27be0 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72  ER(pExpr==0) ) r
27bf0 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61  eturn;  /* No wa
27c00 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
27c10 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70  n */.  op = pExp
27c20 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
27c30 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
27c40 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
27c50 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
27c60 45 78 70 72 20 2a 70 41 6c 74 20 3d 20 73 71 6c  Expr *pAlt = sql
27c70 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69  ite3ExprSimplifi
27c80 65 64 41 6e 64 4f 72 28 70 45 78 70 72 29 3b 0a  edAndOr(pExpr);.
27c90 20 20 20 20 20 20 69 66 28 20 70 41 6c 74 21 3d        if( pAlt!=
27ca0 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  pExpr ){.       
27cb0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
27cc0 75 65 28 70 50 61 72 73 65 2c 20 70 41 6c 74 2c  ue(pParse, pAlt,
27cd0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
27ce0 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  l);.      }else 
27cf0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  if( op==TK_AND )
27d00 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 32  {.        int d2
27d10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
27d20 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
27d30 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
27d40 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
27d50 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
27d60 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
27d70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
27d80 65 66 74 2c 20 64 32 2c 0a 20 20 20 20 20 20 20  eft, d2,.       
27d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27da0 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53      jumpIfNull^S
27db0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
27dc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
27dd0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
27de0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
27df0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
27e00 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
27e10 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
27e20 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
27e30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27e40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
27e50 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
27e60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
27e70 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
27e80 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
27e90 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
27ea0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27eb0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
27ec0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
27ed0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
27ee0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
27ef0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
27f00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
27f10 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
27f20 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
27f30 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
27f40 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
27f50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
27f60 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
27f70 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
27f80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
27f90 73 65 20 54 4b 5f 54 52 55 54 48 3a 20 7b 0a 20  se TK_TRUTH: {. 
27fa0 20 20 20 20 20 69 6e 74 20 69 73 4e 6f 74 3b 20       int isNot; 
27fb0 20 20 20 20 20 2f 2a 20 49 53 20 4e 4f 54 20 54       /* IS NOT T
27fc0 52 55 45 20 6f 72 20 49 53 20 4e 4f 54 20 46 41  RUE or IS NOT FA
27fd0 4c 53 45 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  LSE */.      int
27fe0 20 69 73 54 72 75 65 3b 20 20 20 20 20 2f 2a 20   isTrue;     /* 
27ff0 49 53 20 54 52 55 45 20 6f 72 20 49 53 20 4e 4f  IS TRUE or IS NO
28000 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20 20 20  T TRUE */.      
28010 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28020 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28030 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72 2d 3e   isNot = pExpr->
28040 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b 0a 20  op2==TK_ISNOT;. 
28050 20 20 20 20 20 69 73 54 72 75 65 20 3d 20 73 71       isTrue = sq
28060 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56 61  lite3ExprTruthVa
28070 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  lue(pExpr->pRigh
28080 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
28090 73 65 28 20 69 73 54 72 75 65 20 26 26 20 69 73  se( isTrue && is
280a0 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Not );.      tes
280b0 74 63 61 73 65 28 20 21 69 73 54 72 75 65 20 26  tcase( !isTrue &
280c0 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20  & isNot );.     
280d0 20 69 66 28 20 69 73 54 72 75 65 20 5e 20 69 73   if( isTrue ^ is
280e0 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Not ){.        s
280f0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
28100 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
28110 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20  pLeft, dest,.   
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28130 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53         isNot ? S
28140 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
28150 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c   : 0);.      }el
28160 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
28170 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
28180 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
28190 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20 20 20  eft, dest,.     
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281b0 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 53 51        isNot ? SQ
281c0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
281d0 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  : 0);.      }.  
281e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
281f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
28200 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
28210 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  OT:.      testca
28220 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  se( op==TK_IS );
28230 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28240 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b   op==TK_ISNOT );
28250 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d  .      op = (op=
28260 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20  =TK_IS) ? TK_EQ 
28270 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a  : TK_NE;.      j
28280 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49  umpIfNull = SQLI
28290 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
282a0 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
282b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
282c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
282d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
282e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
282f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
28300 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
28310 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
28320 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
28330 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
28340 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78   goto default_ex
28350 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pr;.      testca
28360 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
28370 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
28380 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
28390 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
283a0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
283b0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
283c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
283d0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
283e0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
283f0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
28400 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
28410 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
28420 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
28430 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
28440 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
28450 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 45  t, jumpIfNull, E
28460 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
28470 45 78 70 72 2c 45 50 5f 43 6f 6d 6d 75 74 65 64  Expr,EP_Commuted
28480 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
28490 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
284a0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
284b0 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
284c0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
284d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
284e0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
284f0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
28500 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
28510 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
28520 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
28530 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
28540 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
28550 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
28560 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
28570 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
28580 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
28590 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
285a0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
285b0 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
285c0 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
285d0 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
285e0 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
285f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
28600 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
28610 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
28620 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
28630 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
28640 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
28650 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
28660 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
28670 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
28680 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
28690 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
286a0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
286b0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
286c0 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
286d0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
286e0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
286f0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
28700 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
28710 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
28720 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28730 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
28740 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
28750 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
28760 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28770 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
28780 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
28790 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
287a0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
287b0 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
287c0 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
287d0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
287e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
287f0 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
28800 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
28810 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
28820 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
28830 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
28840 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
28850 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
28860 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
28870 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
28880 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
28890 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
288a0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
288b0 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
288c0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
288d0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
288e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
288f0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
28900 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28910 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
28920 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
28930 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
28940 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
28950 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
28960 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
28970 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
28980 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e  rIfTrue, jumpIfN
28990 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
289a0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
289b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
289c0 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
289d0 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
289e0 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
289f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
28a00 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
28a10 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
28a20 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
28a30 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
28a40 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
28a50 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
28a60 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
28a70 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
28a80 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
28a90 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
28aa0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
28ab0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
28ac0 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61  abel(v, destIfFa
28ad0 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lse);.      brea
28ae0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
28af0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
28b00 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a     default_expr:
28b10 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 41  .      if( ExprA
28b20 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
28b30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28b40 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
28b50 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
28b60 65 20 69 66 28 20 45 78 70 72 41 6c 77 61 79 73  e if( ExprAlways
28b70 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a  False(pExpr) ){.
28b80 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70          /* No-op
28b90 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
28ba0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
28bb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
28bc0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
28bd0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
28be0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28bf0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c  AddOp3(v, OP_If,
28c00 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
28c10 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
28c20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
28c30 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
28c40 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
28c50 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
28c60 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
28c70 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  l==0 );.      }.
28c80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28c90 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
28ca0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
28cb0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
28cc0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
28cd0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
28ce0 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d  , regFree2);  .}
28cf0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
28d00 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
28d10 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
28d20 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
28d30 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
28d40 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
28d50 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
28d60 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
28d70 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
28d80 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
28d90 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
28da0 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
28db0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
28dc0 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
28dd0 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
28de0 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
28df0 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
28e00 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53   jumpIfNull is S
28e10 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
28e20 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
28e30 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a   if jumpIfNull.*
28e40 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  * is 0..*/.void 
28e50 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
28e60 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
28e70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
28e80 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
28e90 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
28ea0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
28eb0 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
28ec0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
28ed0 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  1 = 0;.  int reg
28ee0 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74  Free2 = 0;.  int
28ef0 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65   r1, r2;..  asse
28f00 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  rt( jumpIfNull==
28f10 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
28f20 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  L || jumpIfNull=
28f30 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
28f40 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
28f50 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f  ; /* Existence o
28f60 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
28f70 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
28f80 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20  ( pExpr==0 )    
28f90 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
28fa0 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
28fb0 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
28fc0 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
28fd0 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
28fe0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
28ff0 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
29000 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
29010 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
29020 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
29030 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
29040 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
29050 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
29060 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
29070 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
29080 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
29090 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
290a0 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
290b0 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
290c0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
290d0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
290e0 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
290f0 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
29100 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
29110 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
29120 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
29130 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
29140 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
29150 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
29160 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
29170 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
29180 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
29190 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
291a0 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
291b0 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
291c0 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
291d0 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
291e0 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
291f0 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
29200 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
29210 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
29220 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
29230 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
29240 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
29250 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
29260 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
29270 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
29280 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
29290 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
292a0 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
292b0 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
292c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
292d0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
292e0 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
292f0 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
29300 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
29310 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
29320 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
29330 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
29340 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
29350 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
29360 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
29370 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
29380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
29390 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
293a0 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
293b0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
293c0 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
293d0 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
293e0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
293f0 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
29400 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
29410 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
29420 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
29430 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
29440 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
29450 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
29460 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
29470 45 78 70 72 20 2a 70 41 6c 74 20 3d 20 73 71 6c  Expr *pAlt = sql
29480 69 74 65 33 45 78 70 72 53 69 6d 70 6c 69 66 69  ite3ExprSimplifi
29490 65 64 41 6e 64 4f 72 28 70 45 78 70 72 29 3b 0a  edAndOr(pExpr);.
294a0 20 20 20 20 20 20 69 66 28 20 70 41 6c 74 21 3d        if( pAlt!=
294b0 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  pExpr ){.       
294c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
294d0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 41 6c 74  lse(pParse, pAlt
294e0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
294f0 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ll);.      }else
29500 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
29510 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20  TK_AND ){.      
29520 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
29530 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
29540 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
29550 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
29560 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
29570 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
29580 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29590 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
295a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
295b0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
295c0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ull);.      }els
295d0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
295e0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
295f0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
29600 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
29610 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
29620 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
29630 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
29640 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
29650 65 66 74 2c 20 64 32 2c 0a 20 20 20 20 20 20 20  eft, d2,.       
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29670 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51     jumpIfNull^SQ
29680 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
29690 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
296a0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
296b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
296c0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
296d0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
296e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
296f0 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
29700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
29710 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
29720 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
29730 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
29740 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
29750 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
29760 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
29770 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
29780 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
29790 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
297a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  }.    case TK_TR
297b0 55 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  UTH: {.      int
297c0 20 69 73 4e 6f 74 3b 20 20 20 2f 2a 20 49 53 20   isNot;   /* IS 
297d0 4e 4f 54 20 54 52 55 45 20 6f 72 20 49 53 20 4e  NOT TRUE or IS N
297e0 4f 54 20 46 41 4c 53 45 20 2a 2f 0a 20 20 20 20  OT FALSE */.    
297f0 20 20 69 6e 74 20 69 73 54 72 75 65 3b 20 20 2f    int isTrue;  /
29800 2a 20 49 53 20 54 52 55 45 20 6f 72 20 49 53 20  * IS TRUE or IS 
29810 4e 4f 54 20 54 52 55 45 20 2a 2f 0a 20 20 20 20  NOT TRUE */.    
29820 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
29830 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
29840 20 20 20 69 73 4e 6f 74 20 3d 20 70 45 78 70 72     isNot = pExpr
29850 2d 3e 6f 70 32 3d 3d 54 4b 5f 49 53 4e 4f 54 3b  ->op2==TK_ISNOT;
29860 0a 20 20 20 20 20 20 69 73 54 72 75 65 20 3d 20  .      isTrue = 
29870 73 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68  sqlite3ExprTruth
29880 56 61 6c 75 65 28 70 45 78 70 72 2d 3e 70 52 69  Value(pExpr->pRi
29890 67 68 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ght);.      test
298a0 63 61 73 65 28 20 69 73 54 72 75 65 20 26 26 20  case( isTrue && 
298b0 69 73 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74  isNot );.      t
298c0 65 73 74 63 61 73 65 28 20 21 69 73 54 72 75 65  estcase( !isTrue
298d0 20 26 26 20 69 73 4e 6f 74 20 29 3b 0a 20 20 20   && isNot );.   
298e0 20 20 20 69 66 28 20 69 73 54 72 75 65 20 5e 20     if( isTrue ^ 
298f0 69 73 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  isNot ){.       
29900 20 2f 2a 20 49 53 20 54 52 55 45 20 61 6e 64 20   /* IS TRUE and 
29910 49 53 20 4e 4f 54 20 46 41 4c 53 45 20 2a 2f 0a  IS NOT FALSE */.
29920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
29930 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
29940 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
29950 20 64 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20   dest,.         
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29970 20 20 69 73 4e 6f 74 20 3f 20 30 20 3a 20 53 51    isNot ? 0 : SQ
29980 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
29990 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ;..      }else{.
299a0 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20 46 41          /* IS FA
299b0 4c 53 45 20 61 6e 64 20 49 53 20 4e 4f 54 20 54  LSE and IS NOT T
299c0 52 55 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  RUE */.        s
299d0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
299e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
299f0 70 4c 65 66 74 2c 20 64 65 73 74 2c 0a 20 20 20  pLeft, dest,.   
29a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a10 20 20 20 20 20 20 20 69 73 4e 6f 74 20 3f 20 30         isNot ? 0
29a20 20 3a 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   : SQLITE_JUMPIF
29a30 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
29a40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29a50 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
29a60 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
29a70 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63  NOT:.      testc
29a80 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
29a90 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
29aa0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
29ab0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
29ac0 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70        op = (pExp
29ad0 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  r->op==TK_IS) ? 
29ae0 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20  TK_NE : TK_EQ;. 
29af0 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20       jumpIfNull 
29b00 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
29b10 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
29b20 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  hru */.    case 
29b30 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
29b40 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
29b50 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
29b60 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
29b70 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
29b80 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69  TK_EQ: {.      i
29b90 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
29ba0 56 65 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c  Vector(pExpr->pL
29bb0 65 66 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61  eft) ) goto defa
29bc0 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20  ult_expr;.      
29bd0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
29be0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
29bf0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
29c00 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
29c10 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
29c20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
29c30 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
29c40 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
29c50 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
29c60 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
29c70 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
29c80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
29c90 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
29ca0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
29cb0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
29cc0 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
29cd0 75 6c 6c 2c 45 78 70 72 48 61 73 50 72 6f 70 65  ull,ExprHasPrope
29ce0 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6d  rty(pExpr,EP_Com
29cf0 6d 75 74 65 64 29 29 3b 0a 20 20 20 20 20 20 61  muted));.      a
29d00 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
29d10 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
29d20 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
29d30 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
29d40 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
29d50 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
29d60 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
29d70 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
29d80 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
29d90 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
29da0 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
29db0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
29dc0 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
29dd0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
29de0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29df0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
29e00 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
29e10 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
29e20 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
29e30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
29e40 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
29e50 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
29e60 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
29e70 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
29e80 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
29e90 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
29ea0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
29eb0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
29ec0 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
29ed0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
29ee0 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Q);.      assert
29ef0 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
29f00 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
29f10 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Ne);.      VdbeC
29f20 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
29f30 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
29f40 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
29f50 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
29f60 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
29f70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
29f80 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
29f90 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
29fa0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
29fb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
29fc0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
29fd0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
29fe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
29ff0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
2a000 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
2a010 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
2a020 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
2a030 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
2a040 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
2a050 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2a060 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
2a070 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
2a080 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
2a090 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20  ==TK_ISNULL );  
2a0a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2a0b0 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
2a0c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2a0d0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
2a0e0 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  L );  VdbeCovera
2a0f0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
2a100 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
2a110 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
2a120 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
2a130 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2a140 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
2a150 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2a160 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
2a170 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
2a180 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
2a190 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71   pExpr, dest, sq
2a1a0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
2a1b0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
2a1c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a1d0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
2a1e0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
2a1f0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
2a200 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49  .      if( jumpI
2a210 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  fNull ){.       
2a220 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2a230 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
2a240 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20  , dest, dest);. 
2a250 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a260 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
2a270 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
2a280 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
2a290 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2a2a0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
2a2b0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
2a2c0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
2a2d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2a2e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2a2f0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
2a300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
2a310 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
2a320 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
2a330 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
2a340 3a 20 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  : .      if( Exp
2a350 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
2a360 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
2a370 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
2a380 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
2a390 65 6c 73 65 20 69 66 28 20 45 78 70 72 41 6c 77  else if( ExprAlw
2a3a0 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
2a3b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  {.        /* no-
2a3c0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
2a3d0 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
2a3e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
2a3f0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
2a400 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
2a410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2a420 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
2a430 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
2a440 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
2a450 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
2a460 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
2a470 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
2a480 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
2a490 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
2a4a0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
2a4b0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
2a4c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
2a4d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2a4e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
2a4f0 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
2a500 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
2a510 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
2a520 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
2a530 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2a540 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  se() except that
2a550 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   a copy is made 
2a560 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a  of pExpr before.
2a570 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ** code generati
2a580 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70  on, and that cop
2a590 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74  y is deleted aft
2a5a0 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  er code generati
2a5b0 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75  on. This.** ensu
2a5c0 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69  res that the ori
2a5d0 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75  ginal pExpr is u
2a5e0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
2a5f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
2a600 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70  alseDup(Parse *p
2a610 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
2a620 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74  pr, int dest,int
2a630 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
2a640 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2a650 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
2a660 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *pCopy = sqlite
2a670 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
2a680 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  pr, 0);.  if( db
2a690 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
2a6a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2a6b0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2a6c0 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c  se, pCopy, dest,
2a6d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
2a6e0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
2a6f0 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29  elete(db, pCopy)
2a700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65  ;.}../*.** Expre
2a710 73 73 69 6f 6e 20 70 56 61 72 20 69 73 20 67 75  ssion pVar is gu
2a720 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
2a730 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 2e 20  n SQL variable. 
2a740 70 45 78 70 72 20 6d 61 79 20 62 65 20 61 6e 79  pExpr may be any
2a750 0a 2a 2a 20 74 79 70 65 20 6f 66 20 65 78 70 72  .** type of expr
2a760 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ession..**.** If
2a770 20 70 45 78 70 72 20 69 73 20 61 20 73 69 6d 70   pExpr is a simp
2a780 6c 65 20 53 51 4c 20 76 61 6c 75 65 20 2d 20 61  le SQL value - a
2a790 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c  n integer, real,
2a7a0 20 73 74 72 69 6e 67 2c 20 62 6c 6f 62 0a 2a 2a   string, blob.**
2a7b0 20 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2d   or NULL value -
2a7c0 20 74 68 65 6e 20 74 68 65 20 56 44 42 45 20 63   then the VDBE c
2a7d0 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70  urrently being p
2a7e0 72 65 70 61 72 65 64 20 69 73 20 63 6f 6e 66 69  repared is confi
2a7f0 67 75 72 65 64 0a 2a 2a 20 74 6f 20 72 65 2d 70  gured.** to re-p
2a800 72 65 70 61 72 65 20 65 61 63 68 20 74 69 6d 65  repare each time
2a810 20 61 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20   a new value is 
2a820 62 6f 75 6e 64 20 74 6f 20 76 61 72 69 61 62 6c  bound to variabl
2a830 65 20 70 56 61 72 2e 0a 2a 2a 0a 2a 2a 20 41 64  e pVar..**.** Ad
2a840 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 70  ditionally, if p
2a850 45 78 70 72 20 69 73 20 61 20 73 69 6d 70 6c 65  Expr is a simple
2a860 20 53 51 4c 20 76 61 6c 75 65 20 61 6e 64 20 74   SQL value and t
2a870 68 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 0a  he value is the.
2a880 2a 2a 20 73 61 6d 65 20 61 73 20 74 68 61 74 20  ** same as that 
2a890 63 75 72 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20  currently bound 
2a8a0 74 6f 20 76 61 72 69 61 62 6c 65 20 70 56 61 72  to variable pVar
2a8b0 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  , non-zero is re
2a8c0 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
2a8d0 77 69 73 65 2c 20 69 66 20 74 68 65 20 76 61 6c  wise, if the val
2a8e0 75 65 73 20 61 72 65 20 6e 6f 74 20 74 68 65 20  ues are not the 
2a8f0 73 61 6d 65 20 6f 72 20 69 66 20 70 45 78 70 72  same or if pExpr
2a900 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65   is not a simple
2a910 0a 2a 2a 20 53 51 4c 20 76 61 6c 75 65 2c 20 7a  .** SQL value, z
2a920 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
2a930 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
2a940 78 70 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62  xprCompareVariab
2a950 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
2a960 2c 20 45 78 70 72 20 2a 70 56 61 72 2c 20 45 78  , Expr *pVar, Ex
2a970 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
2a980 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 6e 74  t res = 0;.  int
2a990 20 69 56 61 72 3b 0a 20 20 73 71 6c 69 74 65 33   iVar;.  sqlite3
2a9a0 5f 76 61 6c 75 65 20 2a 70 4c 2c 20 2a 70 52 20  _value *pL, *pR 
2a9b0 3d 20 30 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65  = 0;.  .  sqlite
2a9c0 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  3ValueFromExpr(p
2a9d0 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
2a9e0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
2a9f0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c 20  QLITE_AFF_BLOB, 
2aa00 26 70 52 29 3b 0a 20 20 69 66 28 20 70 52 20 29  &pR);.  if( pR )
2aa10 7b 0a 20 20 20 20 69 56 61 72 20 3d 20 70 56 61  {.    iVar = pVa
2aa20 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
2aa30 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
2aa40 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
2aa50 64 62 65 2c 20 69 56 61 72 29 3b 0a 20 20 20 20  dbe, iVar);.    
2aa60 70 4c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pL = sqlite3Vdbe
2aa70 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 50  GetBoundValue(pP
2aa80 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
2aa90 2c 20 69 56 61 72 2c 20 53 51 4c 49 54 45 5f 41  , iVar, SQLITE_A
2aaa0 46 46 5f 42 4c 4f 42 29 3b 0a 20 20 20 20 69 66  FF_BLOB);.    if
2aab0 28 20 70 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  ( pL ){.      if
2aac0 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2aad0 74 79 70 65 28 70 4c 29 3d 3d 53 51 4c 49 54 45  type(pL)==SQLITE
2aae0 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
2aaf0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2ab00 65 78 74 28 70 4c 29 3b 20 2f 2a 20 4d 61 6b 65  ext(pL); /* Make
2ab10 20 73 75 72 65 20 74 68 65 20 65 6e 63 6f 64 69   sure the encodi
2ab20 6e 67 20 69 73 20 55 54 46 2d 38 20 2a 2f 0a 20  ng is UTF-8 */. 
2ab30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73       }.      res
2ab40 20 3d 20 20 30 3d 3d 73 71 6c 69 74 65 33 4d 65   =  0==sqlite3Me
2ab50 6d 43 6f 6d 70 61 72 65 28 70 4c 2c 20 70 52 2c  mCompare(pL, pR,
2ab60 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
2ab70 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
2ab80 70 52 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pR);.    sqlite3
2ab90 56 61 6c 75 65 46 72 65 65 28 70 4c 29 3b 0a 20  ValueFree(pL);. 
2aba0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73   }..  return res
2abb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
2abc0 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
2abd0 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
2abe0 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
2abf0 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a   0 if the two.**
2ac00 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
2ac10 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e   completely iden
2ac20 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31  tical.  Return 1
2ac30 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
2ac40 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c  only.** by a COL
2ac50 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74  LATE operator at
2ac60 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20   the top level. 
2ac70 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68 65   Return 2 if the
2ac80 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63  re are differenc
2ac90 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e  es.** other than
2aca0 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43   the top-level C
2acb0 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
2acc0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
2acd0 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
2ace0 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
2acf0 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
2ad00 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
2ad10 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
2ad20 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
2ad30 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
2ad40 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
2ad50 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20  b..**.** The pA 
2ad60 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75 73  side might be us
2ad70 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e  ing TK_REGISTER.
2ad80 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
2ad90 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a   case and pB is.
2ada0 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f  ** not using TK_
2adb0 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73 20  REGISTER but is 
2adc0 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76 61  otherwise equiva
2add0 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c  lent, then still
2ade0 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a   return 0..**.**
2adf0 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20   Sometimes this 
2ae00 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
2ae10 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68  urn 2 even if th
2ae20 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  e two expression
2ae30 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20  s.** really are 
2ae40 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20  equivalent.  If 
2ae50 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20  we cannot prove 
2ae60 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
2ae70 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e  ions are.** iden
2ae80 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e  tical, we return
2ae90 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61   2 just to be sa
2aea0 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  fe.  So if this 
2aeb0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
2aec0 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64  ns 2, then you d
2aed0 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f  o not really kno
2aee0 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66  w for certain if
2aef0 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
2af00 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
2af10 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f  same.  But if yo
2af20 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20 72  u get a 0 or 1 r
2af30 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a  eturn, then you.
2af40 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  ** can be sure t
2af50 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
2af60 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e  re the same.  In
2af70 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72   the places wher
2af80 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
2af90 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f  e is used, it do
2afa0 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67  es not hurt to g
2afb0 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20  et an extra 2 - 
2afc0 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67  that.** just mig
2afd0 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d  ht result in som
2afe0 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65  e slightly slowe
2aff0 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74  r code.  But ret
2b000 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63  urning.** an inc
2b010 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f  orrect 0 or 1 co
2b020 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61  uld lead to a ma
2b030 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  lfunction..**.**
2b040 20 49 66 20 70 50 61 72 73 65 20 69 73 20 6e 6f   If pParse is no
2b050 74 20 4e 55 4c 4c 20 74 68 65 6e 20 54 4b 5f 56  t NULL then TK_V
2b060 41 52 49 41 42 4c 45 20 74 65 72 6d 73 20 69 6e  ARIABLE terms in
2b070 20 70 41 20 77 69 74 68 20 62 69 6e 64 69 6e 67   pA with binding
2b080 73 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  s in.** pParse->
2b090 70 52 65 70 72 65 70 61 72 65 20 63 61 6e 20 62  pReprepare can b
2b0a0 65 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73  e matched agains
2b0b0 74 20 6c 69 74 65 72 61 6c 73 20 69 6e 20 70 42  t literals in pB
2b0c0 2e 20 20 54 68 65 20 0a 2a 2a 20 70 50 61 72 73  .  The .** pPars
2b0d0 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61 73  e->pVdbe->expmas
2b0e0 6b 20 62 69 74 6d 61 73 6b 20 69 73 20 75 70 64  k bitmask is upd
2b0f0 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 76 61  ated for each va
2b100 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  riable reference
2b110 64 2e 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 20  d..** If pParse 
2b120 69 73 20 4e 55 4c 4c 20 28 74 68 65 20 6e 6f 72  is NULL (the nor
2b130 6d 61 6c 20 63 61 73 65 29 20 74 68 65 6e 20 61  mal case) then a
2b140 6e 79 20 54 4b 5f 56 41 52 49 41 42 4c 45 20 74  ny TK_VARIABLE t
2b150 65 72 6d 20 69 6e 20 0a 2a 2a 20 41 72 67 75 6d  erm in .** Argum
2b160 65 6e 74 20 70 50 61 72 73 65 20 73 68 6f 75 6c  ent pParse shoul
2b170 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 4e 55  d normally be NU
2b180 4c 4c 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  LL. If it is not
2b190 20 4e 55 4c 4c 20 61 6e 64 20 70 41 20 6f 72 0a   NULL and pA or.
2b1a0 2a 2a 20 70 42 20 63 61 75 73 65 73 20 61 20 72  ** pB causes a r
2b1b0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32  eturn value of 2
2b1c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b1d0 45 78 70 72 43 6f 6d 70 61 72 65 28 50 61 72 73  ExprCompare(Pars
2b1e0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
2b1f0 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69  *pA, Expr *pB, i
2b200 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20  nt iTab){.  u32 
2b210 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20  combinedFlags;. 
2b220 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
2b230 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2b240 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32  n pB==pA ? 0 : 2
2b250 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
2b260 73 65 20 26 26 20 70 41 2d 3e 6f 70 3d 3d 54 4b  se && pA->op==TK
2b270 5f 56 41 52 49 41 42 4c 45 20 26 26 20 65 78 70  _VARIABLE && exp
2b280 72 43 6f 6d 70 61 72 65 56 61 72 69 61 62 6c 65  rCompareVariable
2b290 28 70 50 61 72 73 65 2c 20 70 41 2c 20 70 42 29  (pParse, pA, pB)
2b2a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2b2b0 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64  ;.  }.  combined
2b2c0 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67  Flags = pA->flag
2b2d0 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20  s | pB->flags;. 
2b2e0 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
2b2f0 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
2b300 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d   ){.    if( (pA-
2b310 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73  >flags&pB->flags
2b320 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30  &EP_IntValue)!=0
2b330 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65   && pA->u.iValue
2b340 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29  ==pB->u.iValue )
2b350 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
2b360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
2b370 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
2b380 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 7c  pA->op!=pB->op |
2b390 7c 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 52 41 49  | pA->op==TK_RAI
2b3a0 53 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  SE ){.    if( pA
2b3b0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
2b3c0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
2b3d0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
2b3e0 41 2d 3e 70 4c 65 66 74 2c 70 42 2c 69 54 61 62  A->pLeft,pB,iTab
2b3f0 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
2b400 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2b410 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f   if( pB->op==TK_
2b420 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
2b430 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2b440 61 72 73 65 2c 20 70 41 2c 70 42 2d 3e 70 4c 65  arse, pA,pB->pLe
2b450 66 74 2c 69 54 61 62 29 3c 32 20 29 7b 0a 20 20  ft,iTab)<2 ){.  
2b460 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2b470 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
2b480 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
2b490 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op!=TK_COLUMN &&
2b4a0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f   pA->op!=TK_AGG_
2b4b0 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e  COLUMN && pA->u.
2b4c0 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  zToken ){.    if
2b4d0 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  ( pA->op==TK_FUN
2b4e0 43 54 49 4f 4e 20 7c 7c 20 70 41 2d 3e 6f 70 3d  CTION || pA->op=
2b4f0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2b500 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
2b510 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d  lite3StrICmp(pA-
2b520 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
2b530 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74  zToken)!=0 ) ret
2b540 75 72 6e 20 32 3b 0a 23 69 66 6e 64 65 66 20 53  urn 2;.#ifndef S
2b550 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
2b560 57 46 55 4e 43 0a 20 20 20 20 20 20 61 73 73 65  WFUNC.      asse
2b570 72 74 28 20 70 41 2d 3e 6f 70 3d 3d 70 42 2d 3e  rt( pA->op==pB->
2b580 6f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  op );.      if( 
2b590 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2b5a0 70 41 2c 45 50 5f 57 69 6e 46 75 6e 63 29 21 3d  pA,EP_WinFunc)!=
2b5b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2b5c0 70 42 2c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  pB,EP_WinFunc) )
2b5d0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2b5e0 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   2;.      }.    
2b5f0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
2b600 70 65 72 74 79 28 70 41 2c 45 50 5f 57 69 6e 46  perty(pA,EP_WinF
2b610 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
2b620 69 66 28 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  if( sqlite3Windo
2b630 77 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  wCompare(pParse,
2b640 20 70 41 2d 3e 79 2e 70 57 69 6e 2c 20 70 42 2d   pA->y.pWin, pB-
2b650 3e 79 2e 70 57 69 6e 2c 20 31 29 21 3d 30 20 29  >y.pWin, 1)!=0 )
2b660 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2b670 72 6e 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 2;.        }.
2b680 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2b690 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d     }else if( pA-
2b6a0 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a  >op==TK_NULL ){.
2b6b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2b6c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
2b6d0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
2b6e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
2b6f0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 41  lite3_stricmp(pA
2b700 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
2b710 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65  .zToken)!=0 ) re
2b720 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73  turn 2;.    }els
2b730 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 42 2d  e if( ALWAYS(pB-
2b740 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 29 20 26 26  >u.zToken!=0) &&
2b750 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54   strcmp(pA->u.zT
2b760 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
2b770 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
2b780 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
2b790 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c   }.  if( (pA->fl
2b7a0 61 67 73 20 26 20 28 45 50 5f 44 69 73 74 69 6e  ags & (EP_Distin
2b7b0 63 74 7c 45 50 5f 43 6f 6d 6d 75 74 65 64 29 29  ct|EP_Commuted))
2b7c0 0a 20 20 20 20 20 21 3d 20 28 70 42 2d 3e 66 6c  .     != (pB->fl
2b7d0 61 67 73 20 26 20 28 45 50 5f 44 69 73 74 69 6e  ags & (EP_Distin
2b7e0 63 74 7c 45 50 5f 43 6f 6d 6d 75 74 65 64 29 29  ct|EP_Commuted))
2b7f0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
2b800 66 28 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  f( (combinedFlag
2b810 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  s & EP_TokenOnly
2b820 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2b830 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
2b840 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72  EP_xIsSelect ) r
2b850 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
2b860 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20   (combinedFlags 
2b870 26 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 3d 3d  & EP_FixedCol)==
2b880 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  0.     && sqlite
2b890 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
2b8a0 72 73 65 2c 20 70 41 2d 3e 70 4c 65 66 74 2c 20  rse, pA->pLeft, 
2b8b0 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  pB->pLeft, iTab)
2b8c0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
2b8d0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2b8e0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
2b8f0 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
2b900 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 20  pRight, iTab) ) 
2b910 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
2b920 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
2b930 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70  tCompare(pA->x.p
2b940 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73  List, pB->x.pLis
2b950 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
2b960 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  n 2;.    if( pA-
2b970 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 0a 20  >op!=TK_STRING. 
2b980 20 20 20 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54      && pA->op!=T
2b990 4b 5f 54 52 55 45 46 41 4c 53 45 0a 20 20 20 20  K_TRUEFALSE.    
2b9a0 20 26 26 20 28 63 6f 6d 62 69 6e 65 64 46 6c 61   && (combinedFla
2b9b0 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64 29  gs & EP_Reduced)
2b9c0 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
2b9d0 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e   if( pA->iColumn
2b9e0 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
2b9f0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20  return 2;.      
2ba00 69 66 28 20 70 41 2d 3e 6f 70 32 21 3d 70 42 2d  if( pA->op2!=pB-
2ba10 3e 6f 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20  >op2 ){.        
2ba20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 54  if( pA->op==TK_T
2ba30 52 55 54 48 20 29 20 72 65 74 75 72 6e 20 32 3b  RUTH ) return 2;
2ba40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 2d  .        if( pA-
2ba50 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
2ba60 20 26 26 20 69 54 61 62 3c 30 20 29 7b 0a 20 20   && iTab<0 ){.  
2ba70 20 20 20 20 20 20 20 20 2f 2a 20 45 78 3a 20 43          /* Ex: C
2ba80 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
2ba90 20 43 48 45 43 4b 28 20 61 3c 6a 75 6c 69 61 6e   CHECK( a<julian
2baa0 64 61 79 28 27 6e 6f 77 27 29 20 29 29 3b 0a 20  day('now') ));. 
2bab0 20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20           **     
2bac0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 61  INSERT INTO t1(a
2bad0 29 20 56 41 4c 55 45 53 28 6a 75 6c 69 61 6e 64  ) VALUES(juliand
2bae0 61 79 28 27 6e 6f 77 27 29 2b 31 30 29 3b 0a 20  ay('now')+10);. 
2baf0 20 20 20 20 20 20 20 20 20 2a 2a 20 57 69 74 68           ** With
2bb00 6f 75 74 20 74 68 69 73 20 74 65 73 74 2c 20 73  out this test, s
2bb10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
2bb20 49 6e 69 74 28 29 20 77 69 6c 6c 20 72 75 6e 20  Init() will run 
2bb30 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  on the.         
2bb40 20 2a 2a 20 74 68 65 20 6a 75 6c 69 61 6e 64 61   ** the julianda
2bb50 79 28 29 20 6f 66 20 49 4e 53 45 52 54 20 66 69  y() of INSERT fi
2bb60 72 73 74 2c 20 61 6e 64 20 72 65 6d 65 6d 62 65  rst, and remembe
2bb70 72 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  r that expressio
2bb80 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  n..          ** 
2bb90 54 68 65 6e 20 73 71 6c 69 74 65 33 45 78 70 72  Then sqlite3Expr
2bba0 43 6f 64 65 49 6e 69 74 28 29 20 77 69 6c 6c 20  CodeInit() will 
2bbb0 73 65 65 20 74 68 65 20 6a 75 6c 69 61 6e 64 61  see the julianda
2bbc0 79 28 29 20 69 6e 20 74 68 65 20 43 48 45 43 4b  y() in the CHECK
2bbd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
2bbe0 6e 73 74 72 61 69 6e 74 20 61 73 20 72 65 64 75  nstraint as redu
2bbf0 6e 64 61 6e 74 2c 20 72 65 75 73 69 6e 67 20 74  ndant, reusing t
2bc00 68 65 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20  he one from the 
2bc10 49 4e 53 45 52 54 2c 20 65 76 65 6e 0a 20 20 20  INSERT, even.   
2bc20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68         ** though
2bc30 20 74 68 65 20 6a 75 6c 69 61 6e 64 61 79 28 29   the julianday()
2bc40 20 69 6e 20 49 4e 53 45 52 54 20 6c 61 63 6b 73   in INSERT lacks
2bc50 20 74 68 65 20 63 72 69 74 69 63 61 6c 20 4e 43   the critical NC
2bc60 5f 49 73 43 68 65 63 6b 0a 20 20 20 20 20 20 20  _IsCheck.       
2bc70 20 20 20 2a 2a 20 66 6c 61 67 2e 20 20 53 65 65     ** flag.  See
2bc80 20 74 69 63 6b 65 74 20 5b 38 33 30 32 37 37 64   ticket [830277d
2bc90 39 64 62 36 63 33 62 61 31 5d 20 28 32 30 31 39  9db6c3ba1] (2019
2bca0 2d 31 30 2d 33 30 29 0a 20 20 20 20 20 20 20 20  -10-30).        
2bcb0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
2bcc0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 20  eturn 2;.       
2bcd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2bce0 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
2bcf0 49 4e 20 26 26 20 70 41 2d 3e 69 54 61 62 6c 65  IN && pA->iTable
2bd00 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 26 26 20  !=pB->iTable && 
2bd10 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
2bd20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2bd30 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 2;.      }.  
2bd40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2bd50 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   0;.}../*.** Com
2bd60 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73  pare two ExprLis
2bd70 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75  t objects.  Retu
2bd80 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72 65  rn 0 if they are
2bd90 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a   identical and .
2bda0 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ** non-zero if t
2bdb0 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e  hey differ in an
2bdc0 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  y way..**.** If 
2bdd0 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f  any subelement o
2bde0 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54  f pB has Expr.iT
2bdf0 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20  able==(-1) then 
2be00 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  it is allowed.**
2be10 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61   to compare equa
2be20 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65  l to an equivale
2be30 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41  nt element in pA
2be40 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c   with Expr.iTabl
2be50 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54  e==iTab..**.** T
2be60 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
2be70 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  t return non-zer
2be80 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  o for equivalent
2be90 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65   ExprLists.  The
2bea0 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75  .** only consequ
2beb0 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73  ence will be dis
2bec0 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69  abled optimizati
2bed0 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20 72  ons.  But this r
2bee0 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e  outine.** must n
2bef0 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69 66  ever return 0 if
2bf00 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73   the two ExprLis
2bf10 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69  t objects are di
2bf20 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61  fferent, or.** a
2bf30 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c   malfunction wil
2bf40 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  l result..**.** 
2bf50 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  Two NULL pointer
2bf60 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
2bf70 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e   to be the same.
2bf80 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69    But a NULL poi
2bf90 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64  nter.** always d
2bfa0 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f  iffers from a no
2bfb0 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  n-NULL pointer..
2bfc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2bfd0 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78  prListCompare(Ex
2bfe0 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72  prList *pA, Expr
2bff0 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54  List *pB, int iT
2c000 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ab){.  int i;.  
2c010 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d  if( pA==0 && pB=
2c020 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2c030 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42   if( pA==0 || pB
2c040 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
2c050 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21    if( pA->nExpr!
2c060 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  =pB->nExpr ) ret
2c070 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 1;.  for(i=0
2c080 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69  ; i<pA->nExpr; i
2c090 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
2c0a0 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d  ExprA = pA->a[i]
2c0b0 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  .pExpr;.    Expr
2c0c0 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61   *pExprB = pB->a
2c0d0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
2c0e0 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74  f( pA->a[i].sort
2c0f0 46 6c 61 67 73 21 3d 70 42 2d 3e 61 5b 69 5d 2e  Flags!=pB->a[i].
2c100 73 6f 72 74 46 6c 61 67 73 20 29 20 72 65 74 75  sortFlags ) retu
2c110 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 1;.    if( sq
2c120 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2c130 28 30 2c 20 70 45 78 70 72 41 2c 20 70 45 78 70  (0, pExprA, pExp
2c140 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  rB, iTab) ) retu
2c150 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
2c160 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn 0;.}../*.** L
2c170 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  ike sqlite3ExprC
2c180 6f 6d 70 61 72 65 28 29 20 65 78 63 65 70 74 20  ompare() except 
2c190 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
2c1a0 73 20 61 74 20 74 68 65 20 74 6f 70 2d 6c 65 76  s at the top-lev
2c1b0 65 6c 0a 2a 2a 20 61 72 65 20 69 67 6e 6f 72 65  el.** are ignore
2c1c0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2c1d0 33 45 78 70 72 43 6f 6d 70 61 72 65 53 6b 69 70  3ExprCompareSkip
2c1e0 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
2c1f0 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
2c200 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2c210 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a 20  ExprCompare(0,. 
2c220 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c230 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2c240 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 41 29 2c  teAndLikely(pA),
2c250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
2c260 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2c270 6c 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 42  lateAndLikely(pB
2c280 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2c290 69 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iTab);.}../*.** 
2c2a0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
2c2b0 69 66 20 45 78 70 72 20 70 20 63 61 6e 20 6f 6e  if Expr p can on
2c2c0 6c 79 20 62 65 20 74 72 75 65 20 69 66 20 70 4e  ly be true if pN
2c2d0 4e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 2a  N is not NULL..*
2c2e0 2a 0a 2a 2a 20 4f 72 20 69 66 20 73 65 65 6e 4e  *.** Or if seenN
2c2f0 6f 74 20 69 73 20 74 72 75 65 2c 20 72 65 74 75  ot is true, retu
2c300 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 45  rn non-zero if E
2c310 78 70 72 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62  xpr p can only b
2c320 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e.** non-NULL if
2c330 20 70 4e 4e 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   pNN is not NULL
2c340 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
2c350 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c  xprImpliesNotNul
2c360 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
2c370 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
2c380 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
2c390 20 45 78 70 72 20 2a 70 2c 20 20 20 20 20 20 20   Expr *p,       
2c3a0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
2c3b0 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 63 68 65  ession to be che
2c3c0 63 6b 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  cked */.  Expr *
2c3d0 70 4e 4e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pNN,          /*
2c3e0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
2c3f0 74 68 61 74 20 69 73 20 4e 4f 54 20 4e 55 4c 4c  that is NOT NULL
2c400 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
2c410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
2c420 6c 65 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74  le being evaluat
2c430 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e  ed */.  int seen
2c440 4e 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20 52  Not         /* R
2c450 65 74 75 72 6e 20 74 72 75 65 20 6f 6e 6c 79 20  eturn true only 
2c460 69 66 20 70 20 63 61 6e 20 62 65 20 61 6e 79 20  if p can be any 
2c470 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 2a  non-NULL value *
2c480 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
2c490 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   );.  assert( pN
2c4a0 4e 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  N );.  if( sqlit
2c4b0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
2c4c0 61 72 73 65 2c 20 70 2c 20 70 4e 4e 2c 20 69 54  arse, p, pNN, iT
2c4d0 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ab)==0 ){.    re
2c4e0 74 75 72 6e 20 70 4e 4e 2d 3e 6f 70 21 3d 54 4b  turn pNN->op!=TK
2c4f0 5f 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 73 77 69  _NULL;.  }.  swi
2c500 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
2c510 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
2c520 20 20 20 20 20 20 69 66 28 20 73 65 65 6e 4e 6f        if( seenNo
2c530 74 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  t && ExprHasProp
2c540 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
2c550 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e 20 30  lect) ) return 0
2c560 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2c570 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2c580 70 2c 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a  p,EP_xIsSelect).
2c590 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
2c5a0 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20  ->x.pList!=0 && 
2c5b0 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  p->x.pList->nExp
2c5c0 72 3e 30 29 20 29 3b 0a 20 20 20 20 20 20 72 65  r>0) );.      re
2c5d0 74 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73  turn exprImplies
2c5e0 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20  NotNull(pParse, 
2c5f0 70 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69  p->pLeft, pNN, i
2c600 54 61 62 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  Tab, 1);.    }. 
2c610 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
2c620 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
2c630 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 2d  List *pList = p-
2c640 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
2c650 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
2c660 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2c670 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
2c680 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
2c690 65 65 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e 20  eenNot ) return 
2c6a0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70  0;.      if( exp
2c6b0 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 28  rImpliesNotNull(
2c6c0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
2c6d0 5b 30 5d 2e 70 45 78 70 72 2c 20 70 4e 4e 2c 20  [0].pExpr, pNN, 
2c6e0 69 54 61 62 2c 20 31 29 0a 20 20 20 20 20 20 20  iTab, 1).       
2c6f0 7c 7c 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f  || exprImpliesNo
2c700 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 4c  tNull(pParse, pL
2c710 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2c  ist->a[1].pExpr,
2c720 20 70 4e 4e 2c 20 69 54 61 62 2c 20 31 29 0a 20   pNN, iTab, 1). 
2c730 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c740 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2c750 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 65  }.      return e
2c760 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c  xprImpliesNotNul
2c770 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 65  l(pParse, p->pLe
2c780 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 31  ft, pNN, iTab, 1
2c790 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
2c7a0 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73  e TK_EQ:.    cas
2c7b0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
2c7c0 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
2c7d0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
2c7e0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
2c7f0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
2c800 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
2c810 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
2c820 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
2c830 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
2c840 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
2c850 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
2c860 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 0a 20  se TK_CONCAT: . 
2c870 20 20 20 20 20 73 65 65 6e 4e 6f 74 20 3d 20 31       seenNot = 1
2c880 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
2c890 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65  thru */.    case
2c8a0 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
2c8b0 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63  se TK_REM:.    c
2c8c0 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20  ase TK_BITAND:. 
2c8d0 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
2c8e0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78  : {.      if( ex
2c8f0 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  prImpliesNotNull
2c900 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 52 69 67  (pParse, p->pRig
2c910 68 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20 73  ht, pNN, iTab, s
2c920 65 65 6e 4e 6f 74 29 20 29 20 72 65 74 75 72 6e  eenNot) ) return
2c930 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c   1;.      /* Fal
2c940 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
2c950 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
2c960 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
2c970 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  PAN:.    case TK
2c980 5f 43 4f 4c 4c 41 54 45 3a 0a 20 20 20 20 63 61  _COLLATE:.    ca
2c990 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20  se TK_UPLUS:.   
2c9a0 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
2c9b0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
2c9c0 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75  exprImpliesNotNu
2c9d0 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  ll(pParse, p->pL
2c9e0 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62 2c 20  eft, pNN, iTab, 
2c9f0 73 65 65 6e 4e 6f 74 29 3b 0a 20 20 20 20 7d 0a  seenNot);.    }.
2ca00 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 55 54      case TK_TRUT
2ca10 48 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  H: {.      if( s
2ca20 65 65 6e 4e 6f 74 20 29 20 72 65 74 75 72 6e 20  eenNot ) return 
2ca30 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
2ca40 6f 70 32 21 3d 54 4b 5f 49 53 20 29 20 72 65 74  op2!=TK_IS ) ret
2ca50 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 72 65 74  urn 0;.      ret
2ca60 75 72 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e  urn exprImpliesN
2ca70 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70  otNull(pParse, p
2ca80 2d 3e 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54  ->pLeft, pNN, iT
2ca90 61 62 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ab, 1);.    }.  
2caa0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
2cab0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
2cac0 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T: {.      retur
2cad0 6e 20 65 78 70 72 49 6d 70 6c 69 65 73 4e 6f 74  n exprImpliesNot
2cae0 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 70 2d 3e  Null(pParse, p->
2caf0 70 4c 65 66 74 2c 20 70 4e 4e 2c 20 69 54 61 62  pLeft, pNN, iTab
2cb00 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 1);.    }.  }.
2cb10 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2cb20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2cb30 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65   if we can prove
2cb40 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c   the pE2 will al
2cb50 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20  ways be true if 
2cb60 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20  pE1 is.** true. 
2cb70 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
2cb80 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c   we cannot compl
2cb90 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72  ete the proof or
2cba0 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a   if pE2 might.**
2cbb0 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d   be false.  Exam
2cbc0 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
2cbd0 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE1: x==5       
2cbe0 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
2cbf0 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72        Result: tr
2cc00 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
2cc10 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78  >0        pE2: x
2cc20 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
2cc30 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Result: false.**
2cc40 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20       pE1: x=21  
2cc50 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f       pE2: x=21 O
2cc60 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c  R y=43     Resul
2cc70 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
2cc80 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70  E1: x!=123     p
2cc90 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
2cca0 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
2ccb0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
2ccc0 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20  =?1      pE2: x 
2ccd0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
2cce0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
2ccf0 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c     pE1: x IS NUL
2cd00 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54  L  pE2: x IS NOT
2cd10 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
2cd20 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
2cd30 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45  1: x IS ?2    pE
2cd40 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
2cd50 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73      Reuslt: fals
2cd60 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d  e.**.** When com
2cd70 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e  paring TK_COLUMN
2cd80 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70   nodes between p
2cd90 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70  E1 and pE2, if p
2cda0 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69  E2 has.** Expr.i
2cdb0 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73  Table<0 then ass
2cdc0 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62  ume a table numb
2cdd0 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62  er given by iTab
2cde0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 61 72 73  ..**.** If pPars
2cdf0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
2ce00 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 6f  hen the values o
2ce10 66 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65  f bound variable
2ce20 73 20 69 6e 20 70 45 31 20 61 72 65 20 0a 2a 2a  s in pE1 are .**
2ce30 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73   compared agains
2ce40 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73  t literal values
2ce50 20 69 6e 20 70 45 32 20 61 6e 64 20 70 50 61 72   in pE2 and pPar
2ce60 73 65 2d 3e 70 56 64 62 65 2d 3e 65 78 70 6d 61  se->pVdbe->expma
2ce70 73 6b 20 69 73 0a 2a 2a 20 6d 6f 64 69 66 69 65  sk is.** modifie
2ce80 64 20 74 6f 20 72 65 63 6f 72 64 20 77 68 69 63  d to record whic
2ce90 68 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65  h bound variable
2cea0 73 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64  s are referenced
2ceb0 2e 20 20 49 66 20 70 50 61 72 73 65 20 0a 2a 2a  .  If pParse .**
2cec0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 66   is NULL, then f
2ced0 61 6c 73 65 20 77 69 6c 6c 20 62 65 20 72 65 74  alse will be ret
2cee0 75 72 6e 65 64 20 69 66 20 70 45 31 20 63 6f 6e  urned if pE1 con
2cef0 74 61 69 6e 73 20 61 6e 79 20 62 6f 75 6e 64 20  tains any bound 
2cf00 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
2cf10 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   When in doubt, 
2cf20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52  return false.  R
2cf30 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69  eturning true mi
2cf40 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
2cf50 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76  rmance.** improv
2cf60 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  ement.  Returnin
2cf70 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61  g false might ca
2cf80 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  use a performanc
2cf90 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74  e reduction, but
2cfa0 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61  .** it will alwa
2cfb0 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72  ys give the corr
2cfc0 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69  ect answer and i
2cfd0 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73  s hence always s
2cfe0 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  afe..*/.int sqli
2cff0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
2d000 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pr(Parse *pParse
2d010 2c 20 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70  , Expr *pE1, Exp
2d020 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62  r *pE2, int iTab
2d030 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2d040 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
2d050 73 65 2c 20 70 45 31 2c 20 70 45 32 2c 20 69 54  se, pE1, pE2, iT
2d060 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ab)==0 ){.    re
2d070 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2d080 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  ( pE2->op==TK_OR
2d090 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45  .   && (sqlite3E
2d0a0 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
2d0b0 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45 32 2d  Parse, pE1, pE2-
2d0c0 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20  >pLeft, iTab).  
2d0d0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2d0e0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2d0f0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 31  Expr(pParse, pE1
2d100 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69  , pE2->pRight, i
2d110 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20  Tab) ).  ){.    
2d120 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2d130 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
2d140 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 65 78  NOTNULL.   && ex
2d150 70 72 49 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c  prImpliesNotNull
2d160 28 70 50 61 72 73 65 2c 20 70 45 31 2c 20 70 45  (pParse, pE1, pE
2d170 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 2c 20  2->pLeft, iTab, 
2d180 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  0).  ){.    retu
2d190 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
2d1a0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
2d1b0 68 69 73 20 69 73 20 74 68 65 20 45 78 70 72 20  his is the Expr 
2d1c0 6e 6f 64 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f  node callback fo
2d1d0 72 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  r sqlite3ExprImp
2d1e0 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 29  liesNonNullRow()
2d1f0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  ..** If the expr
2d200 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 71 75  ession node requ
2d210 69 72 65 73 20 74 68 61 74 20 74 68 65 20 74 61  ires that the ta
2d220 62 6c 65 20 61 74 20 70 57 61 6c 6b 65 72 2d 3e  ble at pWalker->
2d230 69 43 75 72 0a 2a 2a 20 68 61 76 65 20 6f 6e 65  iCur.** have one
2d240 20 6f 72 20 6d 6f 72 65 20 6e 6f 6e 2d 4e 55 4c   or more non-NUL
2d250 4c 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 73  L column, then s
2d260 65 74 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  et pWalker->eCod
2d270 65 20 74 6f 20 31 20 61 6e 64 20 61 62 6f 72 74  e to 1 and abort
2d280 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2d290 74 69 6e 65 20 63 6f 6e 74 72 6f 6c 73 20 61 6e  tine controls an
2d2a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
2d2b0 46 61 6c 73 65 20 70 6f 73 69 74 69 76 65 73 20  False positives 
2d2c0 28 73 65 74 74 69 6e 67 0a 2a 2a 20 70 57 61 6c  (setting.** pWal
2d2d0 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 31 20  ker->eCode to 1 
2d2e0 77 68 65 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e  when it should n
2d2f0 6f 74 20 62 65 29 20 61 72 65 20 64 65 61 64 6c  ot be) are deadl
2d300 79 2c 20 62 75 74 20 66 61 6c 73 65 2d 6e 65 67  y, but false-neg
2d310 61 74 69 76 65 73 0a 2a 2a 20 28 6e 65 76 65 72  atives.** (never
2d320 20 73 65 74 74 69 6e 67 20 70 57 61 6c 6b 65 72   setting pWalker
2d330 2d 3e 65 43 6f 64 65 29 20 69 73 20 61 20 68 61  ->eCode) is a ha
2d340 72 6d 6c 65 73 73 20 6d 69 73 73 65 64 20 6f 70  rmless missed op
2d350 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  timization..*/.s
2d360 74 61 74 69 63 20 69 6e 74 20 69 6d 70 6c 69 65  tatic int implie
2d370 73 4e 6f 74 4e 75 6c 6c 52 6f 77 28 57 61 6c 6b  sNotNullRow(Walk
2d380 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2d390 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 74 65 73  r *pExpr){.  tes
2d3a0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
2d3b0 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
2d3c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2d3d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
2d3e0 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69  _FUNCTION );.  i
2d3f0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
2d400 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
2d410 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
2d420 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 73 77 69  WRC_Prune;.  swi
2d430 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
2d440 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  {.    case TK_IS
2d450 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
2d460 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
2d470 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a 20 20  e TK_NOTNULL:.  
2d480 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
2d490 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
2d4a0 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52    case TK_VECTOR
2d4b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  :.    case TK_CA
2d4c0 53 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SE:.    case TK_
2d4d0 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IN:.    case TK_
2d4e0 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
2d4f0 73 65 20 54 4b 5f 54 52 55 54 48 3a 0a 20 20 20  se TK_TRUTH:.   
2d500 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2d510 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
2d520 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2d530 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
2d540 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
2d550 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
2d560 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op==TK_NOTNUL
2d570 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
2d580 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2d590 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
2d5a0 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2d5b0 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20  op==TK_OR );.   
2d5c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2d5d0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f  pr->op==TK_VECTO
2d5e0 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
2d5f0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2d600 54 4b 5f 43 41 53 45 20 29 3b 0a 20 20 20 20 20  TK_CASE );.     
2d610 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
2d620 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
2d630 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2d640 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  Expr->op==TK_FUN
2d650 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74  CTION );.      t
2d660 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2d670 6f 70 3d 3d 54 4b 5f 54 52 55 54 48 20 29 3b 0a  op==TK_TRUTH );.
2d680 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2d690 5f 50 72 75 6e 65 3b 0a 20 20 20 20 63 61 73 65  _Prune;.    case
2d6a0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
2d6b0 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75    if( pWalker->u
2d6c0 2e 69 43 75 72 3d 3d 70 45 78 70 72 2d 3e 69 54  .iCur==pExpr->iT
2d6d0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
2d6e0 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
2d6f0 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
2d700 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2d710 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2d720 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 0a 20  rn WRC_Prune;.. 
2d730 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
2d740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
2d750 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 30 20  alker->eCode==0 
2d760 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d770 57 61 6c 6b 45 78 70 72 28 70 57 61 6c 6b 65 72  WalkExpr(pWalker
2d780 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
2d790 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
2d7a0 65 72 2d 3e 65 43 6f 64 65 20 29 7b 0a 20 20 20  er->eCode ){.   
2d7b0 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
2d7c0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
2d7d0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2d7e0 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d  (pWalker, pExpr-
2d7f0 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
2d800 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  }.      return W
2d810 52 43 5f 50 72 75 6e 65 3b 0a 0a 20 20 20 20 63  RC_Prune;..    c
2d820 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 0a  ase TK_BETWEEN:.
2d830 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
2d840 6b 45 78 70 72 28 70 57 61 6c 6b 65 72 2c 20 70  kExpr(pWalker, p
2d850 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2d860 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2d870 72 75 6e 65 3b 0a 0a 20 20 20 20 2f 2a 20 56 69  rune;..    /* Vi
2d880 72 74 75 61 6c 20 74 61 62 6c 65 73 20 61 72 65  rtual tables are
2d890 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20   allowed to use 
2d8a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 6c 69 6b 65  constraints like
2d8b0 20 78 3d 4e 55 4c 4c 2e 20 20 53 6f 0a 20 20 20   x=NULL.  So.   
2d8c0 20 2a 2a 20 61 20 74 65 72 6d 20 6f 66 20 74 68   ** a term of th
2d8d0 65 20 66 6f 72 6d 20 78 3d 79 20 64 6f 65 73 20  e form x=y does 
2d8e0 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 79  not prove that y
2d8f0 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 69 66 20   is not null if 
2d900 78 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  x.    ** is the 
2d910 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 76 69 72 74  column of a virt
2d920 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ual table */.   
2d930 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20   case TK_EQ:.   
2d940 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
2d950 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
2d960 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
2d970 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
2d980 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
2d990 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2d9a0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  pr->op==TK_EQ );
2d9b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2d9c0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
2d9d0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
2d9e0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
2d9f0 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_LT );.      t
2da00 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
2da10 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
2da20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
2da30 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b  pr->op==TK_GT );
2da40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2da50 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
2da60 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  E );.      if( (
2da70 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pExpr->pLeft->op
2da80 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 49  ==TK_COLUMN && I
2da90 73 56 69 72 74 75 61 6c 28 70 45 78 70 72 2d 3e  sVirtual(pExpr->
2daa0 70 4c 65 66 74 2d 3e 79 2e 70 54 61 62 29 29 0a  pLeft->y.pTab)).
2dab0 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78 70 72         || (pExpr
2dac0 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
2dad0 5f 43 4f 4c 55 4d 4e 20 26 26 20 49 73 56 69 72  _COLUMN && IsVir
2dae0 74 75 61 6c 28 70 45 78 70 72 2d 3e 70 52 69 67  tual(pExpr->pRig
2daf0 68 74 2d 3e 79 2e 70 54 61 62 29 29 0a 20 20 20  ht->y.pTab)).   
2db00 20 20 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74     ){.       ret
2db10 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
2db20 20 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61       }..    defa
2db30 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
2db40 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2db50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
2db60 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
2db70 72 6f 29 20 69 66 20 65 78 70 72 65 73 73 69 6f  ro) if expressio
2db80 6e 20 70 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  n p can only be 
2db90 74 72 75 65 20 69 66 20 61 74 20 6c 65 61 73 74  true if at least
2dba0 0a 2a 2a 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  .** one column o
2dbb0 66 20 74 61 62 6c 65 20 69 54 61 62 20 69 73 20  f table iTab is 
2dbc0 6e 6f 6e 2d 6e 75 6c 6c 2e 20 20 49 6e 20 6f 74  non-null.  In ot
2dbd0 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
2dbe0 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 65 78 70  n true.** if exp
2dbf0 72 65 73 73 69 6f 6e 20 70 20 77 69 6c 6c 20 61  ression p will a
2dc00 6c 77 61 79 73 20 62 65 20 4e 55 4c 4c 20 6f 72  lways be NULL or
2dc10 20 66 61 6c 73 65 20 69 66 20 65 76 65 72 79 20   false if every 
2dc20 63 6f 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a  column of iTab.*
2dc30 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  * is NULL..**.**
2dc40 20 46 61 6c 73 65 20 6e 65 67 61 74 69 76 65 73   False negatives
2dc50 20 61 72 65 20 61 63 63 65 70 74 61 62 6c 65 2e   are acceptable.
2dc60 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
2dc70 2c 20 69 74 20 69 73 20 6f 6b 20 74 6f 20 72 65  , it is ok to re
2dc80 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 20 65 76 65  turn.** zero eve
2dc90 6e 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20  n if expression 
2dca0 70 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  p will never be 
2dcb0 74 72 75 65 20 6f 66 20 65 76 65 72 79 20 63 6f  true of every co
2dcc0 6c 75 6d 6e 20 6f 66 20 69 54 61 62 0a 2a 2a 20  lumn of iTab.** 
2dcd0 69 73 20 4e 55 4c 4c 2e 20 20 41 20 66 61 6c 73  is NULL.  A fals
2dce0 65 20 6e 65 67 61 74 69 76 65 20 69 73 20 6d 65  e negative is me
2dcf0 72 65 6c 79 20 61 20 6d 69 73 73 65 64 20 6f 70  rely a missed op
2dd00 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 70 70 6f 72  timization oppor
2dd10 74 75 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 46 61  tunity..**.** Fa
2dd20 6c 73 65 20 70 6f 73 69 74 69 76 65 73 20 61 72  lse positives ar
2dd30 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2c 20 68  e not allowed, h
2dd40 6f 77 65 76 65 72 2e 20 20 41 20 66 61 6c 73 65  owever.  A false
2dd50 20 70 6f 73 69 74 69 76 65 20 6d 61 79 20 72 65   positive may re
2dd60 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e  sult.** in an in
2dd70 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 0a  correct answer..
2dd80 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 70  **.** Terms of p
2dd90 20 74 68 61 74 20 61 72 65 20 6d 61 72 6b 65 64   that are marked
2dda0 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69   with EP_FromJoi
2ddb0 6e 20 28 61 6e 64 20 68 65 6e 63 65 20 74 68 61  n (and hence tha
2ddc0 74 20 63 6f 6d 65 20 66 72 6f 6d 0a 2a 2a 20 74  t come from.** t
2ddd0 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
2dde0 6c 61 75 73 65 73 20 6f 66 20 4c 45 46 54 20 4a  lauses of LEFT J
2ddf0 4f 49 4e 53 29 20 61 72 65 20 65 78 63 6c 75 64  OINS) are exclud
2de00 65 64 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c  ed from the anal
2de10 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ysis..**.** This
2de20 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
2de30 20 74 6f 20 63 68 65 63 6b 20 69 66 20 61 20 4c   to check if a L
2de40 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 62 65 20  EFT JOIN can be 
2de50 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 2a  converted into.*
2de60 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f  * an ordinary JO
2de70 49 4e 2e 20 20 54 68 65 20 70 20 61 72 67 75 6d  IN.  The p argum
2de80 65 6e 74 20 69 73 20 74 68 65 20 57 48 45 52 45  ent is the WHERE
2de90 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
2dea0 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65   WHERE.** clause
2deb0 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 73   requires that s
2dec0 6f 6d 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ome column of th
2ded0 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
2dee0 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a   the LEFT JOIN.*
2def0 2a 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  * be non-NULL, t
2df00 68 65 6e 20 74 68 65 20 4c 45 46 54 20 4a 4f 49  hen the LEFT JOI
2df10 4e 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20  N can be safely 
2df20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
2df30 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 6a 6f  n.** ordinary jo
2df40 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  in..*/.int sqlit
2df50 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e  e3ExprImpliesNon
2df60 4e 75 6c 6c 52 6f 77 28 45 78 70 72 20 2a 70 2c  NullRow(Expr *p,
2df70 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 57 61   int iTab){.  Wa
2df80 6c 6b 65 72 20 77 3b 0a 20 20 70 20 3d 20 73 71  lker w;.  p = sq
2df90 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
2dfa0 6c 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 29  lateAndLikely(p)
2dfb0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
2dfc0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
2dfd0 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
2dfe0 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   ){.    p = p->p
2dff0 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Left;.  }else{. 
2e000 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d     while( p->op=
2e010 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20  =TK_AND ){.     
2e020 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2e030 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f  ImpliesNonNullRo
2e040 77 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  w(p->pLeft, iTab
2e050 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
2e060 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68      p = p->pRigh
2e070 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77  t;.    }.  }.  w
2e080 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2e090 20 69 6d 70 6c 69 65 73 4e 6f 74 4e 75 6c 6c 52   impliesNotNullR
2e0a0 6f 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ow;.  w.xSelectC
2e0b0 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77  allback = 0;.  w
2e0c0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2e0d0 32 20 3d 20 30 3b 0a 20 20 77 2e 65 43 6f 64 65  2 = 0;.  w.eCode
2e0e0 20 3d 20 30 3b 0a 20 20 77 2e 75 2e 69 43 75 72   = 0;.  w.u.iCur
2e0f0 20 3d 20 69 54 61 62 3b 0a 20 20 73 71 6c 69 74   = iTab;.  sqlit
2e100 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
2e110 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
2e120 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ode;.}../*.** An
2e130 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2e140 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2e150 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
2e160 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
2e170 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
2e180 69 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  if an expression
2e190 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65   can be evaluate
2e1a0 64 20 62 79 20 72 65 66 65 72 65 6e 63 65 20 74  d by reference t
2e1b0 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  o the.** index o
2e1c0 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76  nly, without hav
2e1d0 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72  ing to do a sear
2e1e0 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ch for the corre
2e1f0 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c  sponding.** tabl
2e200 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64  e entry.  The Id
2e210 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c  xCover.pIdx fiel
2e220 64 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20  d is the index. 
2e230 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a   IdxCover.iCur.*
2e240 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  * is the cursor 
2e250 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  for the table..*
2e260 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76 65  /.struct IdxCove
2e270 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  r {.  Index *pId
2e280 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  x;     /* The in
2e290 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64  dex to be tested
2e2a0 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f   for coverage */
2e2b0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
2e2c0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
2e2d0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
2e2e0 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  le corresponding
2e2f0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   to the index */
2e300 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .};../*.** Check
2e310 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
2e320 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 73 20   are references 
2e330 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  to columns in ta
2e340 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d  ble .** pWalker-
2e350 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43  >u.pIdxCover->iC
2e360 75 72 20 63 61 6e 20 62 65 20 73 61 74 69 73 66  ur can be satisf
2e370 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e  ied using the in
2e380 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e  dex.** pWalker->
2e390 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64  u.pIdxCover->pId
2e3a0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
2e3b0 20 65 78 70 72 49 64 78 43 6f 76 65 72 28 57 61   exprIdxCover(Wa
2e3c0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2e3d0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
2e3e0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
2e3f0 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45  _COLUMN.   && pE
2e400 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
2e410 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
2e420 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71  r->iCur.   && sq
2e430 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e  lite3TableColumn
2e440 54 6f 49 6e 64 65 78 28 70 57 61 6c 6b 65 72 2d  ToIndex(pWalker-
2e450 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49  >u.pIdxCover->pI
2e460 64 78 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  dx, pExpr->iColu
2e470 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20 20 20 20 70  mn)<0.  ){.    p
2e480 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
2e490 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  1;.    return WR
2e4a0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72  C_Abort;.  }.  r
2e4b0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2e4c0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  ue;.}../*.** Det
2e4d0 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 69 6e 64  ermine if an ind
2e4e0 65 78 20 70 49 64 78 20 6f 6e 20 74 61 62 6c 65  ex pIdx on table
2e4f0 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75   with cursor iCu
2e500 72 20 63 6f 6e 74 61 69 6e 73 20 77 69 6c 6c 0a  r contains will.
2e510 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
2e520 6e 20 70 45 78 70 72 2e 20 20 52 65 74 75 72 6e  n pExpr.  Return
2e530 20 74 72 75 65 20 69 66 20 74 68 65 20 69 6e 64   true if the ind
2e540 65 78 20 64 6f 65 73 20 63 6f 76 65 72 20 74 68  ex does cover th
2e550 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
2e560 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65  and false if the
2e570 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f   pExpr expressio
2e580 6e 20 72 65 66 65 72 65 6e 63 65 73 20 74 61 62  n references tab
2e590 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74 68  le columns.** th
2e5a0 61 74 20 61 72 65 20 6e 6f 74 20 66 6f 75 6e 64  at are not found
2e5b0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70 49   in the index pI
2e5c0 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 64  dx..**.** An ind
2e5d0 65 78 20 63 6f 76 65 72 69 6e 67 20 61 6e 20 65  ex covering an e
2e5e0 78 70 72 65 73 73 69 6f 6e 20 6d 65 61 6e 73 20  xpression means 
2e5f0 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
2e600 69 6f 6e 20 63 61 6e 20 62 65 0a 2a 2a 20 65 76  ion can be.** ev
2e610 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20 6f 6e  aluated using on
2e620 6c 79 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ly the index and
2e630 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
2e640 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 0a 2a 2a  to lookup the.**
2e650 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2e660 61 62 6c 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 69  able entry..*/.i
2e670 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
2e680 76 65 72 65 64 42 79 49 6e 64 65 78 28 0a 20 20  veredByIndex(.  
2e690 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
2e6a0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2e6b0 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 2a 2f   to be tested */
2e6c0 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
2e6d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2e6e0 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
2e6f0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2e700 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 6e 64  g table */.  Ind
2e710 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
2e720 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68   /* The index th
2e730 61 74 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  at might be used
2e740 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f   for coverage */
2e750 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  .){.  Walker w;.
2e760 20 20 73 74 72 75 63 74 20 49 64 78 43 6f 76 65    struct IdxCove
2e770 72 20 78 63 6f 76 3b 0a 20 20 6d 65 6d 73 65 74  r xcov;.  memset
2e780 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
2e790 29 29 3b 0a 20 20 78 63 6f 76 2e 69 43 75 72 20  ));.  xcov.iCur 
2e7a0 3d 20 69 43 75 72 3b 0a 20 20 78 63 6f 76 2e 70  = iCur;.  xcov.p
2e7b0 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 77 2e  Idx = pIdx;.  w.
2e7c0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2e7d0 65 78 70 72 49 64 78 43 6f 76 65 72 3b 0a 20 20  exprIdxCover;.  
2e7e0 77 2e 75 2e 70 49 64 78 43 6f 76 65 72 20 3d 20  w.u.pIdxCover = 
2e7f0 26 78 63 6f 76 3b 0a 20 20 73 71 6c 69 74 65 33  &xcov;.  sqlite3
2e800 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
2e810 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77  pr);.  return !w
2e820 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  .eCode;.}.../*.*
2e830 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2e840 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2e850 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
2e860 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61 6c   by the tree wal
2e870 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20  ker.** to count 
2e880 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
2e890 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ble columns in t
2e8a0 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20  he arguments of 
2e8b0 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65  an .** aggregate
2e8c0 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72   function, in or
2e8d0 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  der to implement
2e8e0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46   the.** sqlite3F
2e8f0 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29  unctionThisSrc()
2e900 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72   routine..*/.str
2e910 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20  uct SrcCount {. 
2e920 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
2e930 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75    /* One particu
2e940 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  lar FROM clause 
2e950 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65 72  in a nested quer
2e960 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73  y */.  int nThis
2e970 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2e980 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2e990 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53  to columns in pS
2e9a0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  rcList */.  int 
2e9b0 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20  nOther;      /* 
2e9c0 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
2e9d0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
2e9e0 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  in other FROM cl
2e9f0 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  auses */.};../*.
2ea00 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
2ea10 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2ea20 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  s to columns..*/
2ea30 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
2ea40 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20  SrcCount(Walker 
2ea50 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2ea60 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65  pExpr){.  /* The
2ea70 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20   NEVER() on the 
2ea80 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62  second term is b
2ea90 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46 75  ecause sqlite3Fu
2eaa0 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
2eab0 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61  c().  ** is alwa
2eac0 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  ys called before
2ead0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2eae0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
2eaf0 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20  and so the.  ** 
2eb00 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20  TK_COLUMNs have 
2eb10 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e  not yet been con
2eb20 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41  verted into TK_A
2eb30 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20  GG_COLUMN.  If. 
2eb40 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74   ** sqlite3Funct
2eb50 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29  ionUsesThisSrc()
2eb60 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72 65   is used differe
2eb70 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75  ntly in the futu
2eb80 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56  re, the.  ** NEV
2eb90 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74  ER() will need t
2eba0 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f  o be removed. */
2ebb0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2ebc0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e  ==TK_COLUMN || N
2ebd0 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  EVER(pExpr->op==
2ebe0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29  TK_AGG_COLUMN) )
2ebf0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2ec00 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74   struct SrcCount
2ec10 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75   *p = pWalker->u
2ec20 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20  .pSrcCount;.    
2ec30 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
2ec40 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e 74  p->pSrc;.    int
2ec50 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20 70   nSrc = pSrc ? p
2ec60 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20  Src->nSrc : 0;. 
2ec70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
2ec80 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
2ec90 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
2eca0 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43  e==pSrc->a[i].iC
2ecb0 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
2ecc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e     }.    if( i<n
2ecd0 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Src ){.      p->
2ece0 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nThis++;.    }el
2ecf0 73 65 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 7c  se if( nSrc==0 |
2ed00 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c  | pExpr->iTable<
2ed10 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
2ed20 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  or ){.      /* I
2ed30 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
2ed40 70 61 72 73 65 20 74 72 65 65 20 28 6e 6f 20 6e  parse tree (no n
2ed50 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 65  ame resolution e
2ed60 72 72 6f 72 73 29 2c 0a 20 20 20 20 20 20 2a 2a  rrors),.      **
2ed70 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2ed80 20 77 69 74 68 20 73 6d 61 6c 6c 65 72 20 45 78   with smaller Ex
2ed90 70 72 2e 69 54 61 62 6c 65 20 76 61 6c 75 65 73  pr.iTable values
2eda0 20 61 72 65 20 69 6e 20 61 6e 0a 20 20 20 20 20   are in an.     
2edb0 20 2a 2a 20 6f 75 74 65 72 20 63 6f 6e 74 65 78   ** outer contex
2edc0 74 2e 20 20 54 68 6f 73 65 20 61 72 65 20 74 68  t.  Those are th
2edd0 65 20 6f 6e 6c 79 20 6f 6e 65 73 20 74 6f 20 63  e only ones to c
2ede0 6f 75 6e 74 20 61 73 20 22 6f 74 68 65 72 22 20  ount as "other" 
2edf0 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68  */.      p->nOth
2ee00 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  er++;.    }.  }.
2ee10 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2ee20 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2ee30 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79  Determine if any
2ee40 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
2ee50 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46  s to the pExpr F
2ee60 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63  unction referenc
2ee70 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20  e.** pSrcList.  
2ee80 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
2ee90 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65  hey do.  Also re
2eea0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
2eeb0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
2eec0 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72   no arguments or
2eed0 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61   has only consta
2eee0 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
2eef0 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70  eturn false if p
2ef00 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63  Expr.** referenc
2ef10 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e  es columns but n
2ef20 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61  ot columns of ta
2ef30 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53  bles found in pS
2ef40 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73  rcList..*/.int s
2ef50 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
2ef60 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a  esThisSrc(Expr *
2ef70 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a  pExpr, SrcList *
2ef80 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c  pSrcList){.  Wal
2ef90 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
2efa0 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20  SrcCount cnt;.  
2efb0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
2efc0 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
2efd0 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ON );.  memset(&
2efe0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
2eff0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2f000 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75  ack = exprSrcCou
2f010 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
2f020 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
2f030 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b  3SelectWalkNoop;
2f040 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74  .  w.u.pSrcCount
2f050 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70   = &cnt;.  cnt.p
2f060 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a  Src = pSrcList;.
2f070 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b    cnt.nThis = 0;
2f080 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20  .  cnt.nOther = 
2f090 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  0;.  sqlite3Walk
2f0a0 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78  ExprList(&w, pEx
2f0b0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
2f0c0 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73  return cnt.nThis
2f0d0 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72  >0 || cnt.nOther
2f0e0 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ==0;.}../*.** Ad
2f0f0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
2f100 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
2f110 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
2f120 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
2f130 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
2f140 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
2f150 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
2f160 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
2f170 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2f180 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
2f190 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
2f1a0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
2f1b0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
2f1c0 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
2f1d0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
2f1e0 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
2f1f0 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
2f200 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
2f210 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
2f220 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
2f230 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  umn,.       &i. 
2f240 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
2f250 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
2f260 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
2f270 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
2f280 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
2f290 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
2f2a0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
2f2b0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
2f2c0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
2f2d0 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
2f2e0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2f2f0 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
2f300 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
2f310 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
2f320 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
2f330 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
2f340 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
2f350 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
2f360 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
2f370 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
2f380 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
2f390 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
2f3a0 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  unc,.       &i. 
2f3b0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
2f3c0 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  }    ../*.** Thi
2f3d0 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61  s is the xExprCa
2f3e0 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65  llback for a tre
2f3f0 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73  e walker.  It is
2f400 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c   used to.** impl
2f410 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70  ement sqlite3Exp
2f420 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2f430 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74  es().  See sqlit
2f440 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2f450 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61  regates.** for a
2f460 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
2f470 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
2f480 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
2f490 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57  egate(Walker *pW
2f4a0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
2f4b0 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
2f4c0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
2f4d0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
2f4e0 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  C;.  Parse *pPar
2f4f0 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
2f500 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
2f510 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
2f520 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f  cList;.  AggInfo
2f530 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43   *pAggInfo = pNC
2f540 2d 3e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 3b 0a  ->uNC.pAggInfo;.
2f550 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
2f560 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55 41 67  ncFlags & NC_UAg
2f570 67 49 6e 66 6f 20 29 3b 0a 20 20 73 77 69 74 63  gInfo );.  switc
2f580 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
2f590 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
2f5a0 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
2f5b0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
2f5c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
2f5d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
2f5e0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
2f5f0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
2f600 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
2f610 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ;.      /* Check
2f620 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
2f630 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
2f640 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
2f650 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
2f660 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
2f670 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
2f680 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
2f690 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30  WAYS(pSrcList!=0
2f6a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ) ){.        str
2f6b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2f6c0 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69   *pItem = pSrcLi
2f6d0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66  st->a;.        f
2f6e0 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
2f6f0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
2f700 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2f710 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
2f720 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20  o_col *pCol;.   
2f730 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2f740 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2f750 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
2f760 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
2f770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2f780 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
2f790 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29  pItem->iCursor )
2f7a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2f7b0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
2f7c0 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
2f7d0 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66  s that pExpr ref
2f7e0 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20  ers to a table. 
2f7f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
2f800 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f  at is in the FRO
2f810 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
2f820 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
2f830 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a    .            *
2f840 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
2f850 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   Make an entry f
2f860 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  or the column in
2f870 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2f880 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  ] if there.     
2f890 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
2f8a0 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20   an entry there 
2f8b0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20  already..       
2f8c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2f8d0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
2f8e0 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41         pCol = pA
2f8f0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20  ggInfo->aCol;.  
2f900 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
2f910 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; k<pAggInfo->n
2f920 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f  Column; k++, pCo
2f930 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
2f940 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54      if( pCol->iT
2f950 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
2f960 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
2f970 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
2f980 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
2f990 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2f9a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2f9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2f9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2f9d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2f9e0 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  k>=pAggInfo->nCo
2f9f0 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20  lumn).          
2fa00 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67     && (k = addAg
2fa10 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  gInfoColumn(pPar
2fa20 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
2fa30 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ))>=0 .         
2fa40 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2fa50 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67      pCol = &pAgg
2fa60 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20  Info->aCol[k];. 
2fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2fa80 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  l->pTab = pExpr-
2fa90 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  >y.pTab;.       
2faa0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
2fab0 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
2fac0 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
2fad0 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
2fae0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
2faf0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
2fb00 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b   pCol->iMem = ++
2fb10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2fb20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
2fb30 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
2fb40 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
2fb50 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
2fb60 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
2fb70 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
2fb80 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
2fb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fba0 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
2fbb0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
2fbc0 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
2fbd0 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
2fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2fbf0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2fc00 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
2fc10 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
2fc20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
2fc30 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
2fc40 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2fc50 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
2fc60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2fc70 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
2fc80 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
2fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2fca0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
2fcb0 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
2fcc0 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
2fcd0 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
2fce0 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
2fcf0 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
2fd00 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2fd20 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
2fd30 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
2fd40 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2fd50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2fd60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2fd70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fd80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fd90 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2fda0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
2fdb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2fdc0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
2fdd0 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
2fde0 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
2fdf0 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
2fe00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2fe10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
2fe20 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
2fe30 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
2fe40 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
2fe50 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
2fe60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
2fe70 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
2fe80 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
2fe90 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
2fea0 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
2feb0 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
2fec0 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
2fed0 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
2fee0 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
2fef0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
2ff00 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2ff10 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
2ff20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2ff30 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
2ff40 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2ff50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
2ff60 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
2ff70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
2ff80 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
2ff90 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
2ffa0 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
2ffb0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
2ffc0 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20  gg = (i16)k;.   
2ffd0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2ffe0 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
2fff0 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62  ndif pExpr->iTab
30000 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
30010 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20  or */.        } 
30020 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* end loop over
30030 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20   pSrcList */.   
30040 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
30050 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
30060 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
30070 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
30080 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e       if( (pNC->n
30090 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67  cFlags & NC_InAg
300a0 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20  gFunc)==0.      
300b0 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c   && pWalker->wal
300c0 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d  kerDepth==pExpr-
300d0 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20  >op2.      ){.  
300e0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
300f0 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
30100 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
30110 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
30120 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
30130 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
30140 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
30150 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
30160 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
30170 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
30180 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
30190 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
301a0 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
301b0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
301c0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
301d0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
301e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
301f0 6f 6d 70 61 72 65 28 30 2c 20 70 49 74 65 6d 2d  ompare(0, pItem-
30200 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d  >pExpr, pExpr, -
30210 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
30220 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30240 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
30250 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  =pAggInfo->nFunc
30260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
30270 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e   pExpr is origin
30280 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20  al.  Make a new 
30290 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66  entry in pAggInf
302a0 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20  o->aFunc[].     
302b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
302c0 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
302d0 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
302e0 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67        i = addAgg
302f0 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d  InfoFunc(pParse-
30300 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a  >db, pAggInfo);.
30310 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
30320 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
30330 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
30340 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
30350 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
30360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
30370 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
30380 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
30390 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
303a0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
303b0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
303c0 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
303d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
303e0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
303f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
30400 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
30410 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
30420 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
30430 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
30440 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
30450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30460 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
30470 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  n, .            
30480 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
30490 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78  pList ? pExpr->x
304a0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  .pList->nExpr : 
304b0 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
304c0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
304d0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  r->flags & EP_Di
304e0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
304f0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
30500 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
30510 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
30520 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30530 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
30540 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  m->iDistinct = -
30550 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
30560 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
30580 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69  * Make pExpr poi
30590 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  nt to the approp
305a0 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e  riate pAggInfo->
305b0 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20  aFunc[] entry.  
305c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
305d0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
305e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
305f0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
30600 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
30610 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
30620 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
30630 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
30640 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
30650 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20   = (i16)i;.     
30660 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
30670 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
30680 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
30690 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
306a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
306b0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
306c0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
306d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
306e0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
306f0 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
30700 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
30710 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ct(Walker *pWalk
30720 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
30730 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ect){.  UNUSED_P
30740 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74  ARAMETER(pSelect
30750 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 77 61  );.  pWalker->wa
30760 6c 6b 65 72 44 65 70 74 68 2b 2b 3b 0a 20 20 72  lkerDepth++;.  r
30770 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
30780 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ue;.}.static voi
30790 64 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  d analyzeAggrega
307a0 74 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 28 57  tesInSelectEnd(W
307b0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
307c0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
307d0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
307e0 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20  ETER(pSelect);. 
307f0 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72   pWalker->walker
30800 44 65 70 74 68 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a  Depth--;.}../*.*
30810 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45  * Analyze the pE
30820 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  xpr expression l
30830 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
30840 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
30850 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
30860 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
30870 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67 67   be added to Agg
30880 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  Info object that
30890 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a   pNC->pAggInfo.*
308a0 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64  * points to.  Ad
308b0 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
308c0 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65   are made on the
308d0 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
308e0 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e  as.** necessary.
308f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
30900 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
30910 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
30920 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
30930 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
30940 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65  zed by sqlite3Re
30950 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
30960 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
30970 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
30980 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65  egates(NameConte
30990 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70  xt *pNC, Expr *p
309a0 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
309b0 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
309c0 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
309d0 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65  gregate;.  w.xSe
309e0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61  lectCallback = a
309f0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
30a00 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 78 53  InSelect;.  w.xS
30a10 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
30a20 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
30a30 65 73 49 6e 53 65 6c 65 63 74 45 6e 64 3b 0a 20  esInSelectEnd;. 
30a40 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68 20 3d   w.walkerDepth =
30a50 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20   0;.  w.u.pNC = 
30a60 70 4e 43 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  pNC;.  w.pParse 
30a70 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
30a80 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20  NC->pSrcList!=0 
30a90 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  );.  sqlite3Walk
30aa0 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
30ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
30ac0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
30ad0 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f  eAggregates() fo
30ae0 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
30af0 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72  on in an.** expr
30b00 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65  ession list.  Re
30b10 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
30b20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
30b30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
30b40 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79  found, the analy
30b50 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74  sis is cut short
30b60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
30b70 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
30b80 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ist(NameContext 
30b90 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a  *pNC, ExprList *
30ba0 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74  pList){.  struct
30bb0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
30bc0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
30bd0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
30be0 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69     for(pItem=pLi
30bf0 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
30c00 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
30c10 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
30c20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
30c30 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e  yzeAggregates(pN
30c40 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  C, pItem->pExpr)
30c50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
30c60 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
30c70 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73  single new regis
30c80 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68  ter for use to h
30c90 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65  old some interme
30ca0 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f  diate result..*/
30cb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
30cc0 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
30cd0 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
30ce0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30  rse->nTempReg==0
30cf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b   ){.    return +
30d00 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
30d10 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72   }.  return pPar
30d20 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70  se->aTempReg[--p
30d30 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d  Parse->nTempReg]
30d40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
30d50 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72  ocate a register
30d60 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62  , making availab
30d70 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72  le for reuse for
30d80 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
30d90 75 72 70 6f 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  urpose..*/.void 
30da0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
30db0 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
30dc0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
30dd0 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50    if( iReg && pP
30de0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
30df0 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
30e00 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
30e10 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
30e20 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
30e30 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
30e40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
30e50 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
30e60 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
30e70 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
30e80 65 67 69 73 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74  egisters..*/.int
30e90 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
30ea0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
30eb0 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  se, int nReg){. 
30ec0 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28   int i, n;.  if(
30ed0 20 6e 52 65 67 3d 3d 31 20 29 20 72 65 74 75 72   nReg==1 ) retur
30ee0 6e 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  n sqlite3GetTemp
30ef0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
30f00 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67   = pParse->iRang
30f10 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72  eReg;.  n = pPar
30f20 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20  se->nRangeReg;. 
30f30 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a   if( nReg<=n ){.
30f40 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
30f50 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20  geReg += nReg;. 
30f60 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
30f70 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20  eReg -= nReg;.  
30f80 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70  }else{.    i = p
30f90 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
30fa0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
30fb0 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72  += nReg;.  }.  r
30fc0 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20  eturn i;.}.void 
30fd0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
30fe0 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
30ff0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
31000 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66   int nReg){.  if
31010 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nReg==1 ){.   
31020 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
31030 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
31040 52 65 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Reg);.    return
31050 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 67  ;.  }.  if( nReg
31060 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  >pParse->nRangeR
31070 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  eg ){.    pParse
31080 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52  ->nRangeReg = nR
31090 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
310a0 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67  iRangeReg = iReg
310b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
310c0 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72  ark all temporar
310d0 79 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62  y registers as b
310e0 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65  eing unavailable
310f0 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2a 0a 2a   for reuse..**.*
31100 2a 20 41 6c 77 61 79 73 20 69 6e 76 6f 6b 65 20  * Always invoke 
31110 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 61  this procedure a
31120 66 74 65 72 20 63 6f 64 69 6e 67 20 61 20 73 75  fter coding a su
31130 62 72 6f 75 74 69 6e 65 20 6f 72 20 63 6f 2d 72  broutine or co-r
31140 6f 75 74 69 6e 65 0a 2a 2a 20 74 68 61 74 20 6d  outine.** that m
31150 69 67 68 74 20 62 65 20 69 6e 76 6f 6b 65 64 20  ight be invoked 
31160 66 72 6f 6d 20 6f 74 68 65 72 20 70 61 72 74 73  from other parts
31170 20 6f 66 20 74 68 65 20 63 6f 64 65 2c 20 74 6f   of the code, to
31180 20 65 6e 73 75 72 65 20 74 68 61 74 0a 2a 2a 20   ensure that.** 
31190 74 68 65 20 73 75 62 2f 63 6f 2d 72 6f 75 74 69  the sub/co-routi
311a0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ne does not use 
311b0 72 65 67 69 73 74 65 72 73 20 69 6e 20 63 6f 6d  registers in com
311c0 6d 6f 6e 20 77 69 74 68 20 74 68 65 20 63 6f 64  mon with the cod
311d0 65 20 74 68 61 74 0a 2a 2a 20 69 6e 76 6f 6b 65  e that.** invoke
311e0 73 20 74 68 65 20 73 75 62 2f 63 6f 2d 72 6f 75  s the sub/co-rou
311f0 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tine..*/.void sq
31200 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
31210 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  gCache(Parse *pP
31220 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
31230 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  >nTempReg = 0;. 
31240 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
31250 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg = 0;.}../*.**
31260 20 56 61 6c 69 64 61 74 65 20 74 68 61 74 20 6e   Validate that n
31270 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  o temporary regi
31280 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68 69  ster falls withi
31290 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a  n the range of.*
312a0 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c  * iFirst..iLast,
312b0 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68 69   inclusive.  Thi
312c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
312d0 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74 68  y call from with
312e0 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73  in assert().** s
312f0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69  tatements..*/.#i
31300 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
31310 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 54  G.int sqlite3NoT
31320 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72 73  empsInRange(Pars
31330 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
31340 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73 74  First, int iLast
31350 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
31360 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  ( pParse->nRange
31370 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61 72  Reg>0.   && pPar
31380 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70 50  se->iRangeReg+pP
31390 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
313a0 3e 20 69 46 69 72 73 74 0a 20 20 20 26 26 20 70  > iFirst.   && p
313b0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
313c0 20 3c 3d 20 69 4c 61 73 74 0a 20 20 29 7b 0a 20   <= iLast.  ){. 
313d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
313e0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
313f0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b  Parse->nTempReg;
31400 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
31410 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
31420 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50  i]>=iFirst && pP
31430 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
31440 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  ]<=iLast ){.    
31450 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
31460 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
31470 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
31480 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a        LITE_DEBUG */.